Открыть на GitHub

Стратегия BrainTrend2 V2 Duplex

Обзор

BrainTrend2 V2 Duplex — это высокоуровневый порт оригинального эксперта MetaTrader 5 Exp_BrainTrend2_V2_Duplex на платформу StockSharp. Стратегия запускает две независимые копии индикатора BrainTrend2 V2: одна отвечает за поиск длинных сделок, другая отслеживает короткие. Для каждой стороны можно задать собственный тип свечей, период ATR и глубину сдвига, что позволяет строить мульти-таймфреймовые комбинации либо настраивать асимметричное управление рисками.

BrainTrend2 V2 является трендовой системой, формирующей динамический канал («river»), основанный на сравнении последнего истинного диапазона с взвешенным ATR. Свечи окрашиваются в пять цветов:

  • 0 – бычья свеча внутри восходящего канала.
  • 1 – медвежья свеча внутри восходящего канала.
  • 2 – переходная нейтральная свеча во время смены направления.
  • 3 – бычья свеча внутри нисходящего канала.
  • 4 – медвежья свеча внутри нисходящего канала.

Стратегия анализирует изменения этих цветов, полностью повторяя логику входов и выходов исходного MQL5-решения.

Торговая логика

Длинная сторона

  • Анализируется свеча сдвига Long Signal Bar (по умолчанию 1 — предыдущая закрытая свеча).
  • Открыть длинную позицию, если:
    • Цвет на свече SignalBar + 1 (две свечи назад) меньше 2 (зелёная палитра восходящего канала), и
    • Цвет на свече SignalBar больше 1 (выход из чисто бычьего состояния).
  • Закрыть длинную позицию, если цвет на свече SignalBar + 1 больше 2 (магентовые оттенки нисходящего канала).

Короткая сторона

  • Анализируется свеча сдвига Short Signal Bar (по умолчанию 1).
  • Открыть короткую позицию, если:
    • Цвет на свече SignalBar + 1 больше 2 (магентовые оттенки), и
    • Цвет на свече SignalBar больше 0 (любая свеча, кроме чисто бычьей).
  • Закрыть короткую позицию, если цвет на свече SignalBar + 1 меньше 2 (возврат к восходящему каналу).

При появлении нового сигнала стратегия автоматически перекрывает противоположную позицию. Например, запрос на открытие шорта сначала закроет текущую длинную позицию (если она есть), после чего отправит рыночную заявку на продажу с заданным объёмом.

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

  • Для длинной и короткой стороны настраиваются независимые стоп-лоссы и тейк-профиты в пунктах. Значение 0 отключает соответствующий уровень.
  • Стопы и цели переводятся в абсолютные цены с учётом шага цены инструмента. Для лонгов контролируются минимум и максимум свечи, для шортов — максимум и минимум соответственно, что имитирует внутридневное исполнение.
  • Объём позиции задаётся в торговых единицах и может отличаться для покупок и продаж.
  • Метод StartProtection() активирует стандартные защитные механизмы StockSharp и позволяет комбинировать стратегию с общими ограничениями портфеля.

Параметры

Параметр Описание Значение по умолчанию
Long Candle Type Тип свечей для длинного индикатора (таймфрейм). H4
Long ATR Period Длина ATR для расчёта BrainTrend2 на длинной стороне. 7
Long Signal Bar Сдвиг в барах для оценки сигналов на покупку. 1
Enable Long Entries Разрешение на открытие длинных позиций. true
Enable Long Exits Разрешение на закрытие длинных позиций по сигналу индикатора. true
Long Volume Базовый объём ордера при открытии длинной позиции. 1
Long Stop Loss Стоп-лосс в пунктах для лонгов (0 = отключено). 1000
Long Take Profit Тейк-профит в пунктах для лонгов (0 = отключено). 2000
Short Candle Type Тип свечей для короткого индикатора. H4
Short ATR Period Длина ATR для расчёта BrainTrend2 на короткой стороне. 7
Short Signal Bar Сдвиг в барах для оценки сигналов на продажу. 1
Enable Short Entries Разрешение на открытие коротких позиций. true
Enable Short Exits Разрешение на закрытие коротких позиций по сигналу индикатора. true
Short Volume Базовый объём ордера при открытии короткой позиции. 1
Short Stop Loss Стоп-лосс в пунктах для шортов (0 = отключено). 1000
Short Take Profit Тейк-профит в пунктах для шортов (0 = отключено). 2000

Рекомендации по использованию

  • Увеличивайте Signal Bar, если требуется дополнительное подтверждение свечой или сочетание нескольких таймфреймов.
  • Индикатор реализован полностью на C#, поэтому стратегия не зависит от внешних файлов или библиотек MQL5.
  • Стопы и цели проверяются на закрытии каждой свечи. Для более строгого контроля риска в реальной торговле выбирайте меньший интервал свечей.
  • Если задать нулевые значения стоп-лосса и тейк-профита, позиции будут закрываться только при появлении противоположного сигнала цвета.
  • Индикатор становится рабочим после накопления количества свечей, равного периоду ATR; до этого момента сделки не совершаются.
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>
/// BrainTrend2 V2 Duplex strategy (simplified).
/// Uses ATR-based channel breakout for trend detection.
/// </summary>
public class BrainTrend2V2DuplexStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _atrPeriod;
	private readonly StrategyParam<int> _emaPeriod;
	private readonly StrategyParam<decimal> _channelMult;

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

	public int AtrPeriod
	{
		get => _atrPeriod.Value;
		set => _atrPeriod.Value = value;
	}

	public int EmaPeriod
	{
		get => _emaPeriod.Value;
		set => _emaPeriod.Value = value;
	}

	public decimal ChannelMult
	{
		get => _channelMult.Value;
		set => _channelMult.Value = value;
	}

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

		_atrPeriod = Param(nameof(AtrPeriod), 7)
			.SetGreaterThanZero()
			.SetDisplay("ATR Period", "ATR length", "Indicators");

		_emaPeriod = Param(nameof(EmaPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("EMA Period", "EMA length for trend", "Indicators");

		_channelMult = Param(nameof(ChannelMult), 2.5m)
			.SetGreaterThanZero()
			.SetDisplay("Channel Mult", "ATR multiplier for channel width", "Indicators");
	}

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

		var atr = new AverageTrueRange { Length = AtrPeriod };
		var ema = new ExponentialMovingAverage { Length = EmaPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(atr, ema, (ICandleMessage candle, decimal atrValue, decimal emaValue) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var close = candle.ClosePrice;
				var upper = emaValue + ChannelMult * atrValue;
				var lower = emaValue - ChannelMult * atrValue;

				// Buy when close breaks above upper channel
				if (close > upper && Position <= 0)
				{
					BuyMarket();
				}
				// Sell when close breaks below lower channel
				else if (close < lower && Position >= 0)
				{
					SellMarket();
				}
			})
			.Start();

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