Ver no GitHub

Estratégia WAMI Cloud X2

A estratégia replica o comportamento de duplo período do especialista MetaTrader original "Exp_WAMI_Cloud_X2". Usa o Warren Momentum Indicator (WAMI) em um período superior para definir o viés dominante e uma segunda instância do mesmo indicador em um período inferior para cronometrar entradas e saídas. A linha principal WAMI é comparada contra sua linha de sinal interna em ambos os períodos, o que espelha a lógica da implementação MQL original.

Conceito

  • Construção WAMI – WAMI é construído a partir da primeira diferença dos preços de fechamento, suavizada por três médias móveis sequenciais com métodos individualmente selecionáveis (SMA, EMA, SMMA ou LWMA). Uma quarta média móvel produz a linha de sinal. O indicador personalizado na estratégia reproduz esta cadeia exatamente, de modo que tanto a linha principal quanto a de sinal estão disponíveis em um payload de valor.
  • Filtro de tendência (período superior) – As velas padrão de seis horas impulsionam o WAMI de tendência. Quando a linha principal está acima da linha de sinal, a direção da tendência torna-se de alta; abaixo torna-se de baixa. Um estado neutro é mantido quando ambas as linhas são iguais ou o indicador ainda está se formando.
  • Motor de sinal (período inferior) – As velas padrão de 30 minutos são usadas para buscar entradas. Para cada vela finalizada, a estratégia armazena os valores WAMI recentes e avalia a última barra fechada definida por SignalBar. Os cruzamentos são detectados comparando o valor mais recente (SignalBar) contra o anterior (SignalBar + 1).

Regras de Trading

  1. Saídas
    • Posições compradas são fechadas quando o período de sinal mostra baixa persistente (previous.Main < previous.Signal) se CloseLongOnSignal está habilitado.
    • Posições vendidas são fechadas analogamente quando CloseShortOnSignal está habilitado.
    • Quando o período superior muda de direção (_trendDirection), o flag respectivo CloseLongOnTrendFlip ou CloseShortOnTrendFlip força uma saída.
  2. Entradas
    • Entradas vendidas são permitidas quando o período superior é de baixa e o WAMI de sinal cruza para cima (current.Main >= current.Signal com previous.Main < previous.Signal). Isso corresponde ao EA original que vende na primeira penetração ascendente da linha de sinal dentro de uma tendência de baixa.
    • Entradas compradas são a condição espelhada quando o período superior é de alta e o WAMI de sinal cruza para baixo (current.Main <= current.Signal com previous.Main > previous.Signal).
    • Alternâncias de entrada (EnableBuyEntries, EnableSellEntries) podem desabilitar qualquer lado. Quando uma posição oposta está aberta, a estratégia envia uma ordem a mercado compensatória para aplanar e reverter em um único comando, igual às funções auxiliares MQL.

Parâmetros

  • WAMI de TendênciaTrendPeriod1/2/3, TrendMethod1/2/3, TrendSignalPeriod, TrendSignalMethod, TrendCandleType.
  • WAMI de SinalSignalPeriod1/2/3, SignalMethod1/2/3, SignalSignalPeriod, SignalSignalMethod, SignalCandleType.
  • Flags de ControleSignalBar, EnableBuyEntries, EnableSellEntries, CloseLongOnTrendFlip, CloseShortOnTrendFlip, CloseLongOnSignal, CloseShortOnSignal.
  • Tamanho de TradingTradeVolume define o tamanho da ordem a mercado usado para novas entradas. Reversões enviam o volume oposto mais o tamanho configurado.

Todos os parâmetros são expostos através de objetos StrategyParam<T>, portanto podem ser otimizados ou modificados na UI do StockSharp assim como as entradas do MetaTrader permitiam.

Valores padrão

  • Período de tendência – velas de 6 horas.
  • Período de sinal – velas de 30 minutos.
  • Todos os métodos de média móvel – Simples (SMA).
  • Comprimentos de média móvel – 4 / 13 / 13 para as três etapas e 4 para a linha de sinal em ambos os períodos.
  • SignalBar – 1 (usar a última vela fechada).
  • TradeVolume – 1 contrato.
  • Todos os flags de permissão – Habilitados (true).

Notas Adicionais

  • A estratégia não define ordens de stop-loss ou take-profit fixas. O gerenciamento de risco deve ser configurado externamente se necessário.
  • Os helpers de gráfico desenham as velas do período de sinal, ambas as linhas WAMI e as operações executadas. O período de tendência é plotado em uma área separada para confirmação visual.
  • A implementação evita o polling de valores de indicador (sem chamadas GetValue) e segue a API de assinatura de velas de alto nível, seguindo as diretrizes do projeto.
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>
/// WAMI Cloud X2 strategy (simplified). Uses RSI momentum with EMA trend
/// filter as a proxy for the original multi-stage WAMI oscillator.
/// </summary>
public class WamiCloudX2Strategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiLength;
	private readonly StrategyParam<int> _emaLength;

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

	public int RsiLength
	{
		get => _rsiLength.Value;
		set => _rsiLength.Value = value;
	}

	public int EmaLength
	{
		get => _emaLength.Value;
		set => _emaLength.Value = value;
	}

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

		_rsiLength = Param(nameof(RsiLength), 14)
			.SetGreaterThanZero()
			.SetDisplay("RSI Length", "RSI period", "Indicators");

		_emaLength = Param(nameof(EmaLength), 50)
			.SetGreaterThanZero()
			.SetDisplay("EMA Length", "Trend EMA", "Indicators");
	}

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

		var rsi = new RelativeStrengthIndex { Length = RsiLength };
		var ema = new ExponentialMovingAverage { Length = EmaLength };

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

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var close = candle.ClosePrice;

				// Price above EMA with RSI not overbought => buy
				if (close > emaValue && rsiValue > 55m && Position <= 0)
					BuyMarket();
				// Price below EMA with RSI not oversold => sell
				else if (close < emaValue && rsiValue < 45m && Position >= 0)
					SellMarket();
			})
			.Start();

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