For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/
Error when data on 3rd Jul data is added.
-
i'm using intraday 1 min data of Nasdaq 100 futures, Nasdaq100 index and SPX index
I encounter errors when the period includes the day of 3rd July
there is no error when the start day is 4th July.class TStationData (btfeed.GenericCSVData): params=( ('fromdate',datetime.datetime(2019,7,4)), ('todate',datetime.datetime(2019,10,27)), ('nullvalue',0.0), ('fill_vol',0.0), ('fill_oi',0.0), ('timeframe',bt.TimeFrame.Minutes), ('compression',1), ('dtformat',('%m/%d/%Y')), ('tmformat',('%H:%M')), ('datetime',0), ('time',1), ('high',3), ('low',4), ('open',2), ('close',5), ('volume',-1), ('openinterest',-1) )
The error i see is when the day of 3rd July is included:
File "C:\Users\wjpha\anaconda3\lib\site-packages\backtrader\lineiterator.py", line 297, in _once indicator._once() File "C:\Users\wjpha\anaconda3\lib\site-packages\backtrader\linebuffer.py", line 631, in _once self.once(self._minperiod, self.buflen()) File "C:\Users\wjpha\anaconda3\lib\site-packages\backtrader\functions.py", line 204, in once dst[i] = flogic([arr[i] for arr in arrays]) File "C:\Users\wjpha\anaconda3\lib\site-packages\backtrader\functions.py", line 204, in <listcomp> dst[i] = flogic([arr[i] for arr in arrays]) IndexError: array index out of range
I couldn't find any similar errors elsewhere. What could be the cause of the error here?
Thanks in advance.strategies code as follow:
import backtrader as bt class MAcrossover(bt.Strategy): # Moving average parameters params=(('pfast',500),('pslow',1000),('Xmean',10),) def log(self,txt,dt=None): dt=dt or self.datas[0].datetime.date(0) tm=self.datas[0].datetime.time() print('%s, %s, %s' % (dt.isoformat(), tm, txt)) #Print date and close,Comment this line when running optimization def __init__(self): #keep a reference to the "close" line in the data[0] dataseries self.dataclose=self.datas[0].close NDFclose=self.data0.close ndx_close=self.data1.close snp_close=self.data2.close #Order variable will contain ongoing order details/status self.order=None #Instantiate moving averages self.slow_sma=bt.indicators.MovingAverageSimple(self.datas[0],period=self.params.pslow) self.fast_sma=bt.indicators.MovingAverageSimple(self.datas[0],period=self.params.pfast) self.Xmean=bt.indicators.EMA(self.datas[0],period=self.params.Xmean) ndx_sma50=bt.indicators.MovingAverageSimple(ndx_close,period=500) ndx_sma100=bt.indicators.MovingAverageSimple(ndx_close,period=1000) ndx_max=bt.Max(ndx_sma50,ndx_sma100) ndx_ema=bt.indicators.EMA(ndx_close,period=20) snp_sma50=bt.indicators.MovingAverageSimple(snp_close,period=500) snp_sma100=bt.indicators.MovingAverageSimple(snp_close,period=1000) snp_max=bt.Max(snp_sma50,snp_sma100) snp_ema=bt.indicators.EMA(snp_close,period=20) #Bull Futures Trend #if NDFclose > # Buy Signal # self.buy_sig1=bt.And(snp_ema(-1)<snp_max(-1), #snp_ema(0)>snp_max(0), #ndx_close(0)>ndx_max(0) # ) self.buy_sig2=bt.And(ndx_ema(-1)<ndx_max(-1), ndx_ema(0)>ndx_max(0), snp_close(0)>snp_max(0) ) # Close Long position #self.buyclose_sig1=snp_close(0)<snp_max(0) self.buyclose_sig2=ndx_close(0)<ndx_max(0) def notify_order(self, order): if order.status in [order.Submitted,order.Accepted]: #An active Buy/Sell order has been submitted/accepted - Nothing to do return #Check if an order has been completed if order.status in [order.Completed]: if order.isbuy(): self.log(f'BUY EXECUTED, {order.executed.price:2f}') elif order.issell(): self.log(f'SELL EXECUTED,{order.executed.price:2f}') self.bar_executed=len(self) elif order.status in [order.Canceled,order.Margin,order.Rejected]: self.log('Order Canceled/Margin/Rejected') #Reset orders self.order=None def next(self): #Check for open orders if self.order: return