VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 20
声望: 2

目前用的是2.9版本的脚本策略,我想要在集合竞价的时候平掉股指期货的对锁单,但是出现了成交编号相同的情况,也就是成交编号为277的那一笔是自成交。用get_order可以看到两笔订单都是成交了4手的,但是用get_trade会发现自成交的那一手只记录在了其中一边的信息之中,这会导致我更新本地仓位时出现问题,应该怎么解决呢?
description

description

Member
avatar
加入于:
帖子: 3583
声望: 234

脚本策略模板的get_position函数是获取的底层持仓,不会出错的

Member
avatar
加入于:
帖子: 20
声望: 2

xiaohe wrote:

脚本策略模板的get_position函数是获取的底层持仓,不会出错的
这个我知道,不过是多个策略在跑,所以还是得在本地做一下记录,区分清楚。主要是想问下这个问题怎么处理?是因为每一个成交订单都只会推送一次,所以对应的时候缺了一边吗?

Member
avatar
加入于:
帖子: 20
声望: 2

看了一下源码,这里取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
Member
avatar
加入于:
帖子: 20
声望: 2

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 之后,重连之后查询成交就得到两笔成交了。
description

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

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】