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

1:老师您好,如下面代码所示,在on_trade回调函数中使用print总是报错,望回复,万分感激
代码如下:

    def on_trade(self, trade: TradeData):
        """
        Callback of new trade data update.
        """

        if trade.offset == Offset.CLOSE:
            self.bar_counts = 0
            print(bar.datetime, "bar_counts持仓周期计数器平仓归零")

报错如下:

  File "C:\Users\78405\Desktop\vnpy_20200624\vnpy\app\cta_strategy\backtesting.py", line 945, in cross_stop_order
    self.strategy.on_trade(trade)
  File "C:\Users\78405\strategies\AtrRsiStrategy_Thorn荆轮止损.py", line 239, in on_trade
    print(bar.datetime, "bar_counts持仓周期计数器平仓归零")
NameError: name 'bar' is not defined

2:在on_bar中使用这句代码print(bar.datetime, "bar_counts持仓周期计数器平仓归零")不会报错,是因为不能在on_trade中使用吗?

Administrator
avatar
加入于:
帖子: 4138
声望: 230
  1. on_trade这个回调函数都没有推送bar,你直接访问这个变量肯定找不到了
  2. on_bar推送了bar,你要在on_trade里访问就要自己缓存下,这个是基础Python语法的问题了
Member
avatar
加入于:
帖子: 154
声望: 0

用Python的交易员 wrote:

  1. on_trade这个回调函数都没有推送bar,你直接访问这个变量肯定找不到了
  2. on_bar推送了bar,你要在on_trade里访问就要自己缓存下,这个是基础Python语法的问题了

老师您好,实在不好意思,给您添麻烦了,我基础比较差,您可以指导一下我吗?万分感激,望回复

Member
avatar
加入于:
帖子: 794
声望: 40
  1. 如果你想要的是on_bar里的bar.datetime,你可以在on_bar里写一个self.datetime = bar.datetime,然后在on_trade里调用self.datetime就可以了。
  2. 如果你想要的是on_trade成交时的datetime,就print(trade.datetime, "bar_counts持仓周期计数器平仓归零")应该就可以了,因为on_trade里传进来的是TradeData而不是BarData。
© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3