Ver no GitHub

Estratégia TemplateEAbyMarket

Visão geral

TemplateEAbyMarket é uma versão direta StockSharp do consultor especialista original MetaTrader 4 TemplateEAbyMarket.mq4. A estratégia usa o indicador Moving Average Convergence Divergence (MACD) para detectar mudanças de impulso. Quando a linha principal MACD cruza a linha de sinal enquanto ambos os componentes estão na mesma zona positiva ou negativa, a estratégia abre uma posição de mercado na direção do cruzamento. As saídas são gerenciadas exclusivamente por meio de ordens de proteção (takeprofit e stop loss) configuradas por meio do auxiliar StartProtection integrado.

A versão StockSharp mantém o comportamento do programa MQL: apenas abre novas posições sem tentar fechar automaticamente o lado oposto. Uma vez preenchida uma posição, a negociação fica a ser gerida por níveis de proteção ou intervenção manual.

Lógica de negociação

  1. Assine o tipo de vela selecionado pelo usuário (padrão: período de 15 minutos).
  2. Calcule MACD (26/12/9 por padrão) em cada vela concluída.
  3. Rastreie a posição relativa das linhas principal e de sinal MACD para detectar um evento de cruzamento:
    • Configuração de alta: a vela anterior tinha a linha principal abaixo da linha de sinal, a vela atual fecha com a linha principal acima da linha de sinal e ambas as linhas estão acima de zero. Uma ordem de compra a mercado com OrderVolume será enviada se a exposição atual for inferior a MaxOrders * OrderVolume.
    • Configuração de baixa: a vela anterior tinha a linha principal acima da linha de sinal, a vela atual fecha com a linha principal abaixo da linha de sinal e ambas as linhas estão abaixo de zero. Uma ordem de venda a mercado com OrderVolume é submetida sujeita ao mesmo limite de exposição.
  4. Os níveis de proteção takeProfit e stopLoss são ativados uma vez na inicialização. A estratégia não fecha posições opostas automaticamente; o risco é controlado pelo módulo de proteção ou pelo usuário.

Parâmetros

Nome Descrição
MacdFastPeriod Comprimento EMA rápido para o cálculo de MACD.
MacdSlowPeriod Comprimento EMA lento para o cálculo MACD.
MacdSignalPeriod Comprimento do sinal EMA para o cálculo MACD.
CandleType Tipo de vela (período de tempo) que alimenta o indicador.
OrderVolume Volume enviado com cada ordem de mercado.
MaxOrders Número máximo de pedidos simultâneos, expresso como múltiplos de OrderVolume. A estratégia verifica abs(Position) < MaxOrders * OrderVolume antes de enviar um novo pedido.
TakeProfitPoints Distância de lucro em faixas de preço. O valor 0 desativa o take-profit.
StopLossPoints Distância de stop-loss em faixas de preço. O valor 0 desativa o stop loss.

Notas

  • As configurações de deslizamento e número mágico da versão MQL são omitidas intencionalmente porque são tratadas de forma diferente em StockSharp.
  • Certifique-se de que o conector forneça metadados adequados de etapas de preço; StartProtection interpreta distâncias em preços de instrumentos.
  • O modelo é intencionalmente minimalista e não gerencia preenchimentos parciais ou entradas de pirâmide além do limite de MaxOrders.
namespace StockSharp.Samples.Strategies;

using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;

/// <summary>
/// Template EA by Market strategy: MACD histogram crossover with signal line.
/// </summary>
public class TemplateEAbyMarketStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private readonly StrategyParam<int> _signalPeriod;

	private decimal _prevMacd;
	private decimal _prevSignal;
	private bool _hasPrev;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
	public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
	public int SignalPeriod { get => _signalPeriod.Value; set => _signalPeriod.Value = value; }

	public TemplateEAbyMarketStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_fastPeriod = Param(nameof(FastPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("Fast Period", "MACD fast EMA", "Indicators");
		_slowPeriod = Param(nameof(SlowPeriod), 26)
			.SetGreaterThanZero()
			.SetDisplay("Slow Period", "MACD slow EMA", "Indicators");
		_signalPeriod = Param(nameof(SignalPeriod), 9)
			.SetGreaterThanZero()
			.SetDisplay("Signal Period", "MACD signal period", "Indicators");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevMacd = 0m;
		_prevSignal = 0m;
		_hasPrev = false;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_hasPrev = false;
		var macd = new MovingAverageConvergenceDivergenceSignal
		{
			Macd = { ShortMa = { Length = FastPeriod }, LongMa = { Length = SlowPeriod } },
			SignalMa = { Length = SignalPeriod }
		};
		var subscription = SubscribeCandles(CandleType);
		subscription.BindEx(macd, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, IIndicatorValue macdValue)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!macdValue.IsFinal) return;

		var v = (MovingAverageConvergenceDivergenceSignalValue)macdValue;
		if (v.Macd is not decimal macdLine || v.Signal is not decimal signal) return;

		if (_hasPrev)
		{
			var prevHist = _prevMacd - _prevSignal;
			var currHist = macdLine - signal;

			if (prevHist <= 0 && currHist > 0 && Position <= 0)
				BuyMarket();
			else if (prevHist >= 0 && currHist < 0 && Position >= 0)
				SellMarket();
		}

		_prevMacd = macdLine;
		_prevSignal = signal;
		_hasPrev = true;
	}
}