Backtrader Community

    • 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/

    Not able to fetch live data from IB but works with Yahoofinance

    General Code/Help
    3
    7
    1426
    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.
    • T
      Tomas last edited by

      Hello!
      Im trying to fetch data from Interactive Brokers, however it simply throws me the following error when I try to plot the data

      (base) D:\backtrader projects>D:\Python\python.exe "d:\backtrader projects\strategies\testytest.py"
      Server Version: 76
      TWS Time at connection:20190421 18:33:13 CET
      21-Apr-19 18:33:19 DEBUG     CACHEDIR=C:\Users\Tomas_000\.matplotlib
      21-Apr-19 18:33:19 DEBUG     Using fontManager instance from C:\Users\Tomas_000\.matplotlib\fontlist-v300.json
      Traceback (most recent call last):
       File "d:\backtrader projects\strategies\testytest.py", line 64, in <module>
         cerebro.plot()
       File "D:\Python\lib\site-packages\backtrader\cerebro.py", line 996, in plot
         plotter.show()
       File "D:\Python\lib\site-packages\backtrader\plot\plot.py", line 795, in show
         self.mpyplot.show()
      AttributeError: 'Plot_OldSync' object has no attribute 'mpyplot' 
      

      However if I try to run the exact same code but instead comment out the IBData feed and insert a yahoo datafeed it will work and plot the graph as wanted.

      My code is

      from __future__ import (absolute_import, division, print_function, unicode_literals)
      
      import backtrader as bt
      import datetime  # For datetime objects
      import os.path  # To manage paths
      import sys  # To find out the script name (in argv[0])
      import math
      from backtrader.indicators import Indicator, MovAv, RelativeStrengthIndex, Highest, Lowest
      
      class TestStrategy(bt.Strategy):
        
         def __init__(self):
             # Keep a reference to the "close" line in the data[0] dataseries
             self.dataclose = self.datas[0].close
      
         def next(self):
             print(self.dataclose)
      
      if __name__ == '__main__':
         #Variable for our starting cash
         startcash = 10000
      
         #Create an instance of cerebro
         cerebro = bt.Cerebro()
      
         #Add the strategy
         cerebro.addstrategy(TestStrategy)
      
         # Add Sizer
         #cerebro.addsizer(LongOnly)
      
         # Activate optimization
         StrategyOptimizationEnabled = False
      
         #Add our strategy
         if StrategyOptimizationEnabled == True:
             cerebro.optstrategy(TestStrategy, maperiod=range(14,21)) 
      
         #Get Apple data from Yahoo Finance. THIS ACTUALLY WORKS BUT IBDATA DOESNT WORK
      #    data = bt.feeds.YahooFinanceData(
      #        dataname="AAPL",
      #        fromdate = datetime.datetime(2019,1,1),
      #        todate = datetime.datetime(2020,1,1)
      #        )
      
         #Get Twitter data from Yahoo Finance.
         store = bt.stores.IBStore(port=7497)
         data = store.getdata(dataname='TWTR', timeframe=bt.TimeFrame.Ticks, fromdate=datetime.datetime(2019,1,1), todate=datetime.datetime(2020,1,1))    
         cerebro.resampledata(data, timeframe=bt.TimeFrame.Seconds, compression=10)
      
         #Add the data to Cerebro
         #cerebro.resampledata(data, timeframe=bt.TimeFrame.Minutes, compression=15)
      
         # Set our desired cash start
         cerebro.broker.setcash(startcash)
      
         # Run over everything
         opt_runs = cerebro.run()
      
         # Set the commission
         cerebro.broker.setcommission(commission=0.005)
      
         # Plot the result
         cerebro.plot()
      
      1 Reply Last reply Reply Quote 0
      • B
        backtrader administrators last edited by

        Incredible feat. Just let us know how you get Yahoo to give you ticks from 2019-01-01 to 2020-01-01.

        1 Reply Last reply Reply Quote 0
        • B
          backtrader administrators last edited by

          You may of course consider:

          • Am I producing debugging information?
          • Have I activated the debug mode of the Interactive Brokers data?
          • Is 10-seconds asking for too many when looking backwards to 2019-01-01?
          • Am I attempting a historical download or do I want to trade real-time?
          • Am I talking to the Fake-Data Demo, Paper Trading Account or Live Trading Account?
          • Do I have the right data permissions?

          That's the minimum information you should have at hand. Algotrading involves engineering and being thorough. And sorry, comparing a Yahoo download with connecting to a live broker (even if in Fake Data mode) is not really a comparison.

          1 Reply Last reply Reply Quote 0
          • Cedric
            Cedric last edited by

            Did you find a solution yet? I have the same problem. I can 'connect' with yahoo by using YahooFinanceData() and I am able to plot it. Despite that, when trying to use IB, the same error appears. The output tells me that there is a connection but when I want to plot it I get 'Plot_OldSync' object has no attribute 'mpyplot'. I already reinstalled most packages, I followed installations on github and medium but nothing seems to work. I try to do this on Jupyter Notebook and made a new environment.

            1 Reply Last reply Reply Quote 0
            • B
              backtrader administrators last edited by

              I guess you miss the important point:

              • A Yahoo connection is just like opening a file and the amount of things you can do is limited

              • Connecting to TWS (i.e.: IB) is connecting to a live data source which offers multiple possibilities and has several restrictions.

              If you don't let the world know what you are doing (code) and say what you are trying to achieve (historical download, other ...), there is no possible help.

              1 Reply Last reply Reply Quote 0
              • Cedric
                Cedric last edited by

                Thank you for the fast response. I will describe my situation.
                Now, I want to get historical data from IB to do some backtesting. I have a paper trading account and followed this article 'https://medium.com/@danjrod/interactive-brokers-in-python-with-backtrader-23dea376b2fc' to get the right settings. As already said, I work in a jupyter notebook.

                This is my code:

                from __future__ import (absolute_import, division, print_function,
                                        unicode_literals)
                
                !pip install https://github.com/blampe/IbPy/archive/master.zip
                
                import pandas as pd
                import backtrader as bt
                from datetime import datetime
                !pip install backtrader[plotting]
                %matplotlib inline  
                
                # Create a subclass of Strategy to define the indicators and logi
                class EMA(bt.Strategy):
                    # list of parameters which are configurable for the strategy
                    params = dict(
                        pfast=7,  # period for the fast moving average
                        pslow=10 # period for the slow moving average
                    )
                
                    def __init__(self):
                        sma1 = bt.ind.ExponentialMovingAverage(period=self.p.pfast)  # fast moving average
                        sma2 = bt.ind.ExponentialMovingAverage(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
                
                cerebro = bt.Cerebro()
                ibstore = bt.stores.IBStore(host='127.0.0.1', port=7497, clientId=35)
                data = ibstore.getdata(dataname='AAPL-STK-SMART-USD', fromdate=datetime(2017, 5, 1), todate=datetime(2018, 8, 20))
                cerebro.adddata(data)
                cerebro.addstrategy(EMA)
                cerebro.run()
                cerebro.plot()
                

                Response: AttributeError: 'Plot_OldSync' object has no attribute 'mpyplot'

                Thanks in advance and sorry for not making clear the situation at first.

                1 Reply Last reply Reply Quote 0
                • B
                  backtrader administrators last edited by backtrader

                  @Cedric said in Not able to fetch live data from IB but works with Yahoofinance:

                  Now, I want to get historical data from IB to do some backtesting.

                  You are NOT downloading historical data.

                  @Cedric said in Not able to fetch live data from IB but works with Yahoofinance:

                  I have a paper trading account and followed this article 'https://medium.com/@danjrod/interactive-brokers-in-python-with-backtrader-23dea376b2fc'

                  The article DOES NOT describe backtesting at any point, it describes real-time trading (with emphasis in ..."use paper trading or the demo first")

                  See the documentation: Docs - Interactive Brokers - https://www.backtrader.com/docu/live/ib/ib/ for historical downloads, especially the historical parameter.

                  You may even want to specify the timeframe and compression. It is not the same to request 1-second bars than to request 1-week bars.

                  1 Reply Last reply Reply Quote 0
                  • 1 / 1
                  • First post
                    Last post
                  Copyright © 2016, 2017, 2018, 2019, 2020, 2021 NodeBB Forums | Contributors