如题,

想要实现portfoliobacktesting框架下,记录下来每个商品每天的ATR,并缓存到新建在回测框架下的列表self.atrs里. 再在calculate_results()函数里从self.atrs调取ATR进行计算。我的想法大致如下。实际遇到的问题时调取self.atrs时,取到的回测期内每天的atr数值都是最后一天的atr数值。在'输出1' 的位置,可以得到不同日期不同的atr数值,等到程序运行到'输出2' 的位置是,得到的回测期内每天的数值都是最后一天的数值。

个人的猜想时实际上存进列表里的不是数值而是方法。到了位置2的时候是把所有的方法都用最后一天的bardata又计算了一遍。不知道怎么改,求助各位高手指点迷津。

 def run_backtesting(self) -> None:
    """"""
    此处为框架本身代码,省略

    """""" 
    self.output(self.atrs) # (输出2:)此处输出new_bars函数计算完成以后的self.atrs

def new_bars(self, dt: datetime) -> None:
    """"""
    self.datetime = dt

    bars: Dict[str, BarData] = {}
    for vt_symbol in self.vt_symbols:
        bar: Optional[BarData] = self.history_data.get((dt, vt_symbol), None)
        # If bar data of vt_symbol at dt exists
        if bar:
            # Update bar data for crossing order
            self.bars[vt_symbol] = bar
            # Put bar into dict for strategy.on_bars update
            bars[vt_symbol] = bar
        # Otherwise, use previous close to backfill
        elif vt_symbol in self.bars:
            old_bar: BarData = self.bars[vt_symbol]

            bar: BarData = BarData(
                symbol=old_bar.symbol,
                exchange=old_bar.exchange,
                datetime=dt,
                open_price=old_bar.close_price,
                high_price=old_bar.close_price,
                low_price=old_bar.close_price,
                close_price=old_bar.close_price,
                gateway_name=old_bar.gateway_name
            )
            self.bars[vt_symbol] = bar

    self.cross_limit_order()
    self.strategy.on_bars(bars)
    if dt.time() == time(14,59):
        aaa = {"date":dt.date(), "atrs": self.strategy.get_atrs()}
        self.atrs.append(aaa)
        self.output(f"{dt.date()},{self.atrs[-1]}") # (输出1:)在每个交易日的计算完成后,输出self.atrs列表中的最新数值

    if self.strategy.inited: #if init finished, push the new bar data to update daily close info
        self.update_daily_close(self.bars, dt)