For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See:

How can I get the price at which buy executed?

  • Hello. I'm trying to make a exit strategy that clears a position if the current price is lower than the price at which buy executed for the last time, for example, like the below.

    if self.price_executed < self.dataclose[0]:
    self.order = self.sell()

    I wonder how I can get the price of the last buy execution .

    Thank you for reading this!

  • There is

    def notify_order(self, order)

    event in strategy.

    Read the quickstart:

  • administrators

    The notified order contains two fields:

    • order.created


    • order.executed

    The second contains further fields like price, to indicate the matching price. As pointed out by @Maxim-Korobov , the QuickStart contains code using it:

    self.log('BUY EXECUTED, %.2f' % order.executed.price)

  • @backtrader

    Thank you for your answer! I'm following the QuickStart and now I understand that the command shows executed prices, but I actually don't understand how to use it in the function to compare the two prices. Here's the error I get and what I tried.

        Traceback (most recent call last):
    File "D:\PYTHON_SOURCE\", line 159, in <module>
    File "D:\Anaconda3\lib\site-packages\backtrader\", line 794, in run
      runstrat = self.runstrategies(iterstrat)
    File "D:\Anaconda3\lib\site-packages\backtrader\", line 919, in runstrategies
    File "D:\Anaconda3\lib\site-packages\backtrader\", line 1294, in _runonce
    File "D:\Anaconda3\lib\site-packages\backtrader\", line 267, in _oncepost
    File "D:\PYTHON_SOURCE\", line 108, in next
      if order.executed.price < self.dataclose[0]:
    NameError: name 'order' is not defined
    def next(self): 
        self.log('Close, %.2f' % self.dataclose[0])
        if self.order:
        if not self.position:
            if self.stoch[0] > 80:
                self.log('BUY CREATE, %.2f' % self.dataclose[0])
                self.order =
            if order.executed.price < self.dataclose[0]:    #ERROR OCCURS HERE
                self.log('SELL CREATE, %.2f' % self.dataclose[0])
                self.order = self.sell()

  • administrators

    You need to keep a reference to the order notified in notify_order, to later use it in next.

  • @backtrader
    I'm sorry. I'm new to Object Oriented Programming and Python. Do you mean that I need to add order to next as a method parameter? I wonder why def notify_order(self, order): can get order.executed.price when it occurs error in def next(self, order):
    I would appreciate it if you could give me an example code, if it doesn't take too much of your time.

  • administrators

    Since your nickname is also nullpy, the assumption is that also Python is not your strongest point and not only OOP.

    A very sincere recommendation is to polish your Python skills before using backtrader or any other algorithmic trading platform. A winning algorithm is not going to be so simple and will have several interactions between not only methods of the same class/instance but with many other.

    In any case: def next(self, order) doesn't exist. The signature of the method is in every code sample def next(self). No order is sent to next.

  • @backtrader
    Yes, I think I should study more on the language. Thank you for your recommendation. I will try to find ou how the program works!

Log in to reply