VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 34
声望: 0

请教一下各位大佬
目前我有一个想法 是在on trade函数中获取对应的开仓成交价格,但现在send_order 中加入了 lock 锁仓模式,那么on trade收到的回报 用开平仓判断是否是开仓的成交价格就不准确了,请问有没有什么好的办法在 ontrade 中获取开仓成交价格?在lock下也可以区分呢?

Super Moderator
avatar
加入于:
帖子: 77
声望: 7

在锁仓模式下,on_trade中通过trade.offset判断开仓或平仓会失效,因为平仓操作会被转换为反向开仓。以下是两种简洁的方法来准确获取开仓成交价格:


方法 1:通过策略持仓状态判断

  • on_trade中,通过策略的持仓状态来判断是否为开仓操作。
  • 示例代码:
    def on_trade(self, trade: TradeData) -> None:
        if trade.direction == Direction.LONG:  # 多头方向
            if self.pos == 0:  # 开仓前无持仓
                self.long_entry = trade.price
                print(f"多头开仓价格: {self.long_entry}")
        else:  # 空头方向
            if self.pos == 0:  # 开仓前无持仓
                self.short_entry = trade.price
                print(f"空头开仓价格: {self.short_entry}")
    

方法 2:通过OrderDataTradeData关联

  • on_order中记录委托的开平仓信息,然后在on_trade中通过vt_orderid关联OrderDataTradeData,从而判断是否为开仓操作。
  • 示例代码:

    def on_order(self, order: OrderData) -> None:
        if order.offset == Offset.OPEN:  # 记录开仓委托
            self.open_orders[order.vt_orderid] = order
    
    def on_trade(self, trade: TradeData) -> None:
        if trade.vt_orderid in self.open_orders:  # 判断是否为开仓成交
            if trade.direction == Direction.LONG:  # 多头开仓
                self.long_entry = trade.price
                print(f"多头开仓价格: {self.long_entry}")
            else:  # 空头开仓
                self.short_entry = trade.price
                print(f"空头开仓价格: {self.short_entry}")
    

总结

  • 方法 1:通过策略持仓状态判断开仓操作,适用于简单场景。
  • 方法 2:通过OrderDataTradeData关联判断开仓操作,适用于更复杂的场景。

希望这些方法能帮助你解决问题!如果还有其他疑问,欢迎继续提问。

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

谢谢,有一点不是很理解? on order 是收到委托回报,按理说我发到交易所的时候,我的order里面的offset不是已经修改了吗? 那我收到的order不是应该也会变化?

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

沪公网安备 31011502017034号

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