vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 45
声望: 0

description

请问,标准合约,开仓的时候是一个合约,而成交推送的时候是两个合约,会造成持仓混乱,请问应该如何处理

Administrator
avatar
加入于:
帖子: 1468
声望: 69

什么叫做标准合约成交会推送两个??具体做的什么接口和品种

Member
avatar
加入于:
帖子: 45
声望: 0

期货里大商所和郑商所的标准套利合约
比如开多单SP m1905&m1909, 这是一个标准套利合约
但是成交的推送单子却显示 多m1905和空m1909两个单子的成交,
所以持仓很容易混乱

Member
avatar
加入于:
帖子: 58
声望: 7

class CtaEngine(AppEngine):

#----------------------------------------------------------------------
def __init__(self, mainEngine, eventEngine):
    #非主力合约持仓
    self.NotActivePos = 0

----------------------------------------------------------------------

def processTradeEvent(self, event):
    """处理成交推送"""
    trade = event.dict_['data']

    # 过滤已经收到过的成交回报
    if trade.vtTradeID in self.tradeSet:
        return
    self.tradeSet.add(trade.vtTradeID)

    # 将成交推送到策略对象中
    if trade.vtOrderID in self.orderStrategyDict:
        strategy = self.orderStrategyDict[trade.vtOrderID]                        
        if trade.vtSymbol == strategy.vtSymbol:     
            # 计算策略持仓                
            if trade.direction == DIRECTION_LONG:
                strategy.pos += trade.volume
            else:
                strategy.pos -= trade.volume                
            self.callStrategyFunc(strategy, strategy.onTrade, trade)
            # 保存策略持仓到数据库
            self.saveSyncData(strategy) 
            content = f'策略{strategy.name}同步数据保存成功,交易合约:{trade.vtSymbol},当前持仓{strategy.pos}'
            self.writeCtaLog(content)
        else:
            strategy.vtSymbol = trade.vtSymbol
            # 计算非主力合约持仓
            if trade.direction == DIRECTION_LONG:
                self.NotActivePos += trade.volume
            else:
                self.NotActivePos -= trade.volume  
            self.callStrategyFunc(strategy, strategy.onTrade, trade) 
            #保存非主力合约仓位数据
            """保存策略的持仓情况到数据库"""
            flt = {'name': strategy.name,
                   'vtSymbol': trade.vtSymbol}

            PosData = copy(flt)
            for key in strategy.syncList:
                if key == 'pos':
                    PosData['pos'] = self.NotActivePos
                else:
                    PosData[key] = strategy.__getattribute__(key)

            self.mainEngine.dbUpdate(POSITION_DB_NAME, strategy.className,
                                     PosData, flt, True)

            content = f'策略{strategy.name}同步数据保存成功,交易合约标的:{trade.vtSymbol},标的持仓:{self.NotActivePos}'
            self.writeCtaLog(content) 
Member
avatar
加入于:
帖子: 45
声望: 0

谢谢!!开盘我试一下,也想了一个办法,就是把self.pos的计算写到 processOrderEvent里,等待验证哈!

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3