Открыть на GitHub

Стратегия SUPERMACBOT by The Guardian Forex TV

Общее описание

Стратегия SUPERMACBOT by The Guardian Forex TV переносит идею одноимённого советника MetaTrader в экосистему StockSharp. Комбинация индикатора MACD, двух простых скользящих средних и отдельной «трейлинг» средней формирует сводный сигнал, после чего стратегия открывает или закрывает позицию рыночными заявками. Работа ведётся только по закрытию свечей, что повышает стабильность и повторяемость результатов при тестировании и в реальной торговле.

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

  1. Источники данных – подписка на настраиваемый тип свечей. Решения принимаются только после завершения свечи.
  2. Индикаторы – на каждой свече пересчитываются MACD (быстрый/медленный/сигнальный периоды), быстрая и медленная SMA, а также отдельная SMA, имитирующая модуль трейлинга из исходного советника.
  3. Условия входа
    • Лонг: гистограмма MACD пересекает вверх заданный порог, быстрая SMA находится выше медленной, цена закрытия выше трейлинг-SMA, открытых длинных позиций нет.
    • Шорт: гистограмма MACD пересекает вниз отрицательный порог, быстрая SMA ниже медленной, цена закрытия ниже трейлинг-SMA, открытых коротких позиций нет.
  4. Условия выхода
    • Лонг закрывается при смене знака гистограммы MACD на отрицательный, при пересечении быстрой SMA вниз через медленную или при закрытии цены ниже трейлинг-SMA.
    • Шорт закрывается при смене знака гистограммы MACD на положительный, при пересечении быстрой SMA вверх через медленную или при закрытии цены выше трейлинг-SMA.
  5. Управление позицией – стратегия держит только одну чистую позицию и не использует усреднение. Для добавления стоп-лоссов и ограничения капитала можно подключить стандартные риск-правила StockSharp.

Параметры

Имя Описание Значение по умолчанию
CandleType Тип свечей для анализа. Таймфрейм 1 минута
FastMaPeriod Период быстрой простой SMA. 12
SlowMaPeriod Период медленной простой SMA. 26
MacdFastPeriod Быстрый EMA для MACD. 12
MacdSlowPeriod Медленный EMA для MACD. 24
MacdSignalPeriod Сигнальный EMA для MACD. 9
HistogramThreshold Минимальная абсолютная величина гистограммы MACD для входа. 0.0
TrailingPeriod Период трейлинг-SMA. 12

Параметры оформлены через StrategyParam<T> и доступны для оптимизации в Designer.

Практические рекомендации

  • Перед запуском загрузите достаточный объём истории, чтобы индикаторы успели сформироваться.
  • Стратегия работает с нетто-позицией, поэтому без конфликтов запускается в портфельном режиме.
  • Для сложного манименеджмента и ордеров стоп/тейк используйте комбинирование со встроенными модулями StockSharp.

Отличия от оригинального советника

  • В версии StockSharp используется candle-close логика вместо событийной модели MetaTrader.
  • Встроенный модуль фиксации прибыли/убытков заменён на систему выходов по трейлинг-SMA и смене направления индикаторов.
  • Весовые коэффициенты сигналов заменены на настраиваемый порог гистограммы MACD, что позволяет подстраивать чувствительность.

Дисклеймер

Любая торговля на финансовых рынках связана с риском. Перед работой на реальном счёте выполните полноценное тестирование стратегии.

using System;
using System.Linq;
using System.Collections.Generic;

