Back to Community
Unexpected behavior with order_target_percent method

Debugging an algorithm I notice an unexpected behavior with order_target_percent. I cannot said it is a bug, but it is something I didn't expect. The case is simple. It happens if I open a position and then I execute order_target_percent(sid, 0) twice. instead of being 100% sold, I am 100% short on it.
In my opinion, it seems like order_target_percent is internally calling to order. So when I call order_target_percent(sid, 0) twice, it is in fact executing two sells, reason why I finish 100% short in the asset.

I attach an example to illustrate this behavior.
I just want to clarify that I don't write two order_target_percent(sid, 0) consecutive intentionally. I was working in an algorithm with several rules, and there are several rules that sell my position. When I debug, I realized I was short in the position instead of being out of it.

Clone Algorithm
0
Loading...
Backtest from to with initial capital
Total Returns
--
Alpha
--
Beta
--
Sharpe
--
Sortino
--
Max Drawdown
--
Benchmark Returns
--
Volatility
--
Returns 1 Month 3 Month 6 Month 12 Month
Alpha 1 Month 3 Month 6 Month 12 Month
Beta 1 Month 3 Month 6 Month 12 Month
Sharpe 1 Month 3 Month 6 Month 12 Month
Sortino 1 Month 3 Month 6 Month 12 Month
Volatility 1 Month 3 Month 6 Month 12 Month
Max Drawdown 1 Month 3 Month 6 Month 12 Month
# Backtest ID: 58e341c2eef3f81fb3348f55
There was a runtime error.
2 responses

Order_target_percent's limitation is that it does not take into account orders already placed. You will have to account for that with something like:

if get_open_orders(): continue

This is one of the reasons why I recommend writing your own ordering logic using order() and not using the target functions in any sort of live trading. The other reason being unrestricted use of leverage by the target functions.

Or order_value(). A route I use often:

cancel_open_orders(context, data) and then in loop ...

order_value(stock, weight * context.portfolio.cash)