Limit order trade entry not correct
-
Hello, I am in need of help to understand limit orders and why the following code doesn't execute like what the docs says.
Here is my strategy:class backtestCSV(bt.feeds.GenericCSVData): params = ( ('datetime', 0), ('open', 1), ('high', 2), ('low', 3), ('close', 4), ('volume', 5), ('openinterest', -1), ('timeframe', bt.TimeFrame.Ticks), ('compression', 1), ('dtformat', '%Y-%m-%d %H:%M:%S.%f'), ) class testStrategy(bt.Strategy): def __init__(self): self.bought = False def notify_order(self, order): print("ORDER:", self.datetime.datetime(ago=0), order.exectype, order.status, self.data0.close[0]) def notify_trade(self, trade): print("TRADE:", self.datetime.datetime(ago=0), trade.status, self.data0.close[0]) def next(self): if self.bought == False: entry_price = 2.0 self.buy(exectype=bt.Order.Limit, price=entry_price) self.bought = True print("BUY:", self.datetime.datetime(ago=0), entry_price)
and here is the data:
2019-01-01 00:00:00.950,1.00368,1.00368,1.00368,1.00368,29000 2019-01-01 00:00:01.176,1.00368,1.00368,1.00368,1.00368,81000 2019-01-01 00:00:02.248,1.00367,1.00367,1.00367,1.00367,50000 2019-01-01 00:00:02.506,1.00368,1.00368,1.00368,1.00368,94000 2019-01-01 00:00:02.608,1.00369,1.00369,1.00369,1.00369,56000 2019-01-01 00:00:02.709,1.00370,1.00370,1.00370,1.00370,57000 2019-01-01 00:00:05.864,1.00370,1.00370,1.00370,1.00370,93000 2019-01-01 00:00:05.966,1.00372,1.00372,1.00372,1.00372,64000 2019-01-01 00:00:06.068,1.00374,1.00374,1.00374,1.00374,57000 2019-01-01 00:00:06.173,1.00374,1.00374,1.00374,1.00374,95000 2019-01-01 00:00:06.274,1.00375,1.00375,1.00375,1.00375,38000 2019-01-01 00:00:06.434,1.00375,1.00375,1.00375,1.00375,45000 2019-01-01 00:00:07.360,1.00375,1.00375,1.00375,1.00375,93000 2019-01-01 00:00:09.092,1.00374,1.00374,1.00374,1.00374,01000 2019-01-01 00:00:09.143,1.00372,1.00372,1.00372,1.00372,63000 2019-01-01 00:00:09.296,1.00372,1.00372,1.00372,1.00372,76000 2019-01-01 00:00:09.499,1.00372,1.00372,1.00372,1.00372,28000 2019-01-01 00:00:09.601,1.00372,1.00372,1.00372,1.00372,56000 2019-01-01 00:00:09.982,1.00372,1.00372,1.00372,1.00372,56000 2019-01-01 00:00:10.084,1.00372,1.00372,1.00372,1.00372,58000 2019-01-01 00:00:10.186,1.00373,1.00373,1.00373,1.00373,68000 2019-01-01 00:00:10.287,1.00373,1.00373,1.00373,1.00373,19000 2019-01-01 00:00:12.072,1.00372,1.00372,1.00372,1.00372,65000 2019-01-01 00:00:12.174,1.00370,1.00370,1.00370,1.00370,25000 2019-01-01 00:00:13.738,1.00371,1.00371,1.00371,1.00371,76000 2019-01-01 00:00:13.960,1.00370,1.00370,1.00370,1.00370,92000 2019-01-01 00:00:14.076,1.00371,1.00371,1.00371,1.00371,76000 2019-01-01 00:00:14.372,1.00372,1.00372,1.00372,1.00372,93000 2019-01-01 00:00:14.474,1.00371,1.00371,1.00371,1.00371,39000 2019-01-01 00:00:14.575,1.00371,1.00371,1.00371,1.00371,12000 2019-01-01 00:00:14.802,1.00370,1.00370,1.00370,1.00370,25000 2019-01-01 00:00:15.886,1.00371,1.00371,1.00371,1.00371,94000 2019-01-01 00:00:15.987,1.00372,1.00372,1.00372,1.00372,85000 2019-01-01 00:00:16.088,1.00371,1.00371,1.00371,1.00371,94000 2019-01-01 00:00:16.804,1.00373,1.00373,1.00373,1.00373,62000 2019-01-01 00:00:16.905,1.00374,1.00374,1.00374,1.00374,69000 2019-01-01 00:00:17.007,2.00375,2.00375,2.00375,2.00375,86000 2019-01-01 00:00:17.136,2.00374,2.00374,2.00374,2.00374,47000 2019-01-01 00:00:17.237,2.00374,2.00374,2.00374,2.00374,94000 2019-01-01 00:00:17.795,2.00375,2.00375,2.00375,2.00375,87000 2019-01-01 00:00:18.226,2.00375,2.00375,2.00375,2.00375,44000
And here is STDOUT
BUY: 2019-01-01 00:00:01.176004 2.0 ORDER: 2019-01-01 00:00:02.247996 2 1 1.00367 ORDER: 2019-01-01 00:00:02.247996 2 2 1.00367 ORDER: 2019-01-01 00:00:02.247996 2 4 1.00367 TRADE: 2019-01-01 00:00:02.247996 1 1.00367
Can somebody tell me why the trade happens at 00:00:02 when the price is still at 1.00. Shouldn't happen at 00:00:17 when the price has reached 2.0, which is the price I set for the limit order?
-
IIUC, you've just submitted the limit buy order with a limit price set to 2.0 - meaning the order should be executed at the price <=2.0 - which is exactly what has happened at the next bar. Anything wrong with that ?
-
I was reading this post:
https://backtest-rookies.com/2018/08/31/backtrader-bracket-orders/and it said this:
Stop Entry, Stop Loss and Take Profit
Sometimes we may want to enter a position at a price which is worse than what we can have right now. We might choose to do this when looking for confirmation that price will continue moving in a certain direction. Another reason might be to try and catch a breakout. To enter with a stop order we just change the exectype like so: self.sell_bracket(limitprice=short_tp, price=entry, stopprice=short_stop, exectype=bt.Order.Limit)I guess this is incorrect. You are saying this is not how to do entry at a worse price. Is this even possible then?
-
@kr the text you shown is not from the official docs. Link to official docs - Docs - Orders - Creation/Execution. If you want the order to be executed at set price or worse, than use
stop
order.Limit
order executes on the set price or better. -
@ab_trader that works perfectly. Thank you very much!
-
@kr said in Limit order trade entry not correct:
def notify_trade(self, trade): print("TRADE:", self.datetime.datetime(ago=0), trade.status, self.data0.close[0])
and
Adding to the answers above.
t
@kr said in Limit order trade entry not correct:
ORDER: 2019-01-01 00:00:02.247996 2 4 1.00367 TRADE: 2019-01-01 00:00:02.247996 1 1.00367
That's NOT the trade time or the order execution time. That's the current
datetime
kept by the strategy by tracking the latest timestamp reported by the different data feeds.Order execution data is kept in the attribute
order.executed
.See: Docs - Order - https://www.backtrader.com/docu/order/
Furthermore, an order has different states notified and the code is accounting for none to understand when the execution is reported as
Complete
.The same with trade.