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

Last Bar of Delayed Data from Interactive Brokers



  • Re: Backtest vs live bars "off-by-1" discrepancy?

    Hi,

    For those of you who use Interactive Brokers, are you all seeing the last bar of delayed data being formed even before the time period is over?

    I am aware that rightedge = False for Delayed data and rightedge = True for Live Data.

    For example, using the below screenshot as an example
    At 08:05:00, Closing Price of 1.28926 is the closing price for the period 08:05:00 to 08:10:00
    At 08:10:00, Closing Price of 1.28935 is the closing price for the period 08:10:00 to 08:13:33 (the time when connection to IB server was established)
    At 08:15:00, Closing Price of 1.2891 is the closing price for the period 08:10:00 to 08:15:00

    If the last bar of delayed data is indeed formed before time period is over, aren't indicators, such as 2 periods SMA in the below screenshot being skewed by this "Last Bar of Delayed Data"?

    f15fd9ff-68b3-4dd0-b922-2f5ed5fc24e5-image.png

    If you want to replicate the results, pls use the below code.

    import backtrader as bt
    import datetime as dt
    import pytz as pytz
    
    class Test_Strategy (bt.Strategy):
        params = (('maperiod',10),
                 )
        
        def __init__ (self):
            self.data_live = False
            self.sma = bt.indicators.SimpleMovingAverage (self.data.close, period = self.params.maperiod)
        
        def next (self):
            self.log (str(self.data.close[0]) + '(Closing Price) ' + str(self.sma[0]) + '(2 periods SMA)')
        
        def notify_data(self, data, status):
            print('*' * 5, 'DATA NOTIF:', data._getstatusname(status))
            if status == data.LIVE:
                self.data_live = True
        
        def log (self, text):
            print (self.data.datetime.datetime(0),": ", text)
    
    if __name__ == '__main__':
        ibstore = bt.stores.IBStore (host = '127.0.0.1', clientId = 111, port = 7497)
        data = ibstore.getdata (dataname = 'GBP.USD-CASH-IDEALPRO',       #GBP.USD-CASH-IDEALPRO, BARC-STK-LSE-GBP
                                rtbar = False,
                                timeframe = bt.TimeFrame.Minutes,
                                compression = 1,
                                tz=pytz.timezone('US/Eastern'),
                                )
        cerebro = bt.Cerebro()
        cerebro.broker = ibstore.getbroker()                                                          ###
        cerebro.resampledata (data, timeframe = bt.TimeFrame.Minutes, compression = 5)
        cerebro.addstrategy (Test_Strategy, maperiod = 2)
        cerebro.run()
    

Log in to reply
 

});