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

本地单委托怎么撤销?cancel_all有用?我怎么感觉没有用

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

您好!关于您提到的 cancel_all 方法无效的问题,我们可以通过以下步骤进行排查和解决。请您按照以下方法逐步检查,并提供相关信息以便我们更好地协助您。


1. 确认问题

为了更好地定位问题,请您提供以下信息:

  1. 策略代码:特别是 cancel_all 方法的调用部分。
  2. 日志截图:包括 VeighNa Trader 主界面的日志输出。
  3. 操作步骤:您是如何调用 cancel_all 的(例如,通过按钮、策略逻辑等)。

2. 排查步骤

步骤 1:检查 cancel_all 调用

请确保 cancel_all 方法被正确调用。例如:

def on_tick(self, tick):
    """Tick 更新回调"""
    if self.should_cancel_all:  # 某个条件触发
        self.cancel_all()

步骤 2:打印调试信息

cancel_all 方法中添加打印语句,确认方法是否被调用:

def cancel_all(self):
    """撤销所有未成交委托"""
    print("调用 cancel_all 方法")
    self.cancel_all()

步骤 3:检查活动委托

cancel_all 方法中,打印当前活动委托,确认是否有未成交的委托:

def cancel_all(self):
    """撤销所有未成交委托"""
    active_orders = self.cta_engine.main_engine.get_all_active_orders()
    print(f"当前活动委托: {active_orders}")
    for order in active_orders:
        if order.status == Status.SUBMITTING or order.status == Status.NOTTRADED:
            self.cancel_order(order.vt_orderid)
            print(f"撤销委托: {order.vt_orderid}")

步骤 4:检查委托状态

确保委托状态为 SUBMITTINGNOTTRADED,只有这些状态的委托才能被撤销。


3. 常见问题及解决方法

问题 1:cancel_all 未被调用

  • 原因:触发条件未满足,或方法未被正确调用。
  • 解决方法:检查策略逻辑,确保 cancel_all 在正确的位置被调用。

问题 2:没有活动委托

  • 原因:所有委托已成交或已被撤销。
  • 解决方法:在 cancel_all 中打印活动委托,确认是否有未成交的委托。

问题 3:委托状态不正确

  • 原因:委托状态不是 SUBMITTINGNOTTRADED
  • 解决方法:检查委托状态,确保只有未成交的委托被撤销。

4. 示例代码

以下是一个完整的策略示例,包含 cancel_all 方法的调试信息:

from vnpy.trader.constant import Status
from vnpy.trader.object import OrderData
from vnpy_ctastrategy import CtaTemplate

class MyStrategy(CtaTemplate):
    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)
        self.should_cancel_all = False

    def on_tick(self, tick):
        """Tick 更新回调"""
        if self.should_cancel_all:  # 某个条件触发
            self.cancel_all()

    def cancel_all(self):
        """撤销所有未成交委托"""
        print("调用 cancel_all 方法")
        active_orders = self.cta_engine.main_engine.get_all_active_orders()
        print(f"当前活动委托: {active_orders}")
        for order in active_orders:
            if order.status == Status.SUBMITTING or order.status == Status.NOTTRADED:
                self.cancel_order(order.vt_orderid)
                print(f"撤销委托: {order.vt_orderid}")

5. 总结

  • 通过打印调试信息,确认 cancel_all 方法是否被调用。
  • 检查活动委托和委托状态,确保只有未成交的委托被撤销。
  • 如果问题仍然存在,请提供策略代码和日志截图,以便我们进一步排查。

通过以上方法,可以有效地排查和解决 cancel_all 无效的问题。如果有其他问题,欢迎继续讨论!

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

沪公网安备 31011502017034号

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