Открыть на GitHub

Стратегия BykovTrend + ColorX2MA MMRec

Данная стратегия StockSharp повторяет логику MQL5-советника Exp_BykovTrend_ColorX2MA_MMRec. Она объединяет два независимых модуля: BykovTrend, который окрашивает свечи с помощью фильтра Williams %R, и ColorX2MA, анализирующий наклон двойного сглаженно- го скользящего среднего. Сделки открываются при появлении нового цвета/наклона в выбранном модуле. Управление капиталом упрощено до использования объёма стратегии, при необходимости можно включить процентные стоп-лосс и тейк-профит через встроенный блок защиты StockSharp.

Логика стратегии

Модуль BykovTrend

  • Используется Williams %R (BykovTrendWprLength), рассчитываемый по свечам BykovTrendCandleType (по умолчанию 2-часовые).
  • Параметр BykovTrendRisk задаёт пороги смены тренда (33 - Risk и -Risk).
  • Цвет индикатора оценивается на свече с индексом BykovTrendSignalBar (смещение от последней закрытой свечи).
  • Бычий цвет (< 2) закрывает шорты при включенном AllowBykovTrendCloseSell и может открыть лонг, если EnableBykovTrendBuy включён и предыдущий цвет не был бычьим.
  • Медвежий цвет (> 2) закрывает лонги при включённом AllowBykovTrendCloseBuy и может открыть шорт, если EnableBykovTrendSell включён и предыдущий цвет не был медвежьим.

Модуль ColorX2MA

  • Последовательно применяются два сглаживания (ColorX2MaMethod1, ColorX2MaLength1 и ColorX2MaMethod2, ColorX2MaLength2) к цене ColorX2MaPriceType, используя свечи ColorX2MaCandleType.
  • Результат второго сглаживания сравнивается с предыдущим значением, формируя состояния наклона: рост (1), падение (2) или флет (0).
  • Состояние наклона оценивается на свече с индексом ColorX2MaSignalBar.
  • Рост наклона закрывает шорты (AllowColorX2MaCloseSell) и может открыть лонг (EnableColorX2MaBuy), если предыдущее состояние не было растущим.
  • Падение наклона закрывает лонги (AllowColorX2MaCloseBuy) и может открыть шорт (EnableColorX2MaSell), если предыдущее состояние не было падающим.

Управление сделками

  • Сигналы на закрытие выполняются раньше открытий, что соответствует порядку заявок в оригинальном советнике.
  • Заявки используют Strategy.Volume как размер позиции; сложный блок повторного пересчёта лота из MQL не переносился.
  • Параметры StopLossPercent и TakeProfitPercent включают StartProtection с процентными ограничениями при значениях больше нуля.

Подробности

  • Направление торговли: Лонги и шорты.
  • Условия входа:
    • Смена цвета BykovTrend на бычий.
    • Смена наклона ColorX2MA на восходящий.
  • Условия выхода:
    • Обратные цвета/наклоны в разрешённых модулях.
    • Необязательные процентные стоп-лосс и тейк-профит.
  • Фильтры: Только логика индикаторов.
  • Размер позиции: Фиксированный, задаётся Strategy.Volume.

Параметры

