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

Problem getting data and placing order in live IB



  • I AM subscribed to IB live data. I have no problem getting live data when I use IB's native python API - IBJts. However when I try to use Backtrader and ran the following code, I got UNSUBSCRIBED status and can't place order. What am I missing?

    Server Version: 76
    TWS Time at connection:20200227 21:37:34 EST
    ***** DATA NOTIF: DELAYED
    ***** DATA NOTIF: NOTSUBSCRIBED

    Process finished with exit code 0

    from __future__ import (absolute_import, division, print_function,
                            unicode_literals)
    
    import backtrader as bt
    
    
    class St(bt.Strategy):
        def logdata(self):
            txt = []
            txt.append('{}'.format(len(self)))
            txt.append('{}'.format(self.data.datetime.datetime(0).isoformat()))
            txt.append('{:.2f}'.format(self.data.open[0]))
            txt.append('{:.2f}'.format(self.data.high[0]))
            txt.append('{:.2f}'.format(self.data.low[0]))
            txt.append('{:.2f}'.format(self.data.close[0]))
            txt.append('{:.2f}'.format(self.data.volume[0]))
            print(','.join(txt))
    
        data_live = False
    
        def notify_data(self, data, status, *args, **kwargs):
            print('*' * 5, 'DATA NOTIF:', data._getstatusname(status), *args)
            if status == data.LIVE:
                self.data_live = True
    
        def notify_order(self, order):
            if order.status == order.Completed:
                buysell = 'BUY ' if order.isbuy() else 'SELL'
                txt = '{} {}@{}'.format(buysell, order.executed.size,
                                        order.executed.price)
                print(txt)
    
        bought = 0
        sold = 0
    
        def next(self):
            self.logdata()
            # if not self.data_live:
            #     return
            #
            # if not self.bought:
            #     self.bought = len(self)  # keep entry bar
            #     self.buy()
            # elif not self.sold:
            #     if len(self) == (self.bought + 3):
            #         self.sell()
    
    
    def run(args=None):
        cerebro = bt.Cerebro(stdstats=False)
        store = bt.stores.IBStore(port=7497)
    
        data = store.getdata(dataname='TWTR', timeframe=bt.TimeFrame.Ticks)
        cerebro.resampledata(data, timeframe=bt.TimeFrame.Seconds, compression=10)
    
        cerebro.broker = store.getbroker()
    
        cerebro.addstrategy(St)
        cerebro.run()
    
    
    if __name__ == '__main__':
        run()
    


  • Comparing TWS API logs for both scenarios would probably help.


Log in to reply
 

});