目前用的是2.9版本的脚本策略,我想要在集合竞价的时候平掉股指期货的对锁单,但是出现了成交编号相同的情况,也就是成交编号为277的那一笔是自成交。用get_order可以看到两笔订单都是成交了4手的,但是用get_trade会发现自成交的那一手只记录在了其中一边的信息之中,这会导致我更新本地仓位时出现问题,应该怎么解决呢?
目前用的是2.9版本的脚本策略,我想要在集合竞价的时候平掉股指期货的对锁单,但是出现了成交编号相同的情况,也就是成交编号为277的那一笔是自成交。用get_order可以看到两笔订单都是成交了4手的,但是用get_trade会发现自成交的那一手只记录在了其中一边的信息之中,这会导致我更新本地仓位时出现问题,应该怎么解决呢?
脚本策略模板的get_position函数是获取的底层持仓,不会出错的
xiaohe wrote:
脚本策略模板的get_position函数是获取的底层持仓,不会出错的
这个我知道,不过是多个策略在跑,所以还是得在本地做一下记录,区分清楚。主要是想问下这个问题怎么处理?是因为每一个成交订单都只会推送一次,所以对应的时候缺了一边吗?
看了一下源码,这里取tradedata的时候是检查相同的orderid,但是在自成交的时候一个tradeid会对应两个orderid,这里处理成交推送的时候是用tradeid保存信息的,所以会导致其中一个orderid查到的trade少这一条。这么看的话如果底层保存的时候用tradeid和orderid做二元键应该可以避免这个问题?就是不知道自成交是否会推送两次数据?
def get_trades(self, vt_orderid: str, use_df: bool = False) -> Sequence[TradeData]:
""""""
trades: list = []
all_trades: List[TradeData] = self.main_engine.get_all_trades()
for trade in all_trades:
if trade.vt_orderid == vt_orderid:
trades.append(trade)
if not use_df:
return trades
else:
return to_df(trades)
def get_all_trades(self) -> List[TradeData]:
"""
Get all trade data.
"""
return list(self.trades.values())
def process_trade_event(self, event: Event) -> None:
""""""
trade: TradeData = event.data
self.trades[trade.vt_tradeid] = trade
miro wrote:
看了一下源码,这里取tradedata的时候是检查相同的orderid,但是在自成交的时候一个tradeid会对应两个orderid,这里处理成交推送的时候是用tradeid保存信息的,所以会导致其中一个orderid查到的trade少这一条。这么看的话如果底层保存的时候用tradeid和orderid做二元键应该可以避免这个问题?就是不知道自成交是否会推送两次数据?
def get_trades(self, vt_orderid: str, use_df: bool = False) -> Sequence[TradeData]: """""" trades: list = [] all_trades: List[TradeData] = self.main_engine.get_all_trades() for trade in all_trades: if trade.vt_orderid == vt_orderid: trades.append(trade) if not use_df: return trades else: return to_df(trades)
def get_all_trades(self) -> List[TradeData]: """ Get all trade data. """ return list(self.trades.values())
def process_trade_event(self, event: Event) -> None: """""" trade: TradeData = event.data self.trades[trade.vt_tradeid] = trade
好了,尝试了一下,把process_trade_event()修改了一下,改成 self.trades[(trade.vt_orderid,trade.vt_tradeid)]=trade 之后,重连之后查询成交就得到两笔成交了。