Параметр Описание Значение по умолчанию
EnableBykovTrendBuy Разрешить открытия лонгов модулем BykovTrend. true
EnableBykovTrendSell Разрешить открытия шортов модулем BykovTrend. true
AllowBykovTrendCloseBuy Закрывать лонги при медвежьем цвете. true
AllowBykovTrendCloseSell Закрывать шорты при бычьем цвете. true
BykovTrendRisk Чувствительность порогов Williams %R. 3
BykovTrendWprLength Период Williams %R. 9
BykovTrendSignalBar Индекс свечи (смещение) для оценки цвета. 1
BykovTrendCandleType Таймфрейм свечей для BykovTrend. 2h
EnableColorX2MaBuy Разрешить открытия лонгов модулем ColorX2MA. true
EnableColorX2MaSell Разрешить открытия шортов модулем ColorX2MA. true
AllowColorX2MaCloseBuy Закрывать лонги при падающем наклоне. true
AllowColorX2MaCloseSell Закрывать шорты при растущем наклоне. true
ColorX2MaMethod1 Тип сглаживания на первом этапе. Simple
ColorX2MaLength1 Период первого сглаживания. 12
ColorX2MaPhase1 Плейсхолдер фазы (не используется). 15
ColorX2MaMethod2 Тип сглаживания на втором этапе. Jurik
ColorX2MaLength2 Период второго сглаживания. 5
ColorX2MaPhase2 Плейсхолдер фазы (не используется). 15
ColorX2MaPriceType Источник цены для сглаживания. Close
ColorX2MaSignalBar Индекс свечи для оценки наклона. 1
ColorX2MaCandleType Таймфрейм свечей для ColorX2MA. 2h
StopLossPercent Процентный стоп-лосс (0 — выключен). 0
TakeProfitPercent Процентный тейк-профит (0 — выключен). 0

Примечания

  • Параметры ColorX2MaPhase1 и ColorX2MaPhase2 сохранены для совместимости, но не влияют на расчёт, так как используемые скользящие средние StockSharp не имеют параметра фазы.
  • Реализованы только методы сглаживания, доступные в StockSharp; отсутствующие варианты из SmoothAlgorithms.mqh заменены ближайшими аналогами.
  • Алгоритмы повторного расчёта лота из TradeAlgorithms.mqh не перенесены. Управление рисками следует задавать внешними средствами или расширять стратегию вручную.

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

  1. Назначьте нужный инструмент и задайте Strategy.Volume требуемым объёмом.
  2. При необходимости измените таймфреймы BykovTrendCandleType и ColorX2MaCandleType.
  3. Настройте методы сглаживания, периоды и смещения сигналов под свою торговую модель.
  4. Для включения защитных стопов установите StopLossPercent и/или TakeProfitPercent больше нуля.
  5. Запустите стратегию: она подпишется на указанные свечи, будет отслеживать оба модуля и выставлять рыночные заявки в описанном порядке.
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>
/// BykovTrend ColorX2MA MMRec strategy (simplified). Uses EMA crossover
/// with candle body direction confirmation for trend entries.
/// </summary>
public class BykovTrendColorX2MaMmRecStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _emaFastLength;
	private readonly StrategyParam<int> _emaSlowLength;

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

	public int EmaFastLength
	{
		get => _emaFastLength.Value;
		set => _emaFastLength.Value = value;
	}

	public int EmaSlowLength
	{
		get => _emaSlowLength.Value;
		set => _emaSlowLength.Value = value;
	}

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

		_emaFastLength = Param(nameof(EmaFastLength), 9)
			.SetGreaterThanZero()
			.SetDisplay("EMA Fast", "Fast EMA period", "Indicators");

		_emaSlowLength = Param(nameof(EmaSlowLength), 26)
			.SetGreaterThanZero()
			.SetDisplay("EMA Slow", "Slow EMA period", "Indicators");
	}

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

		var emaFast = new ExponentialMovingAverage { Length = EmaFastLength };
		var emaSlow = new ExponentialMovingAverage { Length = EmaSlowLength };

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

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(emaFast, emaSlow, (ICandleMessage candle, decimal fastVal, decimal slowVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!hasPrev)
				{
					prevFast = fastVal;
					prevSlow = slowVal;
					hasPrev = true;
					return;
				}

				if (!IsFormedAndOnlineAndAllowTrading())
				{
					prevFast = fastVal;
					prevSlow = slowVal;
					return;
				}

				var bullishCross = prevFast <= prevSlow && fastVal > slowVal;
				var bearishCross = prevFast >= prevSlow && fastVal < slowVal;
				var close = candle.ClosePrice;
				var open = candle.OpenPrice;

				if (bullishCross && close > open && Position <= 0)
					BuyMarket();
				else if (bearishCross && close < open && Position >= 0)
					SellMarket();

				prevFast = fastVal;
				prevSlow = slowVal;
			})
			.Start();

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