using Ecng.Common;
using Ecng.Collections;
using Ecng.Serialization;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// SUPERMACBOT strategy converted from the MQL expert by The Guardian Forex TV.
/// </summary>
public class SupermacbotByTheGuardianForexTvStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastMaPeriod;
	private readonly StrategyParam<int> _slowMaPeriod;
	private readonly StrategyParam<int> _macdFastPeriod;
	private readonly StrategyParam<int> _macdSlowPeriod;
	private readonly StrategyParam<int> _macdSignalPeriod;
	private readonly StrategyParam<decimal> _histogramThreshold;
	private readonly StrategyParam<int> _trailingPeriod;

	/// <summary>
	/// Candle type to process.
	/// </summary>
	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	/// <summary>
	/// Fast simple moving average period.
	/// </summary>
	public int FastMaPeriod
	{
		get => _fastMaPeriod.Value;
		set => _fastMaPeriod.Value = value;
	}

	/// <summary>
	/// Slow simple moving average period.
	/// </summary>
	public int SlowMaPeriod
	{
		get => _slowMaPeriod.Value;
		set => _slowMaPeriod.Value = value;
	}

	/// <summary>
	/// Fast EMA period for MACD.
	/// </summary>
	public int MacdFastPeriod
	{
		get => _macdFastPeriod.Value;
		set => _macdFastPeriod.Value = value;
	}

	/// <summary>
	/// Slow EMA period for MACD.
	/// </summary>
	public int MacdSlowPeriod
	{
		get => _macdSlowPeriod.Value;
		set => _macdSlowPeriod.Value = value;
	}

	/// <summary>
	/// Signal EMA period for MACD.
	/// </summary>
	public int MacdSignalPeriod
	{
		get => _macdSignalPeriod.Value;
		set => _macdSignalPeriod.Value = value;
	}

	/// <summary>
	/// Minimal absolute histogram value required for new entries.
	/// </summary>
	public decimal HistogramThreshold
	{
		get => _histogramThreshold.Value;
		set => _histogramThreshold.Value = value;
	}

	/// <summary>
	/// Trailing simple moving average period.
	/// </summary>
	public int TrailingPeriod
	{
		get => _trailingPeriod.Value;
		set => _trailingPeriod.Value = value;
	}

	/// <summary>
	/// Initializes a new instance of <see cref="SupermacbotByTheGuardianForexTvStrategy"/>.
	/// </summary>
	public SupermacbotByTheGuardianForexTvStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Type of candles to process", "General");

		_fastMaPeriod = Param(nameof(FastMaPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("Fast SMA", "Fast SMA period", "Indicators")
			
			.SetOptimize(5, 30, 1);

		_slowMaPeriod = Param(nameof(SlowMaPeriod), 26)
			.SetGreaterThanZero()
			.SetDisplay("Slow SMA", "Slow SMA period", "Indicators")
			
			.SetOptimize(10, 60, 1);

		_macdFastPeriod = Param(nameof(MacdFastPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("MACD Fast", "MACD fast EMA period", "Indicators")
			
			.SetOptimize(5, 20, 1);

		_macdSlowPeriod = Param(nameof(MacdSlowPeriod), 24)
			.SetGreaterThanZero()
			.SetDisplay("MACD Slow", "MACD slow EMA period", "Indicators")
			
			.SetOptimize(18, 40, 1);

		_macdSignalPeriod = Param(nameof(MacdSignalPeriod), 9)
			.SetGreaterThanZero()
			.SetDisplay("MACD Signal", "MACD signal EMA period", "Indicators")
			
			.SetOptimize(3, 15, 1);

		_histogramThreshold = Param(nameof(HistogramThreshold), 0m)
			.SetDisplay("Histogram Threshold", "Required MACD histogram magnitude", "Logic");

		_trailingPeriod = Param(nameof(TrailingPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("Trailing SMA", "Trailing SMA period", "Logic")
			
			.SetOptimize(6, 30, 1);
	}

	/// <inheritdoc />
	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
	{
		return [(Security, CandleType)];
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();

	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var fastMa = new SimpleMovingAverage { Length = FastMaPeriod };
		var slowMa = new SimpleMovingAverage { Length = SlowMaPeriod };
		var trailingMa = new SimpleMovingAverage { Length = TrailingPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(fastMa, slowMa, trailingMa, ProcessCandle)
			.Start();

		StartProtection(
			takeProfit: new Unit(2, UnitTypes.Percent),
			stopLoss: new Unit(1, UnitTypes.Percent));

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

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

		if (Position != 0)
			return;

		var bullishTrend = fastMa > slowMa;
		var bearishTrend = fastMa < slowMa;
		var price = candle.ClosePrice;

		if (bullishTrend && price > trailingMa)
			BuyMarket();
		else if (bearishTrend && price < trailingMa)
			SellMarket();
	}
}