Открыть на GitHub

Стратегия Expert Alligator

Expert Alligator — это перенос встроенного эксперта MetaTrader 5 Expert_Alligator.mq5 на платформу StockSharp. В оригинале торговые решения строятся вокруг индикатора Аллигатор Билла Вильямса: три сглаженных скользящих средних (челюсть, зубы, губы) рассчитываются по медианной цене и сдвигаются на несколько баров вперёд. Эксперт отслеживает, как линии сходятся и расходятся, чтобы определить момент нового пересечения, и запрещает повторный вход, пока «рот аллигатора» снова не раскроется. Переписанная на C# стратегия повторяет эту схему, используя высокоуровневый API StockSharp и готовые индикаторы.

Логика торговли

  1. Подготовка индикаторов

    • Для каждой завершённой свечи рассчитывается медианная цена (High + Low) / 2, которая подаётся на три индикатора SmoothedMovingAverage с периодами 13, 8 и 5.
    • Полученные значения сдвигаются вперёд на 8, 5 и 3 бара соответственно, а также сохраняются в фиксированных буферах, что позволяет воспроизвести обращения к индексам -2, -1, 0, 1, присутствующим в MQL5.
  2. Условия входа

    • Покупка выполняется, когда разницы «губы-зубы» и «зубы-челюсть» трижды подряд сокращаются, оставаясь положительными. Это соответствует пересечению зелёной линии сверху вниз и началу раскрытия аллигатора вверх.
    • Продажа симметрична: разницы становятся всё более отрицательными, что означает пересечение губ снизу вверх и раскрытие «рта» вниз.
    • После открытия позиции устанавливается флаг crossed, блокирующий новые сделки до тех пор, пока расстояния между линиями не увеличатся минимум на величину параметра Cross Measure (в пунктах MetaTrader).
  3. Условия выхода

    • Закрытие лонга происходит, если последняя сдвинутая разница «губы-зубы» становится отрицательной, тогда как два более старых значения остаются неотрицательными (-1, 0, 1 в исходном коде).
    • Закрытие шорта выполняется при зеркальной смене знака.

Параметры

Имя Описание Значение по умолчанию
Order Volume Объём заявки для BuyMarket/SellMarket (в лотах или контрактах). 0.1
Candle Type Тип свечей, используемый в расчётах. 1 час
Jaw Period Период сглаженного среднего для линии челюсти. 13
Jaw Shift Сдвиг линии челюсти вперёд (в барах). 8
Teeth Period Период сглаженного среднего для линии зубов. 8
Teeth Shift Сдвиг линии зубов вперёд. 5
Lips Period Период сглаженного среднего для линии губ. 5
Lips Shift Сдвиг линии губ вперёд. 3
Cross Measure Минимальная ширина раскрытия (в пунктах), необходимая перед следующим входом. 5

Особенности реализации

  • Все вычисления выполняются только на закрытых свечах (CandleStates.Finished), что повторяет поведение MetaTrader.
  • История значений индикаторов хранится в массивах фиксированной длины, поэтому стратегия может безопасно получать как «прошлые», так и «будущие» значения, возникающие из-за сдвига линий Аллигатора вперёд.
  • Значение _Point из MQL5 аппроксимировано шагом цены инструмента (PriceStep). Если он неизвестен, используется 10^-Decimals либо запасной вариант 0.0001.
  • На диаграмме автоматически рисуются свечи и три линии Аллигатора, что помогает визуально сверить поведение порта и оригинального эксперта.

Использование

  1. Подключите стратегию к Connector, обеспечивающему поток данных и формирование требуемых свечей (по умолчанию — часовой таймфрейм).
  2. После подписки на данные вызовите Start() для запуска.
  3. При необходимости измените периоды, сдвиги или порог Cross Measure, чтобы протестировать собственные настройки.
  4. Контролируйте сделки и результат через стандартные инструменты StockSharp.

Исходный эксперт управляет рисками только фиксированным объёмом и геометрией линий Аллигатора, поэтому в переносе отсутствуют дополнительные блоки мани-менеджмента или трейлинг-стопов.

using System;

using Ecng.Common;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Expert Alligator strategy: Triple SMA (Alligator concept).
/// Buys when lips > teeth > jaw (bullish alignment).
/// Sells when lips < teeth < jaw (bearish alignment).
/// </summary>
public class ExpertAlligatorStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;

	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	public ExpertAlligatorStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		// Alligator: Jaw=13, Teeth=8, Lips=5
		var lips = new SimpleMovingAverage { Length = 5 };
		var teeth = new SimpleMovingAverage { Length = 8 };
		var jaw = new SimpleMovingAverage { Length = 13 };

		decimal? prevLips = null;
		decimal? prevTeeth = null;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(lips, teeth, jaw, (candle, lipsVal, teethVal, jawVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				if (prevLips.HasValue && prevTeeth.HasValue)
				{
					var lipsCrossUp = prevLips.Value <= prevTeeth.Value && lipsVal > teethVal;
					var lipsCrossDown = prevLips.Value >= prevTeeth.Value && lipsVal < teethVal;

					if (lipsCrossUp && teethVal > jawVal && Position <= 0)
						BuyMarket();
					else if (lipsCrossDown && teethVal < jawVal && Position >= 0)
						SellMarket();
				}

				prevLips = lipsVal;
				prevTeeth = teethVal;
			})
			.Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, lips);
			DrawIndicator(area, teeth);
			DrawIndicator(area, jaw);
			DrawOwnTrades(area);
		}
	}
}