Ver no GitHub

Estratégia Especialista ADC PL Stoch

Visão geral

A Estratégia Expert ADC PL Stoch é uma estratégia de padrão de velas convertida do MQL5 consultor especialista original Expert_ADC_PL_Stoch. Ele procura formações de Piercing Line de alta e Dark Cloud Cover de baixa em velas finalizadas e confirma os sinais com a linha %D de um oscilador Stochastic. The method is trend-following when the market retraces into an established move and requires the oscillator to be in extreme zones before opening positions. Position exits are based on Stochastic crossovers out of extreme areas, mirroring the vote-based exit logic of the source system.

Lógica de negociação

  1. Assine um tipo de vela configurável (padrão: período de 1 hora).
  2. Para cada vela finalizada, mantenha as últimas velas necessárias para avaliação do padrão de velas e os valores recentes de Stochastic %D.
  3. Long Entry
    • O par de velas anterior deve formar um padrão Piercing Line:
      • A vela na barra t-1 é de alta com um corpo maior que o tamanho médio do corpo.
      • A vela na barra t-2 é de baixa com um corpo maior que a média.
      • A vela de alta fica abaixo da mínima de baixa e fecha dentro do corpo de baixa, enquanto a tendência geral é de queda de acordo com a média próxima.
    • O valor Stochastic %D na barra t-1 deve estar abaixo do limite de entrada longo (padrão 30).
  4. Short Entry
    • O par de velas anterior deve formar um padrão Dark Cloud Cover:
      • A vela na barra t-2 é de alta com um corpo grande.
      • A vela na barra t-1 abre acima da máxima anterior e fecha dentro do corpo de alta.
      • O preço médio da vela de baixa está acima da média móvel de fechamento, sinalizando uma tendência de alta antes da reversão.
    • The Stochastic %D on bar t-1 must be above the short entry threshold (default 70).
  5. Exit Conditions
    • Long positions are closed when the Stochastic %D on bar t-1 crosses below either the upper (80) or lower (20) thresholds compared with bar t-2.
    • As posições curtas são fechadas quando Stochastic %D na barra t-1 ultrapassa os limites inferior (20) ou superior (80) em comparação com a barra t-2.
  6. Todos os cálculos são realizados em velas prontas; nenhum processamento intrabar é usado.

Parâmetros

Nome Descrição Padrão
CandleType Período de tempo das velas usadas para detecção de padrões. 1 hora
StochasticLength Comprimento base para o oscilador Stochastic. 47
StochasticKPeriod Suavização do comprimento da linha %K. 9
StochasticDPeriod Suavização do comprimento da linha %D. 13
StochasticSlow Additional slowing factor applied to the oscillator. 3
AverageBodyPeriod Número de velas usadas para medir o tamanho do corpo de referência e fechar a média. 5
LongEntryThreshold Valor máximo de %D permitido antes de entrar em negociações longas. 30
ShortEntryThreshold Valor mínimo de %D exigido antes de entrar em negociações curtas. 70
ExitLowerThreshold Limite inferior usado para cruzamentos de saída. 20
ExitUpperThreshold Upper boundary used for exit crossovers. 80

Gestão de risco

  • A estratégia envia ordens de mercado utilizando o volume da estratégia base (padrão 1 contrato/lote).
  • Nenhuma ordem de proteção automática está configurada; gerenciamento de risco externo ou StartProtection pode ser adicionado, se necessário.
  • Apenas uma posição é gerenciada por vez; sinais opostos fecham a posição ativa antes de abrir uma nova.

Notas

  • Os corpos médios das velas e as médias próximas são calculadas a partir de velas históricas para replicar de perto a lógica de voto MQL5.
  • Os valores Stochastic são armazenados por barra finalizada para avaliar os mesmos deslocamentos usados no consultor especialista original.
  • As negociações são abertas e fechadas somente quando a estratégia está totalmente formada e a negociação é permitida pelas verificações da classe base.
