bt預設的行為是當天收盤計算交易信号,下一個bar開盤價交易該信号,由此導緻的問題,無法計算真正需要的滿倉size,預設提供的各種手段,經過測試,也都隻能做到最大95%比例開倉,否則就容易報錯margin,例如
cerebro.addsizer(bt.sizers.AllInSizer,percents=95)
是以,這裡的權宜之計,是直接取下一個bar的資料來參與計算,同時由于bt的機制問題(我認為這是一個邏輯bug,正常講,應該按照交易bar的資料來判斷order是否合理),他會按照當天的bar來判斷order是否合理,是以隻能取兩者最大來近似計算一個滿倉資料,否則一旦當天價格大于要交易的價格,就會報錯margin
max_price_size = math.floor(self.broker.get_cash() /max(self.dataclose[0],self.dataclose[1]))
self.log('BUY CREATE , %.4f, %.1f' % (self.dataclose[0],max_price_size))
self.buy(size=max_price_size)