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

在on_bar里,记录了order_id = self.buy(long_price, self.trade_amount1)
请问如何在on_trade的回调函数里,确定这个指定的order_id是否有完全成交?

Member
avatar
加入于:
帖子: 5277
声望: 317

on_order会收到委托回报,有status(委托状态)
如果非要在on_trade下判断,可以在on_order缓存order,在on_trade通过TradeData上的orderid去get_order查看委托状态

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

xiaohe wrote:

on_order会收到委托回报,有status(委托状态)
如果非要在on_trade下判断,可以在on_order缓存order,在on_trade通过TradeData上的orderid去get_order查看委托状
哦对,是on_order下判断order_id是否成交才对
请问在on_order下,要怎么写status是否完全成交?我在论坛上没有找到案例

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

我在on_order里这样写
if order.status == Status.ALLTRADED:
报错:
File "C:\Users\Administrator\strategies\Strategy_Short_term_delta.py", line 357, in on_order
if order.status == Status.ALLTRADED:
NameError: name 'status' is not defined

正确的写法应该是怎样?

Member
avatar
加入于:
帖子: 5277
声望: 317

没在策略头部加载Status类
from vnpy.trader.object import Status

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

跑通了,谢谢老师

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

请问老师怎么使用on_order来查看order.status啊,没有找到调取on_order关于这个写法的案例,谢谢老师!

Super Moderator
avatar
加入于:
帖子: 20
声望: 3

在VeighNa量化交易平台中,on_order是一个回调函数,用于处理委托订单状态更新事件。你可以通过order.status来查看订单的当前状态。以下是一个简单的示例代码,展示如何在on_order函数中查看订单状态:

def on_order(self, order: OrderData) -> None:
    """
    委托状态更新回调函数

    参数:
        order (OrderData): 委托订单对象
    """
    # 打印订单状态
    print(f"订单状态更新: {order.status}")

    # 根据订单状态执行不同的逻辑
    if order.status == Status.SUBMITTING:
        print("订单正在提交中...")
    elif order.status == Status.NOTTRADED:
        print("订单未成交")
    elif order.status == Status.PARTTRADED:
        print("订单部分成交")
    elif order.status == Status.ALLTRADED:
        print("订单全部成交")
    elif order.status == Status.CANCELLED:
        print("订单已撤销")
    elif order.status == Status.REJECTED:
        print("订单被拒绝")

关键点说明:

  1. order.status:这是OrderData对象的一个属性,用于获取订单的当前状态。
  2. Status枚举类Status是一个枚举类,包含了订单的所有可能状态,如SUBMITTING(提交中)、NOTTRADED(未成交)、PARTTRADED(部分成交)等。

使用场景:

  • 你可以在on_order函数中根据订单状态执行不同的逻辑,例如记录日志、更新策略状态或触发其他操作。

注意事项:

  • on_order函数会在每次订单状态更新时被调用,因此你可以实时监控订单的状态变化。
  • 如果订单状态不需要特殊处理,可以直接pass,将具体逻辑交给回测/实盘引擎处理。

希望这个示例能帮助你理解如何使用on_order来查看订单状态!

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

strategytemplate里好像没有on_order,请问可以将ctatemplate的on-order复制过去直接用吗?谢谢!

Super Moderator
avatar
加入于:
帖子: 20
声望: 3

StrategyTemplate(组合策略模板)中,确实没有on_order回调函数,因为组合策略的回测机制与CTA策略不同。不能直接将CtaTemplateon_order复制到StrategyTemplate中使用。以下是原因和替代方案:


1. 为什么StrategyTemplate没有on_order

  • 回测机制差异:组合策略回测时,无法精确模拟多合约订单的成交顺序,因此不提供on_orderon_trade回调。
  • 状态查询替代:组合策略通过get_orderget_pos方法查询订单和持仓状态,而不是通过回调函数。

2. 如何替代on_order的功能?

在组合策略中,可以通过以下方式实现类似on_order的功能:

2.1 查询订单状态

使用self.get_order(vt_orderid)方法查询订单状态。

def on_bars(self, bars: Dict[str, BarData]) -> None:
       for vt_orderid in self.active_orderids:  # 遍历活动订单
           order = self.get_order(vt_orderid)
           if order:
               print(f"订单状态: {order.status}, 数量: {order.volume}, 价格: {order.price}")

2.2 处理订单状态变化

在策略逻辑中,根据订单状态变化执行相应操作。

def on_bars(self, bars: Dict[str, BarData]) -> None:
       for vt_orderid in self.active_orderids:
           order = self.get_order(vt_orderid)
           if order and order.status == Status.ALLTRADED:  # 订单全部成交
               print(f"订单 {vt_orderid} 已全部成交")
           elif order and order.status == Status.CANCELLED:  # 订单已撤销
               print(f"订单 {vt_orderid} 已撤销")

3. 注意事项

  • 实盘与回测差异get_order方法在实盘和回测中均可使用,但回测时无法精确模拟多合约订单的成交顺序。
  • 性能优化:频繁查询订单状态可能影响策略性能,建议仅在必要时使用。

4. 示例代码

以下是一个完整的示例,展示如何在组合策略中替代on_order的功能:

def on_bars(self, bars: Dict[str, BarData]) -> None:
    # 查询活动订单状态
    for vt_orderid in self.active_orderids:
        order = self.get_order(vt_orderid)
        if order:
            print(f"订单 {vt_orderid} 状态: {order.status}, 数量: {order.volume}, 价格: {order.price}")
            if order.status == Status.ALLTRADED:  # 订单全部成交
                self.handle_order_traded(order)
            elif order.status == Status.CANCELLED:  # 订单已撤销
                self.handle_order_cancelled(order)

def handle_order_traded(self, order: OrderData) -> None:
    """处理订单全部成交"""
    print(f"订单 {order.vt_orderid} 已全部成交")

def handle_order_cancelled(self, order: OrderData) -> None:
    """处理订单撤销"""
    print(f"订单 {order.vt_orderid} 已撤销")

总结

  • 不能直接复制on_orderStrategyTemplate没有on_order回调,因其回测机制与CTA策略不同。
  • 替代方案:使用get_order方法查询订单状态,并在策略逻辑中处理状态变化。
  • 适用场景:适用于组合策略的实盘和回测,但需注意性能优化。

通过以上方法,可以在组合策略中实现类似on_order的功能。

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

沪公网安备 31011502017034号

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