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/

    Managing orders for multiple data feeds

    General Code/Help
    2
    3
    229
    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.
    • V
      Vypy1 last edited by

      I wanted to know what is the best way to manage orders in multi data feeds. In case of single data feeds I use the notify order method but incase on multiple data feeds, as is the case in the below code, I think it is submitting orders for both my feeds.

      # Breakout Strategy
      
      class Breakout(bt.Strategy):
          
          params = (('roc', 10), ('stop', 0.98), ('tgt', 1.05), )
          
          def __init__(self):
              
              self.inds = {}
              for d in (self.datas):
                  self.inds[d] = {}
      #             self.open = self.datas[d].open
      #             self.close = self.datas[d].close
      #             self.high = self.datas[0].high
                  self.inds[d]['roc'] = bt.talib.ROC(d.close, timeperiod = self.p.roc)
                  self.inds[d]['p_range'] = bt.talib.SUB(d.close, d.open)
                  self.inds[d]['price_range'] = bt.talib.SMA(self.inds[d]['p_range'], timeperiod = 10)
                  self.inds[d]['vol_range'] = bt.talib.SMA(d.volume, timeperiod = 10)
                  self.inds[d]['prev_high'] = 0
                  self.orefs = list()
                  self.execprice = None
                  self.totalcost = None
              
              
          def log(self, txt, dt=None):
              dt = self.datas[0].datetime.date()
              print(f'Date: {dt}, {txt}')
              
              
              
          def notify_order(self, order):
              
              for d in self.datas:
                  print(f'{self.datetime.date()}: Close: {d.close[0]}')
              
              print(f'Order ref: {order.ref} / Type {"Buy" * order.isbuy() or "Sell"} / Status {order.getstatusname()}')
           
              if order.status == order.Completed:
                  self.execprice = order.executed.price
                  self.totalcost = order.executed.value
                  self.log(f'Executed price: {self.execprice}')
      
      
              if not order.alive() and order.ref in self.orefs:
                  self.orefs.remove(order.ref)
                  print(f'Order Numbers are {self.orefs}')
                  
      
         
          def notify_trade(self, trade):
              if trade.isopen:
                  return  
              else:
                  self.log(f'OPERATION PROFIT: GROSS {trade.pnl}, NET {trade.pnlcomm}, Trade PnL: {trade.pnlcomm/self.totalcost}')
                  self.log(f'Updated Account Balance: {cerebro.broker.getcash()}')
                  
                  
          
          def next(self):
       
              for d in (self.datas):
                  name = d._name
                  pos = self.getposition(d).size
                  
                  self.log(f'Name: {name}, Close: {d.close[0]}')
                  
      
                  
                  if d.Peaks == 1.0:
                      self.inds[d]['prev_high'] = d.high[0]
      #             print('Date: {}, Name: {}, ROC: {}, Prange: {}, Price Range: {}, Vol_range: {}, Prev_high: {}'.format(self.datas[0].datetime.date(), name, self.inds[d]['roc'][0], self.inds[d]['p_range'][0], self.inds[d]['price_range'][0], self.inds[d]['vol_range'][0], self.inds[d]['prev_high']))
                  
                  if not pos:
                              
                      if (-3 <= self.inds[d]['roc'][-1] <= 3):
                              
                                      p1 = d.open[1]
                                      p2 = p1 * self.p.stop
                                      p3 = p1 * self.p.tgt
      
                                      os = self.buy_bracket(data = d, price=p1, stopprice=p2, limitprice=p3, exectype = bt.Order.Market)
                                  
                      
                                      self.orefs = [o.ref for o in os]
      #                             print(f'Order Numbers are : {self.orefs}')
                                      self.log(f'Name: {name}, Buy at {p1} - OID: {self.orefs[0]}, Stop sell at {p2} - OID: {self.orefs[1]}, Tgt sell at {p3} - OID: {self.orefs[2]}')
      
      
      #                                 print('Date: {}, Name: {}, Prange: {}'.format(self.datetime.date(), name, self.inds[d]['p_range'][0], self.inds[d]['price_range'][0], self.inds[d]['vol_range'][0]))
                              
              
      cerebro = bt.Cerebro()
      dataset = [(hdfc, 'hdfc'), (maruti, 'maruti')]
      
      for n in range(len(dataset)):
          data = pandas_data_ext(dataname=dataset[n][0], datetime=None, open=-1, high=-1, low=-1, close=-1, volume=-1, Peaks=-1, Trough=-1)
          cerebro.adddata(data, name = dataset[n][1])
          
      cerebro.addstrategy(Breakout)
      cerebro.run()
      

      Output is as below:

      Date: 2017-02-27, Name: hdfc, Close: 1375.7
      Date: 2017-02-27, Name: maruti, Close: 5951.5
      Date: 2017-02-28, Name: hdfc, Close: 1370.05
      Date: 2017-02-28, Name: hdfc, Buy at 1369.8 - OID: 1078, Stop sell at 1342.404 - OID: 1079, Tgt sell at 1438.29 - OID: 1080
      Date: 2017-02-28, Name: maruti, Close: 5922.5
      Date: 2017-02-28, Name: maruti, Buy at 5960.0 - OID: 1081, Stop sell at 5840.8 - OID: 1082, Tgt sell at 6258.0 - OID: 1083
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1078 / Type Buy / Status Submitted
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1079 / Type Sell / Status Submitted
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1080 / Type Sell / Status Submitted
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1081 / Type Buy / Status Submitted
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1082 / Type Sell / Status Submitted
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1083 / Type Sell / Status Submitted
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1078 / Type Buy / Status Accepted
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1079 / Type Sell / Status Accepted
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1080 / Type Sell / Status Accepted
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1081 / Type Buy / Status Accepted
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1082 / Type Sell / Status Accepted
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1083 / Type Sell / Status Accepted
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1078 / Type Buy / Status Completed
      Date: 2017-03-01, Executed price: 1369.8
      2017-03-01: Close: 1400.55
      2017-03-01: Close: 5919.6
      Order ref: 1081 / Type Buy / Status Completed
      Date: 2017-03-01, Executed price: 5960.0
      Order Numbers are [1082, 1083]
      Date: 2017-03-01, Name: hdfc, Close: 1400.55
      Date: 2017-03-01, Name: maruti, Close: 5919.6
      Date: 2017-03-02, Name: hdfc, Close: 1399.0
      Date: 2017-03-02, Name: maruti, Close: 5918.75
      Date: 2017-03-03, Name: hdfc, Close: 1371.2
      Date: 2017-03-03, Name: maruti, Close: 5887.75
      Date: 2017-03-06, Name: hdfc, Close: 1365.95
      Date: 2017-03-06, Name: maruti, Close: 5934.85
      Date: 2017-03-07, Name: hdfc, Close: 1365.4
      Date: 2017-03-07, Name: maruti, Close: 5888.5
      2017-03-08: Close: 1367.7
      2017-03-08: Close: 5864.15
      Order ref: 1082 / Type Sell / Status Completed
      Date: 2017-03-08, Executed price: 5840.8
      Order Numbers are [1083]
      2017-03-08: Close: 1367.7
      2017-03-08: Close: 5864.15
      Order ref: 1083 / Type Sell / Status Canceled
      Order Numbers are []
      Date: 2017-03-08, OPERATION PROFIT: GROSS -119.19999999999982, NET -119.19999999999982, Trade PnL: -0.01999999999999997
      Date: 2017-03-08, Updated Account Balance: 8511.0
      Date: 2017-03-08, Name: hdfc, Close: 1367.7
      Date: 2017-03-08, Name: maruti, Close: 5864.15
      Date: 2017-03-09, Name: hdfc, Close: 1371.5
      Date: 2017-03-09, Name: maruti, Close: 5964.4
      Date: 2017-03-10, Name: hdfc, Close: 1373.8
      Date: 2017-03-10, Name: maruti, Close: 5955.6
      Date: 2017-03-10, Name: maruti, Buy at 6060.0 - OID: 1084, Stop sell at 5938.8 - OID: 1085, Tgt sell at 6363.0 - OID: 1086
      

      What I want is to submit an order for one feed upon meeting the criteria in next. But not to submit order for the other feed if the criteria is not met. How can I do this?

      run-out 1 Reply Last reply Reply Quote 0
      • run-out
        run-out @Vypy1 last edited by

        @vypy1 Here

        RunBacktest.com

        V 1 Reply Last reply Reply Quote 1
        • V
          Vypy1 @run-out last edited by

          @run-out thanks, was able to figure it out.

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