Открыть на GitHub

Стратегия Exp ColorX2MA X2

Стратегия переносит эксперт "Exp_ColorX2MA_X2" на StockSharp. Для определения тенденции используется ColorX2MA на старшем таймфрейме, а для входов — ColorX2MA на младшем таймфрейме. Каждый индикатор ColorX2MA формируется последовательным применением двух скользящих средних, после чего линия раскрашивается в зависимости от направления наклона. Сделки открываются, когда цвет на младшем таймфрейме меняется в сторону цвета на старшем таймфрейме.

Поддерживаются все формулы прикладной цены из оригинального индикатора и наиболее используемые методы сглаживания (SMA, EMA, SMMA, LWMA, Jurik). Если у Jurik есть свойство Phase, оно заполняется заданным значением.

Правила торговли

  • Вход в лонг
    • Цвет ColorX2MA на старшем таймфрейме бычий (trend direction > 0).
    • Цвет ColorX2MA на младшем таймфрейме изменился с бычьего на предыдущем баре на нейтральный или медвежий на последнем закрытом баре (Clr[1] == 1, Clr[0] != 1).
    • Разрешена торговля в лонг.
  • Вход в шорт
    • Цвет ColorX2MA на старшем таймфрейме медвежий (trend direction < 0).
    • Цвет ColorX2MA на младшем таймфрейме изменился с медвежьего на предыдущем баре на нейтральный или бычий на последнем закрытом баре (Clr[1] == 2, Clr[0] != 2).
    • Разрешена торговля в шорт.
  • Выход из лонга
    • Появился медвежий цвет на младшем таймфрейме (Clr[1] == 2) и включено вторичное закрытие лонгов, или старший тренд сменился на медвежий при активном первичном закрытии.
  • Выход из шорта
    • Появился бычий цвет на младшем таймфрейме (Clr[1] == 1) и включено вторичное закрытие шортов, или старший тренд сменился на бычий при активном первичном закрытии.
  • Стопы
    • Необязательные стоп-лосс и тейк-профит указываются в пунктах (умножаются на шаг цены) и проверяются на каждой закрытой свече младшего таймфрейма по экстремумам свечи и средней цене позиции.

Параметры по умолчанию

  • Старший таймфрейм: свечи по 6 часов.
  • Младший таймфрейм: свечи по 30 минут.
  • Сглаживание тренда: SMA(12) → Jurik(5, фаза 15).
  • Сглаживание сигналов: SMA(12) → Jurik(5, фаза 15).
  • Цена: Close.
  • Сдвиг сигналов: 1 бар на обоих таймфреймах.
  • Разрешения: включены входы и выходы в обе стороны.
  • Стоп-лосс: 1000 пунктов (пересчитывается через шаг цены).
  • Тейк-профит: 2000 пунктов (пересчитывается через шаг цены).

Фильтры и заметки

  • Направление: двусторонняя торговля, управляется флагами разрешений.
  • Таймфрейм: двухтаймфреймовая структура (тренд + сигналы).
  • Индикаторы: двухуровневый ColorX2MA с настраиваемыми методами сглаживания.
  • Поддержка сглаживания: Sma, Ema, Smma, Lwma, Jurik. Остальные режимы из библиотеки не реализованы.
  • Прикладные цены: все 12 формул включая TrendFollow и Demark.
  • Стопы: опциональные фиксированные стоп-лосс и тейк-профит.
  • Сложность: средняя из-за синхронизации таймфреймов и буферов цветов.
  • Подходит для: трендовых стратегий на FX, индексах или криптовалютах, где используется ColorX2MA.

Рекомендации

  • Поддерживайте заметную разницу между старшим и младшим таймфреймами, чтобы снизить шум.
  • Изменяйте параметр SignalSignalBar для ускорения или сглаживания сигналов.
  • Если у инструмента отсутствует PriceStep, расстояния стопов и целей трактуются напрямую в ценовых единицах.
  • Для Jurik требуется лицензия на соответствующий индикатор в StockSharp; при её отсутствии используйте другие методы сглаживания.
using System;
using System.Collections.Generic;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// ColorX2MA X2 strategy (simplified). Uses dual EMA smoothing to detect trend color transitions.
/// Buys when the smoothed MA turns up, sells when it turns down.
/// </summary>
public class ExpColorX2MaX2Strategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastLength;
	private readonly StrategyParam<int> _slowLength;

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

	public int FastLength
	{
		get => _fastLength.Value;
		set => _fastLength.Value = value;
	}

	public int SlowLength
	{
		get => _slowLength.Value;
		set => _slowLength.Value = value;
	}

	public ExpColorX2MaX2Strategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
			.SetDisplay("Candle Type", "Candles", "General");

		_fastLength = Param(nameof(FastLength), 12)
			.SetGreaterThanZero()
			.SetDisplay("Fast Length", "Fast EMA period", "Indicators");

		_slowLength = Param(nameof(SlowLength), 26)
			.SetGreaterThanZero()
			.SetDisplay("Slow Length", "Slow EMA period", "Indicators");
	}

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

		var fastEma = new ExponentialMovingAverage { Length = FastLength };
		var slowEma = new ExponentialMovingAverage { Length = SlowLength };

		decimal prevFast = 0, prevSlow = 0;
		var hasPrev = false;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(fastEma, slowEma, (ICandleMessage candle, decimal fastValue, decimal slowValue) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!hasPrev)
				{
					prevFast = fastValue;
					prevSlow = slowValue;
					hasPrev = true;
					return;
				}

				if (!IsFormedAndOnlineAndAllowTrading())
				{
					prevFast = fastValue;
					prevSlow = slowValue;
					return;
				}

				// Fast crosses above slow
				if (prevFast <= prevSlow && fastValue > slowValue && Position <= 0)
					BuyMarket();
				// Fast crosses below slow
				else if (prevFast >= prevSlow && fastValue < slowValue && Position >= 0)
					SellMarket();

				prevFast = fastValue;
				prevSlow = slowValue;
			})
			.Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, fastEma);
			DrawIndicator(area, slowEma);
			DrawOwnTrades(area);
		}
	}
}