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();
	}
}