Four Up Days and Short for 1% Profit
Cтратегия является разновидностью стратегии Four Down Days. Вариант «день с повышением», который использует дни с повышением, а не с понижением, но также обеспечивает выполнение двух дополнительных условий. Первое условие - четвертый день должен быть огромным (2% и более). Уже через 3 дня рост на 2% на четвертый день будет весьма впечатляющим.
Теоретически такой скачок на четвертый день был бы сильным приглашением для держателей длинных акций забрать часть прибыли со стола на следующее утро, тем самым снизив цену. Таким образом, эта стратегия выставляет короткий ордер на закрытие четвертого дня для исполнения на открытии пятого дня.
Второе условие заключается в том, что стратегия завершается, когда она достигает цели прибыли в 1%, и использует лимитный ордер для реализации выхода в течение торгового дня 5. Если позиция все еще открыта в конце дня 5, стратегия выдает рыночный ордер. для закрытия позиции для исполнения при открытии рынка в 6-й день.
Код
using OpenQuant.API;
public class MyStrategy : Strategy
{
[Parameter("Order quantity (number of contracts to trade)")]
double Qty = 100;
// exit with a profit target of 1%
[Parameter("Profit Target")]
double ProfitTarget = 1;
// last day up must be a big 2% up day
[Parameter("Up Move")]
double UpPercent = 2;
// Number of consecutive down closes
[Parameter("Number of consecutive down closes")]
int ConsClosesCount = 4;
// count of up days
int count;
double prevClose;
// orders
Order buyOrder;
Order sellOrder;
public override void OnStrategyStart()
{
prevClose = -1;
count = 0;
}
public override void OnBar(Bar bar)
{
// we need to let a bar go by to capture the prev close
if (prevClose != -1)
{
// if we don't have a position open, update the count
// of up days, and try to enter a trade
if (!HasPosition)
{
if (prevClose < bar.Close)
count++;
else
count = 0;
// if we have seen 4 (consClosesCount is equal to 4 by default) up days, AND if the last day
// up was 2% or more, then open a new position,
// going short on the day's close
if (count == ConsClosesCount)
{
if ((bar.Close - prevClose) / prevClose >= UpPercent / 100)
{
sellOrder = MarketOrder(OrderSide.Sell, Qty, "Entry");
sellOrder.Send();
}
}
}
// if we have a position open, cancel our previous
// 1% profit target order, and close using a market order
else
{
buyOrder.Cancel();
Buy(Qty, "Buy Cover");
}
}
// now today's close becomes the previous close
prevClose = bar.Close;
}
public override void OnPositionOpened()
{
// when we open a position, immediately issue a limit order
// for our 1% profit target
double target_price = sellOrder.AvgPrice * (1 - ProfitTarget / 100);
buyOrder = BuyLimitOrder(Qty, target_price, "Exit (Take Profit)");
buyOrder.Send();
}
}