namespace StockSharp.Samples.Strategies;

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

/// <summary>
/// Expert ADC PL Stoch strategy: Dark Cloud Cover and Piercing Line patterns
/// with Stochastic oscillator confirmation for entries and exits.
/// </summary>
public class ExpertAdcPlStochStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _stochPeriod;
	private readonly StrategyParam<decimal> _longThreshold;
	private readonly StrategyParam<decimal> _shortThreshold;
	private readonly StrategyParam<int> _signalCooldownCandles;

	private readonly List<ICandleMessage> _candles = new();
	private decimal _prevSignal;
	private int _candlesSinceTrade;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int StochPeriod { get => _stochPeriod.Value; set => _stochPeriod.Value = value; }
	public decimal LongThreshold { get => _longThreshold.Value; set => _longThreshold.Value = value; }
	public decimal ShortThreshold { get => _shortThreshold.Value; set => _shortThreshold.Value = value; }
	public int SignalCooldownCandles { get => _signalCooldownCandles.Value; set => _signalCooldownCandles.Value = value; }

	public ExpertAdcPlStochStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_stochPeriod = Param(nameof(StochPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("Stoch Period", "Stochastic period", "Indicators");
		_longThreshold = Param(nameof(LongThreshold), 30m)
			.SetDisplay("Long Threshold", "Stochastic below this for long", "Signals");
		_shortThreshold = Param(nameof(ShortThreshold), 70m)
			.SetDisplay("Short Threshold", "Stochastic above this for short", "Signals");
		_signalCooldownCandles = Param(nameof(SignalCooldownCandles), 6)
			.SetGreaterThanZero()
			.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_candles.Clear();
		_prevSignal = 0m;
		_candlesSinceTrade = SignalCooldownCandles;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_candles.Clear();
		_candlesSinceTrade = SignalCooldownCandles;
		var stoch = new StochasticOscillator { K = { Length = StochPeriod }, D = { Length = 3 } };
		var subscription = SubscribeCandles(CandleType);
		subscription.BindEx(stoch, ProcessCandle).Start();

		StartProtection(
			takeProfit: new Unit(2, UnitTypes.Percent),
			stopLoss: new Unit(1, UnitTypes.Percent)
		);
	}

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

		if (_candlesSinceTrade < SignalCooldownCandles)
			_candlesSinceTrade++;

		var stochTyped = stochValue as StochasticOscillatorValue;
		if (stochTyped?.K is not decimal kValue) return;

		_candles.Add(candle);
		if (_candles.Count > 10)
			_candles.RemoveAt(0);

		if (_candles.Count >= 2)
		{
			var curr = _candles[^1];
			var prev = _candles[^2];

			// Piercing Line: bearish prev + bullish curr that closes above prev midpoint
			var isPiercing = prev.OpenPrice > prev.ClosePrice
				&& curr.ClosePrice > curr.OpenPrice
				&& curr.OpenPrice < prev.LowPrice
				&& curr.ClosePrice > (prev.OpenPrice + prev.ClosePrice) / 2m;

			// Dark Cloud Cover: bullish prev + bearish curr that closes below prev midpoint
			var isDarkCloud = prev.ClosePrice > prev.OpenPrice
				&& curr.OpenPrice > curr.ClosePrice
				&& curr.OpenPrice > prev.HighPrice
				&& curr.ClosePrice < (prev.OpenPrice + prev.ClosePrice) / 2m;

			if (isPiercing && kValue < LongThreshold && Position == 0 && _candlesSinceTrade >= SignalCooldownCandles)
			{
				BuyMarket();
				_candlesSinceTrade = 0;
			}
			else if (isDarkCloud && kValue > ShortThreshold && Position == 0 && _candlesSinceTrade >= SignalCooldownCandles)
			{
				SellMarket();
				_candlesSinceTrade = 0;
			}
		}

		_prevSignal = kValue;
	}
}