Ver no GitHub

Estratégia SMC Trader Camel CCI MACD

Visão geral

Esta estratégia é uma versão StockSharp do MetaTrader 4 consultor especialista "Steve Cartwright Trader Camel CCI MACD". Ele reproduz a lógica de negociação original baseada em um canal de média móvel exponencial estilo camelo, um filtro de tendência MACD e limites do índice de canal de commodities (CCI). As negociações são executadas quando concluídas velas para garantir um comportamento determinístico e ficar próximo ao fluxo de trabalho barra por barra da versão MQL.

Lógica de negociação

  1. Indicadores
    • Duas médias móveis exponenciais (EMA) com o mesmo período são aplicadas aos máximos e mínimos das velas para formar o canal de camelo. Um rompimento do fechamento anterior além desses envelopes sinaliza força de impulso.
    • Um indicador MACD padrão (EMA rápida, EMA lenta e linha de sinal) é usado para confirmar a direção da tendência subjacente.
    • Um indicador CCI valida a força do impulso usando níveis de sobrecompra/sobrevenda de ±100 por padrão.
  2. Entradas longas
    • O fechamento da vela anterior está acima da máxima do camelo EMA.
    • O valor principal anterior MACD está acima de zero e acima da linha de sinal.
    • O valor anterior de CCI está acima do limite positivo.
    • Nenhuma posição ativa está aberta e nenhuma saída ocorreu dentro do período atual da vela (evita a reentrada rápida).
  3. Entradas curtas
    • O fechamento da vela anterior está abaixo do camel low EMA.
    • O valor principal anterior de MACD está abaixo de zero e abaixo da linha de sinal.
    • O valor anterior de CCI está abaixo do limite negativo.
    • As mesmas condições de posição plana e de resfriamento das configurações longas.
  4. Saídas
    • As posições longas fecham quando o valor principal anterior de MACD cruza abaixo da linha de sinal ou quando o valor principal de CCI anterior o valor cai abaixo do limite positivo.
    • As posições curtas fecham quando o valor principal anterior MACD cruza acima da linha de sinal.
    • Após qualquer saída, um cooldown igual à duração de uma vela é aplicado antes de novas entradas.

A estratégia é negociada no máximo uma vez por barra porque cada decisão é baseada nos dados da vela concluída anterior.

Parâmetros

Parâmetro Descrição Padrão
CandleType Tipo de dados/período de vela usado para todos os indicadores. Período de 1 hora
CamelLength Comprimento do canal alto/baixo EMA. 34
CciPeriod Comprimento do filtro CCI. 20
MacdFastPeriod Comprimento EMA rápido para MACD. 12
MacdSlowPeriod Comprimento EMA lento para MACD. 26
MacdSignalPeriod Período de suavização de sinal para MACD. 9
CciThreshold Nível CCI absoluto que deve ser excedido para entradas (aplicado simetricamente). 100

Todos os parâmetros são otimizáveis através do otimizador StockSharp graças às chamadas SetOptimize.

Gestão de risco

  • Os pedidos são enviados via BuyMarket e SellMarket, herdando a propriedade da estratégia Volume.
  • StartProtection() está habilitado para inicializar auxiliares de proteção StockSharp padrão.
  • Nenhum stop-loss ou take-profit fixo é definido no algoritmo original; as saídas dependem apenas de sinais indicadores.

Gráficos

A estratégia traça automaticamente o canal camel EMA, indicadores MACD e CCI, juntamente com negociações próprias, que replica as dicas visuais usadas na implementação do MT4.

Notas

  • O temporizador de resfriamento usa a duração da vela derivada de CandleType.Arg. Certifique-se de que CandleType contém um Argumento TimeSpan quando você altera o período.
  • Como todas as decisões são baseadas nos valores da barra anterior, a ordem das operações reflete iMACD, iCCI e iMA (com shift=1) chamadas na origem EA.
namespace StockSharp.Samples.Strategies;

using System;
using System.Collections.Generic;

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

