Problem to obtain Live data from IB for US options
-
Hello,
Ia m not able to obtain Live data from IB for US options. I am subscribed to OPRA Top of Book (L1) (US Option Exchanges). I have not problems to connect to other products like stocks, futures where I have also subscription to data. When I connect directly through IbPy (with this script) it works and I obtain market data:from time import sleep from ib.ext.Contract import Contract from ib.opt import ibConnection def price_tick_handler(msg): """ function to handle price ticks """ print (msg) #--------------main script------------------ import ib print ('ibpy version:' , ib.__version__) tws = ibConnection('127.0.0.1', 7497) # create connection object tws.enableLogging() # show debugging output from ibpy tws.register(price_tick_handler, 'tickPrice') # register handler tws.connect() # connect to API #-------create contract and subscribe to data c = Contract() c.m_symbol = "NOK" c.m_secType= "OPT" c.m_exchange = "BOX" c.m_currency = "USD" c.m_right = "C" c.m_expiry = "20200717" c.m_strike = 4.0 tws.reqMktData(1,c,"",False) # request market data #-------print data for a couple of seconds, then close sleep(10) print ('All done') tws.disconnect()
... but direcly through backtrader it freezes on DATA NOTIF: DELAYED. I use this code:
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='NOK-OPT-BOX-USD-20200717-5.0-C-100', timeframe=bt.TimeFrame.Ticks, historical=False) cerebro.resampledata(data, timeframe=bt.TimeFrame.Seconds, compression=10) cerebro.addstrategy(St) cerebro.broker = store.getbroker() #changing the backtesting broker (which defaults to a broker simulation) engine to use the Interactive Brokers facilities cerebro.run() if __name__ == '__main__': run()
Is something I am doing wrong? Is my dataname definition right? I try both definitions from Documentation wiki but without success:
TICKER-YYYYMMDD-EXCHANGE-CURRENCY-STRIKE-RIGHT # OPT
TICKER-YYYYMMDD-EXCHANGE-CURRENCY-STRIKE-RIGHT-MULT # OPT
TICKER-OPT-EXCHANGE-CURRENCY-YYYYMMDD-STRIKE-RIGHT # OPT
TICKER-OPT-EXCHANGE-CURRENCY-YYYYMMDD-STRIKE-RIGHT-MULT # OPTWhen I change Historical= True it give me historical data, but I need Live data of course. I am not out of trading hours and have subscription to data so I do not know what is wrong. Please help me with this problem. Thank you for your help.