Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
Weird behaviour of StopLoss

In the attached code I get a weird behaviour of StopLoss order. According to my logic there should never be more than 100 stocks on my portfolio. Still, this can get to astronomical values 'position'. Is it a bug or a logical flaw in my thinking. Thanks.
I'm tracking my stock amount with the green line in the second graph.

7 responses

It's your code. The stoploss function doesn't work like most people think it does. Lets say you order 100 shares with a stoploss. I think Quantopian will generate an open order for -100 shares. Which is fine. But if you sell it, the stoploss order is still open, and when the shares eventually drop, it triggers the -100 shares order even if you already have 0 shares.

I've also tried to use it like this:

order_target(stock, 100, style=StopOrder(price * (1.0+context.SLmargin)))  

Still doesn't work. This would be the logical way I'd use it.

When you make two requests like in the source code I've shared above, is there a way to chain/link the two requests together so that you don't have to keep track of both of them?

Not that I know of. Maybe someone else will chime in.

What I have done is to hard code the stop loss into handle_data(). I record all stock buys into a dataframe and check at every handle_data(). Others have used a separate function called cancel_everything() https://www.quantopian.com/posts/how-to-cancel-all-open-orders. You have to time cancel_everything well, or else the stoploss won't work when it needs to, or it'll interfere with your active trades. It was too confusing for me to track, so that's why I hard coded it.

You're running into a common problem with our API. It's on the list of items that we are going to re-work this summer to make them more intuitive. I'm sorry it's causing a problem.

What's happening is that you are placing your orders to both open and close the position in the same bar. The order to open the position is being placed as you'd expect. The order to close, the stop-loss, is where it gets tricky. You're using order_target(), and telling it that you want a target of 0 (zero). At the moment you're attempting to place that order, your position is actually zero, and the order is moot. Your order to open has not yet filled, so there is no position to close.

One common way to handle this is to wrap your stop-loss order in a "check open orders" type logic. Don't place your stop-loss until all orders are filled or cancelled. There are other ways, too.

Sorry for the confusion on this one.

Disclaimer

The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by Quantopian. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. No information contained herein should be regarded as a suggestion to engage in or refrain from any investment-related course of action as none of Quantopian nor any of its affiliates is undertaking to provide investment advice, act as an adviser to any plan or entity subject to the Employee Retirement Income Security Act of 1974, as amended, individual retirement account or individual retirement annuity, or give advice in a fiduciary capacity with respect to the materials presented herein. If you are an individual retirement or other investor, contact your financial advisor or other fiduciary unrelated to Quantopian about whether any given investment idea, strategy, product or service described herein may be appropriate for your circumstances. All investments involve risk, including loss of principal. Quantopian makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances.

so basically the problem is order_target doesn't take into account currently open orders?

That's right, order_target functions don't take into account the open orders

Disclaimer

The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by Quantopian. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. No information contained herein should be regarded as a suggestion to engage in or refrain from any investment-related course of action as none of Quantopian nor any of its affiliates is undertaking to provide investment advice, act as an adviser to any plan or entity subject to the Employee Retirement Income Security Act of 1974, as amended, individual retirement account or individual retirement annuity, or give advice in a fiduciary capacity with respect to the materials presented herein. If you are an individual retirement or other investor, contact your financial advisor or other fiduciary unrelated to Quantopian about whether any given investment idea, strategy, product or service described herein may be appropriate for your circumstances. All investments involve risk, including loss of principal. Quantopian makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances.

Thanks for clarifying this. Maybe the documentation online needs to be updated as well so other users will get it right.