用Python的交易员 wrote:
CTA模块中,每个策略是基于自己发出的委托的成交回报,来计算当前该策略的逻辑仓位,和底层的账户仓位无关。
vn.py中的所有TradeData,都是增量成交部分的信息,所以是稳定数据,另外实盘不会依赖查询持仓来实时更新状态,最多用于定时同步。
最后的这个逻辑,在特定情境下是一种简化方案(超价下单,大概率都会最终全部成交),但是不具有普适性(下比当前价格低的买入限价单,可能很长时间才成交)。
撤单后再去下单2手,这个操作只要在收到撤单回报后再去下新的2收,就不可能出错。
----------------------------------------------------------------------
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.direction == DIRECTION_LONG:
strategy.pos += trade.volume
else:
strategy.pos -= trade.volume
self.callStrategyFunc(strategy, strategy.onTrade, trade)
# 保存策略持仓到数据库
self.saveSyncData(strategy)
是这段逻辑吧? 计算策略的仓位,但有一个问题就是我还没理解trade是如何保证是确认成交的 因为名字有点歧义,ctp本身的ontrade 不能用来处理 是不是在c++那部分 你增加了冗余的逻辑 保证了一定没有未成交单子飘在外面时候的成交 才会被推送回来?