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

Crypto Trading Bot for Kraken



  • Hello all,

    I am new to Python Coding with Backtrader. I would like to create a Backtrader based Bot for Kraken Crypto exchange, but I ran into an issue with
    plotting the data for example. I have been using some SMA example code and add a CCXT Data Stream to it, it basically compiles, but it doesn't plot any data.
    I wonder if some one could have a look?

    Thank you in advance!

    from __future__ import(absolute_import, division, print_function, unicode_literals)
    from datetime import datetime, timedelta
    import backtrader as bt
    from backtrader import cerebro
    import time
    
    '''
    def connect_broker():
        config = {'urls': {'api': 'https://api.sandbox.gemini.com'},
                             'apiKey': 'XXXXX',
                             'secret': 'XXXXX',
                             'nonce': lambda: str(int(time.time() * 1000))
                            }
        broker = bt.brokers.CCXTBroker(exchange="kraken",
                                       currency="USD", config=config)
        cerebro.setbroker(broker)
    
        # Create data feeds
        data_ticks = bt.feeds.CCXT(exchange="kraken", symbol="BTC/USD",
                                  name="btc_usd_tick",
                                  timeframe=bt.TimeFrame.Ticks,
                                  compression=1, config=config)
        cerebro.adddata(data_ticks)
    '''
    
    class TestStrategy(bt.Strategy):
        #class SmaCross(bt.Strategy):
        # list of parameters which are configurable for the strategy
        params = dict(
            pfast=10,  # period for the fast moving average
            pslow=30   # period for the slow moving average
        )
    
        def __init__(self):
            sma1 = bt.ind.SMA(period=self.p.pfast)  # fast moving average
            sma2 = bt.ind.SMA(period=self.p.pslow)  # slow moving average
            self.crossover = bt.ind.CrossOver(sma1, sma2)  # crossover signal
    
        def next(self):
            if not self.position:  # not in the market
                if self.crossover > 0:  # if fast crosses slow to the upside
                    self.buy()  # enter long
    
            elif self.crossover < 0:  # in the market & cross to the downside
                self.close()  # close long position 
       
    if __name__ == '__main__':
        
        # Create Data Stream:
        hist_start_date = datetime.utcnow() - timedelta(minutes=60)
        data_min = bt.feeds.CCXT(exchange="kraken", symbol="BTC/USD", name="btc_usd_min", fromdate=hist_start_date,
                                 timeframe=bt.TimeFrame.Minutes)
        
        # Create Cerebro Entity
        cerebro = bt.Cerebro()
        cerebro.adddata(data_min)
        cerebro.addstrategy(TestStrategy)
        cerebro.run()
        cerebro.plot()
    
    

  • administrators

    @Thomas-Fischer said in Crypto Trading Bot for Kraken:

    def next(self):
        if not self.position:  # not in the market
            if self.crossover > 0:  # if fast crosses slow to the upside
                self.buy()  # enter long
    
        elif self.crossover < 0:  # in the market & cross to the downside
            self.close()  # close long position 
    

    Let me suggest that you add some logging there ... (a couple print statements will suffice). What you will probably see is nothing and that's why there is no plotting. One will then be able to conclude that no data is being downloaded.

    You can easily check if your code plots by switching to, for example, a csv-based data feed.



  • @backtrader Hello, thank you for looking into this.

    If I do something stupid like:

    # Create data feeds
    try:
        hist_start_date = datetime.utcnow() - timedelta(minutes=3)
        data_min = bt.feeds.CCXT(exchange="kraken", symbol="BTC/USD", name="btc_usd_min",
                             timeframe=bt.TimeFrame.Minutes, fromdate=hist_start_date, compression=1,
                             config={'rateLimit': 10000, 'enableRateLimit': True}) #, historical=True)
    
    
    # data_min=bt.feeds.YahooFinanceData(dataname='MSFT',fromdate=datetime(2011,1,1),todate=datetime(2012,12,31))
    
        cerebro.adddata(data_min)
        print (data_min)
        cerebro.addstrategy(SmaCross)
        cerebro.run()
        cerebro.plot()
    
    except Exception as e:
        logging.error("Exeption", exc_info=True)
    
    

    I get:

    <backtrader.feeds.ccxt.CCXT object at 0x00000183FB3C3C88>
    

    Even with the Yahoo Feed it is not trading, but it is plotting the chart at least.
    I have the guts feeling the data needs to be formatted.



  • Chart.PNG


  • administrators

    @Thomas-Fischer said in Crypto Trading Bot for Kraken:

    Even with the Yahoo Feed it is not trading, but it is plotting the chart at least.

    Sorry, but the chart you show, has clearly trades on it.

    @Thomas-Fischer said in Crypto Trading Bot for Kraken:

        print (data_min)
    

    Nobody said you have to print an object.

    @backtrader said in Crypto Trading Bot for Kraken:

    @Thomas-Fischer said in Crypto Trading Bot for Kraken:

    def next(self):
       if not self.position:  # not in the market
           if self.crossover > 0:  # if fast crosses slow to the upside
               self.buy()  # enter long
    
       elif self.crossover < 0:  # in the market & cross to the downside
           self.close()  # close long position 
    
    

    Let me suggest that you add some logging there ... (a couple print statements will suffice)

    You put the print statements there in the next method, to log things like the close price (please see the Quickstart Guide Docs - Quickstart - https://www.backtrader.com/docu/quickstart/quickstart/) as in print(self.data.close[0])

    The fact that the Yahoo data feed "plots" is a very clear indication that your attempt with the other feed delivers no data points at all.



  • @backtrader Thank you very much for the advice! I will have a closer look.


Log in to reply
 

});