For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/

I seem to have some problems when I trade with CCXT



  • This code is correct when doing a backtest.But when I pass in real-time data from CCXT, I get an error.I used the CCXT branch of backtrader.By the way, how to set the leverage ratio for Bitmex in this branch.Thx.

    class HFT(bt.Strategy):
        params = (
            ('highest_high', 20), 
            ('StdDev', 100),  
        )
    
        def log(self, txt, dt=None):
            ''' Logging function fot this strategy'''
            dt = dt or self.datas[0].datetime.date(0)
            print('%s, %s' % (dt.isoformat(), txt))
    
        def __init__(self):
            self.dataclose = self.datas[0].close
            self.datavolume = self.datas[0].volume
            self.datalow = self.datas[0].low
            self.sma_veryfast = btind.MovingAverageSimple(self.dataclose, period=10)
            self.sma_fast = btind.MovingAverageSimple(self.dataclose, period=20)
            self.sma_mid = btind.MovingAverageSimple(self.dataclose, period=50)
            self.sma_slow = btind.MovingAverageSimple(self.dataclose, period=100)
            self.sma_veryslow = btind.MovingAverageSimple(self.dataclose, period=200)
    
            # BollingerBandsWidth = upperband - lowerband/middleband.
            self.bbw = BollingerBandsW()
            self.boll = btind.BollingerBands()
            self.std = btind.StdDev(self.bbw.l.bbw, period=self.params.StdDev)
            self.lines_bbw = (self.boll.l.top - self.boll.l.bot) / self.boll.l.mid
    
            self.volatility_level = VolatilityLevel()
            self.low_volatility_level = self.volatility_level.l.VLI_fast < self.volatility_level.l.VLI_slow
            self.high_volatility_level = self.volatility_level.l.VLI_fast > self.volatility_level.l.VLI_slow
            self.extreme_volatility_level = self.bbw.l.bbw > self.volatility_level.l.VLI_top
            self.vol_condition = (btind.MovingAverageSimple(self.datavolume, period=10) >
                                  btind.MovingAverageSimple(self.datavolume, period=50))
            self.crossdown_boll_top = bt.ind.CrossDown(self.dataclose, self.boll.top)
            self.crossup_boll_bot = bt.ind.CrossUp(self.dataclose, self.boll.bot)
    
            self.highest_high = btind.Highest(self.dataclose, period=self.params.highest_high)
            self.low_of_last_candle = self.datalow[0]
            self.close_of_price = self.dataclose[0]# IndexError: array index out of range
            self.stop_win = None
            self.stop_loss = None
            self.order = None
    
    ......
    if __name__ == '__main__':
        cerebro = bt.Cerebro()
        hist_start_date = datetime.utcnow() - timedelta(minutes=10)
        cerebro = bt.Cerebro()
    
        broker_config = {
            # 'verbose': True,
            'apiKey': 'xxxx',
            'secret': "xxx"
        }
        broker = bt.brokers.CCXTBroker(exchange='bitmex', currency='BTC/USD', config=broker_config)
        cerebro.setbroker(broker)
    
        hist_start_date = datetime.utcnow() - timedelta(minutes=15)
        data = bt.feeds.CCXT(
            exchange='bitmex',
            symbol='BTC/USD',
            timeframe=bt.TimeFrame.Minutes,
            fromdate=hist_start_date,
            historical='False',
            )
    
        # Add the Data Feed to Cerebro
        cerebro.adddata(data)
        cerebro.addstrategy(HFT)
        cerebro.run()
    
    
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/this/bitmex_HFT.py", line 201, in <module>
        cerebro.run()
      File "C:\ProgramData\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 1127, in run
        runstrat = self.runstrategies(iterstrat)
      File "C:\ProgramData\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 1217, in runstrategies
        strat = stratcls(*sargs, **skwargs)
      File "C:\ProgramData\Anaconda3\lib\site-packages\backtrader\metabase.py", line 88, in __call__
        _obj, args, kwargs = cls.doinit(_obj, *args, **kwargs)
      File "C:\ProgramData\Anaconda3\lib\site-packages\backtrader\metabase.py", line 78, in doinit
        _obj.__init__(*args, **kwargs)
      File "C:/Users/Administrator/PycharmProjects/this/bitmex_HFT.py", line 89, in __init__
        self.low_of_last_candle = self.datalow[0]
      File "C:\ProgramData\Anaconda3\lib\site-packages\backtrader\linebuffer.py", line 163, in __getitem__
        return self.array[self.idx + ago]
    IndexError: array index out of range
    
    


  • @kemoduodejuxi said in I seem to have some problems when I trade with CCXT:

    self.low_of_last_candle = self.datalow[0]

    You are trying to access the datafeed's data in your __init__ method. The datafeed will have no data loaded at this point.

    Please see the following docs: https://www.backtrader.com/docu/concepts/#lines-delayed-indexing


Log in to reply
 

});