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/

    Execute trade immediatly after a stop is hit

    General Code/Help
    4
    23
    485
    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.
    • S
      student last edited by

      After my stop is hit, I want to check a condition and then place an order (which would be executed on the open on the next candle, after the stop is hit). However my understanding is that the stop order is executed after next is called, so it wouldn't execute the order on the candle immediately after the stop is hit, rather it would get executed on the 2nd candle after the stop is hit rather than the first.
      Is there a way to solve this problem?

      1 Reply Last reply Reply Quote 1
      • C
        CooleRnax last edited by

        Interested too!!!

        1 Reply Last reply Reply Quote 0
        • A
          ab_trader last edited by

          Lets figure out what do you want first. Do you want to execute stop (1) at stop price as soon as price hit stop or (2) at the open of the bar next to the bar where price hit stop?

          (1) is already introduced in thebt with the regular stop orders. Notification about the stop order execution comes at the open of the bar next to the bar where price hit stop. This way I would call immediately.

          (2) is easy to incorporate: just check price vs stop relation in the next() and if price crosses/touches stop price, than issue simple market order to close position. It will be executed at the open of the bar next to the bar where price hit stop.

          • If my answer helped, hit reputation up arrow at lower right corner of the post.
          • Python Debugging With Pdb
          • New to python and bt - check this out
          1 Reply Last reply Reply Quote 1
          • C
            CooleRnax last edited by

            @ab_trader said in Execute trade immediatly after a stop is hit:

            Notification

            Is there any way to place stop order instantly after enter order gets filled without waiting next bar?

            1 Reply Last reply Reply Quote 0
            • A
              ab_trader last edited by

              @CooleRnax said in Execute trade immediatly after a stop is hit:

              Is there any way to place stop order instantly after enter order gets filled without waiting next bar?

              Yes, in the next() you issue regular order as market order and stop order. Then before call of the next next() your market order will be executed (if it will be enough money) and you will have active stop order.

              • If my answer helped, hit reputation up arrow at lower right corner of the post.
              • Python Debugging With Pdb
              • New to python and bt - check this out
              1 Reply Last reply Reply Quote 1
              • C
                CooleRnax last edited by

                What if use limit order to enter the market?

                A 1 Reply Last reply Reply Quote 0
                • A
                  ab_trader @CooleRnax last edited by

                  @CooleRnax you can try Docs - Brackets.

                  • If my answer helped, hit reputation up arrow at lower right corner of the post.
                  • Python Debugging With Pdb
                  • New to python and bt - check this out
                  1 Reply Last reply Reply Quote 1
                  • C
                    CooleRnax last edited by

                    thank you!

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

                      @student said in Execute trade immediatly after a stop is hit:

                      After my stop is hit, I want to check a condition and then place an order (which would be executed on the open on the next candle, after the stop is hit). However my understanding is that the stop order is executed after next is called, so it wouldn't execute the order on the candle immediately after the stop is hit, rather it would get executed on the 2nd candle after the stop is hit rather than the first.
                      Is there a way to solve this problem?

                      Although @ab_trader has probably clarified this with the answers ...

                      @student said in Execute trade immediatly after a stop is hit:

                      After my stop is hit, I want to check a condition and then place an order (which would be executed on the open on the next candle, after the stop is hit).

                      Is that a personal price stop or an already placed Stop order?

                      @student said in Execute trade immediatly after a stop is hit:

                      However my understanding is that the stop order is executed after next is called, so it wouldn't execute the order on the candle immediately after the stop is hit , rather it would get executed on the 2nd candle after the stop is hit rather than the first.

                      I really fail to understand what your understanding is. If we assume that you have a Stop order in place and the trigger price is "hit" the order will be executed. Nothing to do with next or candles immediately after it. The Stop is already there.

                      If no Stop order is in place and you place an order, it will of course be first executed with the next candle. Because the current candle is already the past (you see the prices, because the prices have already happened)

                      In both cases nothing to with 2nd candles.

                      Is there a way to solve this problem?

                      Specify your problem clearly so that we can understand what your problem is and if there is an actual problem. I really think there isn't any, beyond the usual problem: the resolution of the data is not small enough.

                      1 Reply Last reply Reply Quote 1
                      • S
                        student last edited by

                        @ab_trader @backtrader Let me clarify my problem with a illustration.
                        alt text
                        This shows what I want to do. If my understanding is correct, the stop order is executed after next(). Therefore I do not have the opportunity to place the long order, which would be executed in the following candle.

                        1 Reply Last reply Reply Quote 0
                        • S
                          student last edited by

                          To clarify further, my issue isn't with the execution of the stop as @ab_trader suggested, that works fine. The issue is with placing an order after the stop has been executed and having it execute in the following bar.

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

                            Believe me when I say that the issue is the presentation of an actual issue which isn't an issue. Let me show why

                            1. Chart presented with manual annotations from some other platform.

                            @student said in Execute trade immediatly after a stop is hit:

                            If my understanding is correct, the stop order is executed after next().

                            1. "Understanding" is not an issue. Furthermore nothing happens after next(), which happens when everything has happened (as a matter of fact, the next iteration takes ofr course place after next())

                            @student said in Execute trade immediatly after a stop is hit:

                            Therefore I do not have the opportunity to place the long order, which would be executed in the following candle.

                            1. It seems from the text, that you haven't actually attempted to place such an order.

                            You probably want to read this:

                            • Docs - Strategy - https://www.backtrader.com/docu/strategy/

                            And the different methods, next, notify_order, notify_trade, ...

                            But summarizing:

                            • If in the current next cycle (i.e.: iteration) your X (Stop apparently) order has been executed and another one is placed
                            • It will be executed in the next cycle (if it can of course be executed, i.e.: Market or Limit in which the limit price is reached, ...)
                            1 Reply Last reply Reply Quote 0
                            • S
                              student last edited by

                              Okay, so I stepped through my code. The stop gets hit and the buy order does get submitted in the right place. The problem is in fact that I'm running into order.margin, which prevents the buy order being taken. I'm logging everything and I can see there is no additional orders are before this. My self.broker.get_cash() value is 9801.0 and I'm trying to submit this order

                              self.buy(size=3.63)
                              

                              The close of the candle when this is submitted is 7443.0 and the open of the candle after is also 7443.0. Yes I am using leverage but surely this is still fine?

                              "Order.Margin: the order execution would imply a margin call and the previously accepted order has been taken off the system"

                              Why would I be getting margin called with these values?

                              B 1 Reply Last reply Reply Quote 0
                              • S
                                student last edited by

                                Seems to work when I do

                                self.buy(size=3.63*0.3)
                                

                                I can't understand why I'm getting margin called? I have no other positions open, no other orders?

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

                                  You may believe that small drops of information enable the all-mighty backtrader to make a diagnostic, but it is simply not the case.

                                  9801 doesn't obviously fit inside 7443 (just like in the joke of the divorcing couple) with a size of 3.63

                                  @student said in Execute trade immediatly after a stop is hit:

                                  Yes I am using leverage

                                  Without code ... a statement out of thin air.

                                  @student said in Execute trade immediatly after a stop is hit:

                                  I can't understand why I'm getting margin called?

                                  Neither can anyone.

                                  @student said in Execute trade immediatly after a stop is hit:
                                  I have no other positions open, no other orders?

                                  Only you know that.

                                  My recommendation:

                                  • Write a small snippet in which you try to use leverage at the given bar (7401) with the given cash (9801)

                                  A lot easier than trying to debug your, for sure, a lot more complex script which involves Stop here and there, and then orders and ...

                                  1 Reply Last reply Reply Quote 0
                                  • S
                                    student last edited by

                                    I've stripped the code and data down and stuck it in a google colab here https://colab.research.google.com/drive/14Jz3DYBjIejVIcir4BInlw1kUF2hEOJr . You can run it in your browser my pressing the play button next to the code. As you can see, same problem still occurs.

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

                                      I am not in the habit of clicking on links here and there. Maybe someone else is.

                                      1 Reply Last reply Reply Quote 0
                                      • S
                                        student last edited by

                                        Okay I will post the code here as well

                                        import backtrader as bt
                                        import pandas as pd
                                        import datetime
                                        # get data
                                        data = pd.read_csv('https://pastebin.com/raw/8gah3XhH')
                                        # convert timestamp to datetime object
                                        data['timestamp'] = pd.to_datetime(data['timestamp'], utc=True)
                                        data.set_index('timestamp', inplace=True)
                                        class TestStrat(bt.Strategy):
                                            params = dict(
                                                printout=True
                                            )
                                            # Stuff for logging
                                            def log(self, txt, dt=None):
                                                if self.p.printout:
                                                    dt = dt or self.data.datetime[0]
                                                    dt = bt.num2date(dt)
                                                    print('%s, %s' % (dt.isoformat(), txt))
                                        …            self.log('Order Rejected')
                                                # Sentinel to None: new orders allowed
                                                self.order = None
                                        
                                            def next(self):
                                                if self.data.datetime.time() == datetime.time(8,40):
                                                    self.buy(size=3.63)
                                        # Create a cerebro entity
                                        cerebro = bt.Cerebro()
                                        
                                        # Add strategy
                                        cerebro.addstrategy(TestStrat)
                                        
                                        # Pass it to the backtrader datafeed and add it to the cerebro
                                        data = bt.feeds.PandasData(dataname=data)
                                        
                                        # Resample it to 5 min bars
                                        cerebro.resampledata(data,
                                                             timeframe=bt.TimeFrame.Minutes,
                                                             compression=5)
                                        
                                        cerebro.broker.setcash(10000)
                                        
                                        cerebro.run()
                                        

                                        What prints to the console:

                                        2019-10-24T08:40:00, ORDER ACCEPTED/SUBMITTED
                                        2019-10-24T08:45:00, Order Margin
                                        2019-10-25T08:40:00, ORDER ACCEPTED/SUBMITTED
                                        2019-10-25T08:45:00, Order Margin
                                        2019-10-26T08:40:00, ORDER ACCEPTED/SUBMITTED
                                        2019-10-26T08:45:00, Order Margin
                                        

                                        A snippet of the data

                                        2019-10-24 08:38:00+00:00,7440.5,7440.5,7434.0,7436.0
                                        2019-10-24 08:39:00+00:00,7436.0,7441.5,7435.5,7441.0
                                        2019-10-24 08:40:00+00:00,7441.0,7443.0,7441.0,7443.0
                                        2019-10-24 08:41:00+00:00,7443.0,7446.5,7442.5,7444.0
                                        2019-10-24 08:42:00+00:00,7444.0,7444.5,7444.0,7444.5
                                        2019-10-24 08:43:00+00:00,7444.5,7444.5,7444.0,7444.5
                                        2019-10-24 08:44:00+00:00,7444.5,7445.0,7444.0,7444.5
                                        2019-10-24 08:45:00+00:00,7444.5,7444.5,7441.5,7442.0
                                        2019-10-24 08:46:00+00:00,7442.0,7442.0,7441.5,7442.0
                                        2019-10-24 08:47:00+00:00,7442.0,7446.5,7441.5,7446.0
                                        2019-10-24 08:48:00+00:00,7446.0,7446.5,7443.5,7444.0
                                        2019-10-24 08:49:00+00:00,7444.0,7444.0,7443.0,7443.0
                                        2019-10-24 08:50:00+00:00,7443.0,7443.5,7443.0,7443.5
                                        
                                        1 Reply Last reply Reply Quote 0
                                        • B
                                          backtrader administrators last edited by

                                          Cash is 10000, asset has a value of 7400ish and you want to buy a size of 3.63.

                                          Why shouldn't the order be rejected?

                                          1 Reply Last reply Reply Quote 0
                                          • S
                                            student last edited by

                                            I thought you could use leverage/margin in backtrader? I can use it for shorts it seems but not longs?

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