Ver no GitHub

SUPERMACBOT da The Guardian Estratégia de TV Forex

Visão geral

O SUPERMACBOT da The Guardian Forex TV Strategy replica o conceito do consultor especialista MetaTrader original, combinando o oscilador MACD com um filtro de tendência duplo de média móvel simples e um filtro de saída de média móvel. A implementação StockSharp convertida funciona em velas concluídas e envia ordens de mercado sempre que uma confluência de alta ou baixa se forma. A estratégia evita a negociação tick-by-tick e segue as diretrizes API de alto nível, contando com assinaturas de velas e ligações de indicadores.

O mecanismo de negociação avalia o impulso por meio do histograma MACD e do alinhamento de tendências entre duas médias móveis simples. Uma média móvel móvel atua tanto como uma referência de gerenciamento comercial quanto como um filtro de confirmação atrasada, espelhando o módulo final configurado no especialista MQL. A versão StockSharp concentra-se na clareza e portabilidade entre instrumentos e prazos, expondo cada valor-chave como um parâmetro configurável.

Lógica de negociação

  1. Fonte de dados – a estratégia assina um tipo de vela configurável (período de tempo). Cada vela concluída aciona o fluxo de decisão.
  2. Preparação do indicador – MACD (com períodos ajustáveis de rápido, lento e sinal) e dois SMAs são recalculados em cada vela. Um SMA adicional replica o filtro final do especialista MQL.
  3. Regras de entrada
    • Entrada longa
      • O histograma MACD ultrapassa o limite configurável.
      • O rápido SMA está acima do lento SMA, mostrando uma tendência de alta estabelecida.
      • O preço de fechamento permanece acima do SMA final para garantir a força do preço.
      • A estratégia não possui posição comprada (apenas uma posição líquida é mantida).
    • Entrada curta
      • O histograma MACD ultrapassa o limite negativo.
      • O rápido SMA está abaixo do lento SMA, sinalizando um ambiente de baixa.
      • O preço de fechamento permanece abaixo do SMA final.
      • A estratégia não mantém exposição curta.
  4. Regras de saída
    • As posições longas são fechadas quando qualquer uma das seguintes situações acontece: o histograma fica negativo, o SMA rápido cai abaixo do SMA lento ou o preço fecha abaixo do SMA final.
    • As posições curtas são fechadas quando o histograma se torna positivo, o SMA rápido sobe acima do SMA lento ou o preço fecha acima do SMA final.
  5. Tratamento de risco – o algoritmo negocia uma única posição líquida e nunca pirâmides. Paradas de proteção podem ser adicionadas externamente usando regras de risco StockSharp, se desejado.

Parâmetros

Nome Descrição Padrão
CandleType Série de velas processada pela estratégia. Período de 1 minuto
FastMaPeriod Período do filtro de média móvel simples e rápido. 12
SlowMaPeriod Período do filtro de média móvel simples lenta. 26
MacdFastPeriod Período EMA rápido para o indicador MACD. 12
MacdSlowPeriod Período EMA lento para o indicador MACD. 24
MacdSignalPeriod Período de sinal EMA para o indicador MACD. 9
HistogramThreshold Valor absoluto mínimo exigido do histograma MACD antes de abrir uma posição. 0,0
TrailingPeriod Período da média móvel simples móvel usada para confirmações e saídas. 12

Todos os parâmetros são expostos por meio de StrategyParam<T> e podem ser otimizados dentro do StockSharp Designer.

Notas de uso

  • Anexe a estratégia a qualquer segurança e prazo adequados ao seu ambiente de teste.
  • Certifique-se de que haja um buffer de histórico suficiente disponível para que todos os indicadores fiquem totalmente formados antes do início da negociação.
  • Como a estratégia funciona com velas finalizadas e posições líquidas, é seguro operar em carteiras multiinstrumentos sem ordens conflitantes.
  • Gestão de dinheiro adicional (dimensionamento de lote, stop loss, saídas parciais) pode ser adicionada compondo a estratégia com outros módulos StockSharp.

Diferenças do especialista original

  • A conversão StockSharp concentra-se na lógica de fechamento de velas em vez do mecanismo orientado a eventos do MetaTrader Expert Advisor. Isso mantém o comportamento determinístico em backtests e negociações ao vivo.
  • O dimensionamento de lote e as ordens de trailing stop do Expert Advisor original são substituídas por uma saída simplificada baseada em posição, condicionada pela média móvel.
  • Os limites do sinal são tratados por meio do parâmetro de limite do histograma MACD, permitindo que os usuários imitem o sistema de pontuação do MQL Expert ajustando o valor.

Isenção de responsabilidade

Os algoritmos de negociação envolvem risco financeiro. Faça um backtest e um teste futuro completos da estratégia antes de implementá-la com capital real.

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();
	}
}