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/

    How to cancel bracket order.

    Indicators/Strategies/Analyzers
    python 3 backtrader
    1
    1
    70
    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.
    • Misbah Asif
      Misbah Asif last edited by

      I am trying this strategy using bracket order. I am trying to enter into short strategy and have stoploss, takeprofit and exit square off conditions to take exit. But the problem is The trade is exiting multiple time but it should complete only one exit order and cancel other two.
      I am attaching my code please let me know what I am doing wrong.

      def next(self):
          self.starttime = self.data.datetime.time()
          self.new_time = timedelta(hours=self.starttime.hour+5, minutes=self.starttime.minute+30)
          self.curr_time = datetime.strptime(str(self.new_time), '%H:%M:%S').time()
          pos = self.getposition()
          if self.orefs:
              return
          if not self.position:
              # if self.data.high[0] < self.ema[0] and self.p.position_type in ["short"]:
              if self.p.position_type in ["short"] and self.starttime >= self.entry_time and self.starttime <= self.exit_time:
                  self.stoploss = self.data.close[0] * (self.p.stoploss + (0.1 / 100))
                  self.takeprofit = self.data.close[0] * (self.p.takeprofit - (0.1 / 100))
                  if not self.p.usebracket:
                      self.o1 = self.sell(exectype=bt.Order.Market, data=self.data, valid=bt.Order.DAY,
                                          size=self.p.quantity, transmit=False)
                      self.o1.addinfo(Trigger='SSEN', name="SSEN")
                      print('{}: Oref {} / Sell at {}'.format(
                          self.datetime.datetime(), self.o1.ref, self.data.close[0]))
                      self.o1.addinfo(Trigger='SSEN', name="SSEN")
                      self.trade_entry_time = self.datetime.datetime()
                      # print(self.order_in)
                      self.o2 = self.buy(exectype=bt.Order.Stop, data=self.data, price=self.stoploss,
                                         valid=bt.Order.DAY, size=self.o1.size, parent=self.o1,
                                         transmit=False)
                      self.o2.addinfo(Trigger='SBSL', name='SBSL')
      
                      print('{}: Oref {} / Buy Stop at {}'.format(
                      self.datetime.datetime(), self.o2.ref, self.stoploss))
                      # self.orefs.append(self.o2.ref)
                      self.o3 = self.buy(exectype=bt.Order.Limit, data=self.data, price=self.takeprofit,
                                         valid=bt.Order.DAY, size=self.o1.size, parent=self.o1, transmit=True)
                      self.o3.addinfo(Trigger='SBTP', name='SBTP')
      
                      print('{}: Oref {} / Buy TP at {}'.format(
                      self.datetime.datetime(), self.o3.ref, self.takeprofit))
                      # self.orefs.append(self.o3.ref)
                      self.o4 = self.buy(exectype=bt.Order.Market, size=self.p.quantity, data=self.data)
                      self.o4.addinfo(Trigger='SBEX', name='SBEX')
      
                      print('{}: Oref {} / Buy Exit at {}'.format(
                      self.datetime.datetime(), self.o4.ref, self.data.close[0]))
                      # self.orefs.append(self.o4.ref)
                      self.o5 = self.buy(exectype=bt.Order.Market, size=self.p.quantity,
                                             data=self.data)
                      self.o5.addinfo(Trigger='SBSO', name='SBSO')
                      print('{}: Oref {} / Buy Exit at {}'.format(
                      self.datetime.datetime(), self.o5.ref, self.data.close[0]))
                      # self.orefs.append(self.o5.ref)
      
                      self.orefs= [self.o1.ref, self.o2.ref, self.o3.ref, self.o4.ref, self.o5.ref]
                      print(self.orefs)
      
      def notify_order(self, order):
          if order.status in[order.Submitted, order.Accepted]:
              # print("Order Accepted")
              return
          elif order.status in [order.Completed]:
              if order.isbuy():
                  self.buyprice = order.executed.price
                  self.buycomm = order.executed.comm
                  self.stoploss = order.executed.price * (self.p.stoploss - (0.1/100))
                  self.takeprofit = order.executed.price * (self.p.takeprofit + (0.1/100))
                  self.ord_type = "BUY"
                  self.buytrade = self.buytrade + 1
                  self.total_buy_qty = self.total_buy_qty + order.executed.size
              elif order.issell():
                  self.sellprice = order.executed.price
                  self.stoploss = order.executed.price * (self.p.stoploss + (0.1/100))
                  self.takeprofit = order.executed.price * (self.p.takeprofit - (0.1/100))
                  self.ord_type = "SELL"
                  self.selltrade = self.selltrade+1
                  self.total_sell_qty = self.total_sell_qty + abs(order.executed.size)
              print("Completed %s: %s %s Executed Price: %.2f Size: %.2f Commission: %.2f %s" %
                    (self.ord_type, order.ref,
                     # self.data.num2date(order.executed.dt).date().isoformat(),
                     self.datetime.datetime(),
                     order.executed.price,
                     order.executed.size,
                     order.executed.comm,
                     order.info['name'],))
      
          elif order.status in [order.Cancelled, order.Rejected, order.Margin]:
              print(order.ref,": Order Cancelled/Rejected/Margin")
      
          self.order = None
      

      ThankYou

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