5% Down-In-One-Day Panic Recovery

C#
Published

March 10, 2021

Концепция, лежащая в основе этой стратегии, заключается в том, что иногда рынок паникует из-за некоторых новостей и на короткое время снижается курс акций. Через несколько часов люди оправляются от паники, понимают, что цена акций слишком низкая, и начинают покупать.

В конце каждого торгового дня эта стратегия получает дневной бар в обработчике события OnBar. Если позиция не открыта, стратегия использует сегодняшнюю цену закрытия для расчета новой лимитной цены, которая на 5% ниже сегодняшней цены закрытия, и выдает лимитный ордер на покупку, который будет исполнен при открытии рынка на следующий день.

Напротив, если позиция открыта в конце дня, это означает, что где-то сегодня произошел 5% -ный разрыв, и поэтому стратегия немедленно закрывает позицию с помощью рыночного ордера (который будет выполнен при открытии рынка на следующее утро).

Код



using OpenQuant.API;

public class MyStrategy : Strategy
{
    [Parameter("Buy when a stock drops this number of percents in one day")]
    double Percent = 5;

    [Parameter("Order quantity (number of contracts to trade)")]
    double Qty = 100;

    Order buyOrder;

    public override void OnBar(Bar bar)
    {
        // if we do not have a position, update the limit buy order to be 5% above today's close
        if (!HasPosition)
        {
            // cancel the old limit order (it's out of date now)
            if (buyOrder != null)
                buyOrder.Cancel();

            // issue a new buy order at 5% below today's close this order will execute tomorrow 
            // if price is matched
            double buy_price = bar.Close * (1 - (Percent / 100));

            buyOrder = BuyLimitOrder(Qty, buy_price, "Entry");
            buyOrder.Send();
        }

        // else we opened a position today using our limit order from yesterday, so now close 
        // the position at the end of today. We expect that such a big drop was freaky, and that 
        // prices recovered during the day. If not, this order stops further losses.
        else
            Sell(Qty, "Exit");
    }
}