Открыть на GitHub

Стратегия Alligator Candle Cross

Стратегия переносит советники MetaTrader alligator candle cross up/down на высокоуровневый API StockSharp. Она отслеживает индикатор Bill Williams Alligator, построенный из сглаженных скользящих средних медианной цены, и реагирует, когда тело завершившейся свечи переходит с одной стороны «пасти» Аллигатора на другую. Через параметр можно ограничить сделки только длинным, только коротким или обоими направлениями, а риск управляется фиксированными стопами и целями в пунктах.

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

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

  • Рассчитываются линии Jaw, Teeth и Lips Аллигатора с классическими периодами 13/8/5.
  • Применяются стандартные смещения вперёд (8/5/3 бара по умолчанию), чтобы сравнивать значения линий со свечой, которая формируется перед ними.
  • Цены берутся из медианы свечи (High + Low) / 2, что повторяет реализацию в MetaTrader.

Условия для покупок («candle cross up»)

  1. Закрытие предыдущей завершённой свечи находится на уровне или ниже минимальной линии Аллигатора (с учётом смещения).
  2. Текущее тело свечи открывается на уровне или ниже максимального смещённого значения Аллигатора и закрывается выше него, то есть пересекает «пасть» вверх.
  3. Открытых позиций нет, торговля разрешена.
  4. При выполнении условий отправляется рыночная заявка Buy с заданным объёмом.

Условия для продаж («candle cross down»)

  1. Закрытие предыдущей свечи находится на уровне или выше максимальной смещённой линии Аллигатора.
  2. Текущее тело свечи открывается на уровне или выше минимального смещённого значения и закрывается ниже него, подтверждая пересечение вниз.
  3. Позиция отсутствует, торговля разрешена.
  4. Отправляется рыночная заявка Sell на заданный объём.

Управление позицией

  • После открытия позиции стоп-лосс и тейк-профит переводятся из пунктов в абсолютные цены через шаг цены инструмента.
  • Длинная позиция закрывается при достижении стоп-лосса, тейк-профита или при закрытии свечи ниже минимума смещённых линий Teeth и Lips.
  • Короткая позиция закрывается при срабатывании стоп-лосса, тейк-профита или при закрытии выше максимума смещённых линий Teeth и Lips.
  • В начале работы вызывается StartProtection, чтобы защитить счёт от нештатных исполнений.

Параметры

Имя Тип Значение по умолчанию Описание
OrderVolume decimal 0.1 Объём сделки в лотах или контрактах.
StopLossPips int 50 Расстояние до защитного стопа в пунктах. Ноль отключает стоп.
TakeProfitPips int 50 Расстояние до фиксированного тейк-профита в пунктах. Ноль отключает цель.
JawPeriod int 13 Период сглаженной средней линии челюсти Аллигатора.
JawShift int 8 Смещение линии челюсти вперёд перед оценкой сигналов.
TeethPeriod int 8 Период сглаженной средней линии зубов Аллигатора.
TeethShift int 5 Смещение линии зубов.
LipsPeriod int 5 Период сглаженной средней линии губ Аллигатора.
LipsShift int 3 Смещение линии губ.
CandleType DataType TimeSpan.FromHours(1).TimeFrame() Таймфрейм свечей для расчётов.
EntryMode AlligatorCrossMode Both Выбор направления торговли: только покупки, только продажи или оба варианта.

Примечания по использованию

  • Стратегия подходит для любого инструмента StockSharp; установите CandleType в соответствии с таймфреймом оригинального шаблона MetaTrader.
  • Пункты вычисляются из шага цены: для котировок с 3 или 5 знаками (например, EURUSD) один пункт равен десяти шагам цены.
  • Логика работает только с завершёнными свечами и не использует тиковые данные, что облегчает сопоставление с тестами MetaTrader.
namespace StockSharp.Samples.Strategies;

using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;

/// <summary>
/// Alligator Candle Cross strategy: DEMA trend crossover.
/// Buys when close crosses above DEMA, sells when close crosses below.
/// </summary>
public class AlligatorCandleCrossStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _period;

	private decimal _prevClose;
	private decimal _prevDema;
	private bool _hasPrev;

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

	public AlligatorCandleCrossStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_period = Param(nameof(Period), 50)
			.SetGreaterThanZero()
			.SetDisplay("Period", "DEMA period", "Indicators");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevClose = 0;
		_prevDema = 0;
		_hasPrev = false;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevClose = 0;
		_prevDema = 0;
		_hasPrev = false;
		var dema = new ExponentialMovingAverage { Length = Period };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(dema, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal demaValue)
	{
		if (candle.State != CandleStates.Finished) return;

		if (_hasPrev)
		{
			if (_prevClose <= _prevDema && candle.ClosePrice > demaValue && Position <= 0)
				BuyMarket();
			else if (_prevClose >= _prevDema && candle.ClosePrice < demaValue && Position >= 0)
				SellMarket();
		}

		_prevClose = candle.ClosePrice;
		_prevDema = demaValue;
		_hasPrev = true;
	}
}