/// <summary>
/// Strategy combining CCI and MACD signal crossover with EMA trend filter.
/// Buy when MACD crosses above signal with CCI positive and price above EMA.
/// Sell when MACD crosses below signal with CCI negative and price below EMA.
/// </summary>
public class SmcTraderCamelCciMacd1Strategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _emaLength;
	private readonly StrategyParam<int> _macdFastPeriod;
	private readonly StrategyParam<int> _macdSlowPeriod;
	private readonly StrategyParam<int> _macdSignalPeriod;
	private readonly StrategyParam<int> _cciPeriod;

	private decimal? _prevMacdMain;
	private decimal? _prevMacdSignal;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int EmaLength { get => _emaLength.Value; set => _emaLength.Value = value; }
	public int MacdFastPeriod { get => _macdFastPeriod.Value; set => _macdFastPeriod.Value = value; }
	public int MacdSlowPeriod { get => _macdSlowPeriod.Value; set => _macdSlowPeriod.Value = value; }
	public int MacdSignalPeriod { get => _macdSignalPeriod.Value; set => _macdSignalPeriod.Value = value; }
	public int CciPeriod { get => _cciPeriod.Value; set => _cciPeriod.Value = value; }

	public SmcTraderCamelCciMacd1Strategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");

		_emaLength = Param(nameof(EmaLength), 34)
			.SetDisplay("EMA Length", "Trend EMA period", "Indicators");

		_macdFastPeriod = Param(nameof(MacdFastPeriod), 12)
			.SetDisplay("MACD Fast", "Fast EMA for MACD", "Indicators");

		_macdSlowPeriod = Param(nameof(MacdSlowPeriod), 26)
			.SetDisplay("MACD Slow", "Slow EMA for MACD", "Indicators");

		_macdSignalPeriod = Param(nameof(MacdSignalPeriod), 9)
			.SetDisplay("MACD Signal", "Signal line period", "Indicators");

		_cciPeriod = Param(nameof(CciPeriod), 20)
			.SetDisplay("CCI Period", "CCI period", "Indicators");
	}

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

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

		_prevMacdMain = null;
		_prevMacdSignal = null;
	}

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

		_prevMacdMain = null;
		_prevMacdSignal = null;

		var ema = new ExponentialMovingAverage { Length = EmaLength };
		var macd = new MovingAverageConvergenceDivergenceSignal
		{
			Macd =
			{
				ShortMa = { Length = MacdFastPeriod },
				LongMa = { Length = MacdSlowPeriod }
			},
			SignalMa = { Length = MacdSignalPeriod }
		};
		var cci = new CommodityChannelIndex { Length = CciPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.BindEx(macd, cci, ema, ProcessCandle)
			.Start();
	}

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

		if (!macdValue.IsFinal || !cciValue.IsFinal || !emaValue.IsFinal)
			return;

		if (macdValue is not MovingAverageConvergenceDivergenceSignalValue macdData)
			return;

		if (macdData.Macd is not decimal macdMain || macdData.Signal is not decimal macdSignal)
			return;

		var cci = cciValue.ToDecimal();
		var emaVal = emaValue.ToDecimal();

		if (_prevMacdMain is not decimal prevMain || _prevMacdSignal is not decimal prevSignal)
		{
			_prevMacdMain = macdMain;
			_prevMacdSignal = macdSignal;
			return;
		}

		var macdBullCross = prevMain <= prevSignal && macdMain > macdSignal;
		var macdBearCross = prevMain >= prevSignal && macdMain < macdSignal;

		// Long: MACD bullish cross + CCI > 0 + price above EMA
		if (Position <= 0 && macdBullCross && cci > 0 && candle.ClosePrice > emaVal)
		{
			if (Position < 0)
				BuyMarket();
			BuyMarket();
		}
		// Short: MACD bearish cross + CCI < 0 + price below EMA
		else if (Position >= 0 && macdBearCross && cci < 0 && candle.ClosePrice < emaVal)
		{
			if (Position > 0)
				SellMarket();
			SellMarket();
		}

		_prevMacdMain = macdMain;
		_prevMacdSignal = macdSignal;
	}
}