Открыть на GitHub

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

Стратегия объединяет цветовой индикатор тренда BykovTrend V2 и фильтр наклона ColorX2MA, построенный на двойном сглаживании скользящими средними. Оба блока работают по одному инструменту и могут выдавать сигналы независимо друг от друга, поэтому итоговая позиция отражает баланс мнений двух модулей.

Общая идея

  • Рынок: подходит для любых инструментов с данными по свечам. По умолчанию оба блока работают на таймфрейме H4, как и оригинальный советник.
  • Индикаторы:
    • BykovTrend V2 окрашивает свечи в зависимости от Williams %R.
    • ColorX2MA дважды сглаживает выбранную цену и анализирует наклон второй сглаженной кривой.
  • Сигналы: входы и выходы формируются раздельно двумя блоками, итоговая позиция — сумма всех совершённых сделок.

Блок BykovTrend

  1. Рассчитывается Williams %R с заданным периодом (по умолчанию 9).
  2. Пороговые уровни сдвигаются на величину 33 - Risk. При росте %R выше -Risk фиксируется восходящий тренд, при падении ниже -100 + (33 - Risk) — нисходящий.
  3. Цвета свечей:
    • 0, 1 — восходящий тренд (зелёный/бирюзовый).
    • 2 — нейтральный цвет.
    • 3, 4 — нисходящий тренд (коричневый/золотой).
  4. Сигнал анализируется по свече, которая находится на SignalBar шагов позади от последней закрытой. Значение 1 соответствует предыдущей завершённой свече и повторяет логику MetaTrader.
  5. Правила торговли:
    • Открыть Long: текущий цвет < 2 и предыдущий цвет > 1 (переход из нейтральной/медвежьей зоны). Разрешается параметром Bykov Allow Long Entries.
    • Закрыть Short: текущий цвет < 2. Разрешается параметром Bykov Allow Short Exits.
    • Открыть Short: текущий цвет > 2 и предыдущий цвет < 3 (смена с бычьего/нейтрального на медвежий). Разрешается параметром Bykov Allow Short Entries.
    • Закрыть Long: текущий цвет > 2. Разрешается параметром Bykov Allow Long Exits.

Блок ColorX2MA

  1. Первая скользящая средняя сглаживает выбранную цену (по умолчанию Close) с указанным методом и длиной.
  2. Вторая скользящая средняя сглаживает результат первой.
  3. Цвет определяется по наклону второй линии:
    • 1 — рост значения по сравнению с предыдущей свечой.
    • 2 — падение значения.
    • 0 — отсутствие изменения.
  4. Сигнал анализируется по свече, находящейся на SignalBar шагов позади от последней закрытой.
  5. Правила торговли:
    • Открыть Long: текущий цвет = 1, предыдущий ≠ 1. Настраивается Color Allow Long Entries.
    • Закрыть Short: текущий цвет = 1. Настраивается Color Allow Short Exits.
    • Открыть Short: текущий цвет = 2, предыдущий ≠ 2. Настраивается Color Allow Short Entries.
    • Закрыть Long: текущий цвет = 2. Настраивается Color Allow Long Exits.

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

  • Используются рыночные заявки. При смене направления стратегия выставляет объём, достаточный для закрытия текущей позиции и открытия новой величиной Volume.
  • Каждый блок может закрыть позицию даже если второй блок ещё поддерживает её направление, поэтому возможна «перетягивание каната» между сигналами.
  • Встроенных стоп-лоссов и тейк-профитов нет. Управляйте рисками внешними средствами или параметрами разрешений.

Параметры

Параметр Описание
BykovTrend Candle Тип данных (таймфрейм) для расчёта BykovTrend.
Williams %R Period Длина окна для Williams %R.
Risk Offset Смещение порогов Williams %R (33 - Risk). Чем выше значение, тем агрессивнее реакция на восходящий тренд.
Signal Bar Задержка в количестве завершённых свечей перед обработкой сигнала BykovTrend.
Allow Long/Short Entries Разрешение на открытия позиций по блоку BykovTrend.
Allow Long/Short Exits Разрешение на закрытия позиций по блоку BykovTrend.
ColorX2MA Candle Таймфрейм для блока ColorX2MA.
First/Second MA Method Типы сглаживания на первой и второй ступени (SMA, EMA, SMMA, LWMA, Jurik).
First/Second MA Length Длины скользящих средних.
First/Second MA Phase Параметры фазы из оригинального советника; сохранены для совместимости, но не влияют на встроенные индикаторы StockSharp.
Applied Price Выбор цены: Close, Open, High, Low, Median, Typical, Weighted, Simple, Quarted, TrendFollow, DeMark.
Color Signal Bar Задержка перед обработкой цветового сигнала ColorX2MA.
Allow Long/Short Entries/Exits Разрешения на действия блока ColorX2MA.

Особенности и ограничения

  • Поддерживаются только типы скользящих, доступные в StockSharp. Методы JurX, Parabolic, T3, VIDYA, AMA не реализованы.
  • Параметры фазы сохранены ради совместимости с MetaTrader, но не используются библиотечными индикаторами.
  • Стратегия предполагает, что параметр Volume задан; иначе заявки не будут отправляться.
  • В MetaTrader сделки разделялись по magic number. Здесь все сделки суммируются в одну позицию, поэтому результаты могут отличаться.
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 strategy (simplified). Uses Williams %R for trend
/// detection combined with double EMA smoothing for entry confirmation.
/// </summary>
public class BykovTrendColorX2MaStrategy : 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 BykovTrendColorX2MaStrategy()
	{
		_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), 21)
			.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;
				}

				// EMA crossover with candle direction confirmation
				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);
		}
	}
}