Ver no GitHub

Estratégia Elderv30aug05v

Visão geral

A estratégia Elderv30aug05v é uma porta direta do MetaTrader 4 consultor especialista com o mesmo nome. Ele combina sinais de dois filtros MACD calculados em velas horárias e dois osciladores estocásticos calculados em velas de 15 minutos. A execução da negociação e o gerenciamento de saída acontecem em velas de um minuto para replicar a lógica tick-by-tick do script MQL original. A estratégia abre no máximo uma posição por vez e depende de trailing stops dinâmicos em vez de ordens fixas de take-profit.

Indicadores e Dados

  • Primário MACD (13/30/9, velas horárias). Um sinal longo exige que o histograma se incline para cima enquanto o valor anterior permanece abaixo de zero.
  • Secundário MACD (14/56/9, velas horárias). Um sinal curto exige que o histograma se incline para baixo enquanto o valor anterior permanece acima de zero.
  • Oscilador estocástico rápido (%K=2, %D=3, suavização=3, velas de 15 minutos). Entradas longas exigem que a linha %K fique abaixo do teto configurado (padrão 36) e subindo em relação à barra anterior.
  • Oscilador estocástico lento (%K=1, %D=3, suavização=3, velas de 15 minutos). As entradas curtas exigem que a linha %K esteja acima do piso configurado (padrão 66) e diminuindo em relação à barra anterior.
  • Velas de um minuto fornecem os dados de confirmação para verificações de breakout e gerenciam trailing stops.

Todos os indicadores processam apenas velas concluídas por meio de SubscribeCandles().Bind()/BindEx() para seguir as diretrizes de alto nível StockSharp API.

Regras de entrada

Configuração longa

  1. O valor primário MACD está acima da leitura anterior e a leitura anterior é negativa.
  2. O estocástico rápido %K está abaixo de LongStochasticThreshold (padrão 36) e acima de seu valor anterior.
  3. O fechamento da vela atual de um minuto é maior que a máxima da vela anterior de um minuto.

Configuração curta

  1. O valor secundário MACD está abaixo da leitura anterior e a leitura anterior é positiva.
  2. O estocástico lento %K está acima de ShortStochasticThreshold (padrão 66) e abaixo de seu valor anterior.
  3. O fechamento da vela atual de um minuto é inferior à mínima da vela anterior de um minuto.

Apenas uma posição pode ser aberta. Se um novo sinal aparecer enquanto uma posição estiver ativa, ele será ignorado até que a posição seja fechada por stop-loss ou lógica de trailing.

Regras de saída

  • Stop-loss inicial: Na entrada, a estratégia armazena o preço de entrada mais/menos LongStopLoss ou ShortStopLoss multiplicado pelo instrumento PriceStep. Se PriceStep não for fornecido, um substituto de 0.0001 será usado.
  • Trailing stop: quando o preço se move a favor da negociação em pelo menos LongTrailingStop ou ShortTrailingStop pontos (novamente multiplicado por PriceStep), o preço stop armazenado é deslocado para trás do mercado. Para negociações longas, o stop segue o fechamento menos a distância final e só se move para cima. Para negociações curtas, o stop segue o fechamento mais a distância e só se move para baixo.
  • Quando o intervalo da vela atinge o preço stop armazenado, a posição é fechada no mercado.

Nenhum nível fixo de lucro é usado, refletindo o comportamento original MetaTrader.

Parâmetros

Nome Padrão Descrição
Volume 0.1 Volume de negociação enviado para BuyMarket/SellMarket.
LongStopLoss 17 Longa distância de stop-loss em pontos.
ShortStopLoss 46 Distância curta de stop-loss em pontos.
LongTrailingStop 18 Distância final para posições longas.
ShortTrailingStop 22 Distância final para posições curtas.
LongStochasticThreshold 36 Valor máximo estocástico rápido de %K para entradas longas.
ShortStochasticThreshold 66 Valor mínimo estocástico lento de %K para entradas curtas.
BaseCandleType TimeFrame(1m) Série de velas usada para lógica de execução.
StochasticCandleType TimeFrame(15m) Série de velas para ambos os osciladores estocásticos.
MacdCandleType TimeFrame(1h) Série de velas para ambos os filtros MACD.
MacdFastPeriod / MacdSlowPeriod / MacdSignalPeriod 13 / 30 / 9 Períodos para o MACD primário.
AltMacdFastPeriod / AltMacdSlowPeriod / AltMacdSignalPeriod 14 / 56 / 9 Períodos para o secundário MACD.
StochasticFastKPeriod / StochasticFastDPeriod / StochasticFastSmooth 2 / 3 / 3 Parâmetros para o estocástico rápido.
StochasticSlowKPeriod / StochasticSlowDPeriod / StochasticSlowSmooth 1 / 3 / 3 Parâmetros para o estocástico lento.

Notas

  • A estratégia funciona com qualquer instrumento que forneça velas de nível minuto e um PriceStep válido.
  • Os trailing stops são mantidos internamente; nenhuma ordem de proteção é registrada no lado da bolsa.
  • A lógica processa apenas velas concluídas para evitar repintura e corresponde à implementação MQL que dependia de barras concluídas.

Roteiro Original

  • Fonte: MQL/7674/Elderv30aug05v.mq4
  • Plataforma: MetaTrader 4 consultores especialistas.
using System;
using System.Collections.Generic;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Elder strategy - EMA trend + Momentum confirmation.
/// Buys when EMA is rising and momentum crosses above zero.
/// Sells when EMA is falling and momentum crosses below zero.
/// </summary>
public class Elderv30aug05vStrategy : Strategy
{
	private readonly StrategyParam<int> _emaPeriod;
	private readonly StrategyParam<int> _momentumPeriod;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevEma;
	private decimal _prevMomentum;
	private bool _hasPrev;

	public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
	public int MomentumPeriod { get => _momentumPeriod.Value; set => _momentumPeriod.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public Elderv30aug05vStrategy()
	{
		_emaPeriod = Param(nameof(EmaPeriod), 13)
			.SetDisplay("EMA Period", "EMA period for trend", "Indicators");

		_momentumPeriod = Param(nameof(MomentumPeriod), 10)
			.SetDisplay("Momentum Period", "Momentum period", "Indicators");

		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
	protected override void OnReseted() { base.OnReseted(); _prevEma = 0m; _prevMomentum = 0m; _hasPrev = false; }

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

		_hasPrev = false;

		var ema = new ExponentialMovingAverage { Length = EmaPeriod };
		var momentum = new Momentum { Length = MomentumPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(ema, momentum, ProcessCandle)
			.Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal ema, decimal momentum)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (!_hasPrev)
		{
			_prevEma = ema;
			_prevMomentum = momentum;
			_hasPrev = true;
			return;
		}

		var emaRising = ema > _prevEma;
		var emaFalling = ema < _prevEma;
		var momCrossUp = _prevMomentum <= 0 && momentum > 0;
		var momCrossDown = _prevMomentum >= 0 && momentum < 0;

		// Buy: EMA rising + momentum crosses above zero
		if (emaRising && momCrossUp && Position <= 0)
		{
			if (Position < 0)
				BuyMarket();
			BuyMarket();
		}
		// Sell: EMA falling + momentum crosses below zero
		else if (emaFalling && momCrossDown && Position >= 0)
		{
			if (Position > 0)
				SellMarket();
			SellMarket();
		}

		_prevEma = ema;
		_prevMomentum = momentum;
	}
}