Navigation

    Backtrader Community

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    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

    General Discussion
    1
    1
    89
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Squirrel Singing
      Squirrel Singing last edited by

      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()
      
      1 Reply Last reply Reply Quote 1
      • 1 / 1
      • First post
        Last post
      Copyright © 2016, 2017, 2018 NodeBB Forums | Contributors
      $(document).ready(function () { app.coldLoad(); }); }