vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 43
声望: 0

实际测试发现无法工作,帮忙看下问题在哪?

def on_order(self, order: OrderData):
    """
    Callback of new order data update.
    """
    if self.need_close == True and order.status == Status.CANCELLED:
        self.need_close = False
        if self.pos > 0:
            self.sell(self.commit_price, abs(self.pos))
            self.write_log(f"【多平】委托价:{self.commit_price}  委托量:{abs(self.pos)}")
        elif self.pos < 0:
            self.cover(self.commit_price, abs(self.pos))
            self.write_log(f"【空平】委托价:{self.commit_price}  委托量:{abs(self.pos)}")

    self.put_event()
Administrator
avatar
加入于:
帖子: 3902
声望: 208

是回测还是实盘中的问题?代码逻辑上看不出什么,说明下预期行为、实际行为?

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

我用的2.0.8版本,是回测中的问题,实盘还没试。
我做的是短线交易。

  1. 在on_trade中探测到开仓的成交回报,立即挂止盈单。止损的时候显然应该先撤单,所以不方便直接使用停止单止损。
  2. on_tick中探测到现价到止损价,先调用self.cancel_all()撤销前面的挂单。
  3. 然后就是on_order中这段代码,探测到撤单成功,则重新下单止损。

预期行为:进入on_order,探测到撤单成功,重新下单止损。
实际行为:未进入on_order。
怀疑点:回测是不是进不去on_order?实盘能进?

Administrator
avatar
加入于:
帖子: 3902
声望: 208

回测会撤单一定会进入on_order,在on_order函数里加个print函数就可以看出来了,实盘更会了。

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

我查到一个奇怪的现象,开仓成交后我再on_trade中马上挂止盈单,但是on_order中马上给我一个NOTTRADED+CANCELLED,这是什么原因啊?
代码如下:

def on_trade(self, trade: TradeData):
    """
    Callback of new trade data update.
    """
    if trade.direction == Direction.LONG and trade.offset == Offset.OPEN:
        self.sell(self.long_take_profit, abs(self.pos))

......

Administrator
avatar
加入于:
帖子: 3902
声望: 208

请检查你的on_bar函数头部是否调用了cancel_all,以及如果是拒单,主界面的日志里会有拒单原因

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

不错

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