Ver no GitHub

Obtenha tendência Stochastic Estratégia

A estratégia é uma versão StockSharp de alto nível do consultor especialista MetaTrader 4 Get trend.mq4. Ele avalia o gráfico M15 para entradas, valida a tendência mais ampla no H1 e se baseia em duas médias móveis suavizadas juntamente com um par de osciladores para detectar rompimentos de reversão à média próximos à tendência de longo prazo. A implementação mantém a gestão de dinheiro original regras baseadas em distâncias fixas de take-profit, stop-loss e trailing-stop expressas em pontos de preço.

Lógica de negociação

  1. Indicadores e dados
    • As velas M15 alimentam uma média móvel suavizada (SMMA, preço mediano) com período M15MaPeriod e dois osciladores estocásticos.
    • As velas H1 alimentam outro SMMA (preço médio) com período H1MaPeriod.
    • O estocástico rápido (FastStochasticPeriod, 3, 3) fornece a linha %K e seu valor anterior. O estocástico lento (SlowStochasticPeriod, 3, 3) fornece a linha de sinal %D.
  2. Configuração longa
    • O fechamento atual do M15 está abaixo do seu SMMA e o fechamento do H1 está abaixo do seu próprio SMMA.
    • A distância entre o M15 SMMA e o fechamento está dentro de ThresholdPoints etapas de preço.
    • Ambas as linhas estocásticas estão abaixo de 20. A linha rápida cruza acima da linha lenta durante a última vela (fast > slow enquanto o valor rápido anterior estava abaixo de slow).
    • Se existir uma posição curta, a estratégia primeiro compra volume suficiente para achatá-la e depois abre uma nova posição longa com TradeVolume.
  3. Configuração curta reflete a lógica longa:
    • Ambos os fechamentos estão acima de seus SMMAs, a distância está dentro de ThresholdPoints, os valores estocásticos estão acima de 80 e o rápido linha cruza abaixo da linha lenta. A estratégia vende, fechando uma posição comprada existente, se necessário.
  4. Gerenciamento de riscos
    • Após cada entrada, as ordens de proteção são colocadas em StopLossPoints e TakeProfitPoints (convertidas em preço absoluto distâncias usando a etapa de preço do instrumento).
    • Um trailing stop realinha a ordem de stop loss quando a negociação ganha pelo menos TrailingStopPoints pontos. A nova parada é posicionado no fechamento atual menos/mais a distância de fuga para posições compradas/vendidas, respectivamente.
    • Quando a posição retornar à estabilidade, todas as ordens de proteção serão canceladas.

Diferenças em relação ao original EA

  • O SMMA de MetaTrader usa uma mudança de indicador de oito barras; Os indicadores StockSharp não expõem uma configuração de mudança direta. O porto avalia o valor finalizado mais recente. Isso mantém o tempo de cruzamento, evitando buffers personalizados adicionais.
  • O EA original usou as cotações de compra/venda de MQL para rastreamento. A porta usa o fechamento da vela finalizada que acionou o trailing atualização, que é o análogo mais próximo disponível no API de alto nível.
  • O gerenciamento de dinheiro depende dos ajudantes de registro de pedidos de StockSharp (BuyMarket, SellMarket, SellStop, etc.) em vez de OrderSend e OrderModify.

Parâmetros

Grupo Nome Descrição Padrão
Dados M15 Candle Type Tipo/período de vela utilizado para os principais cálculos. Prazo M15
Dados H1 Candle Type Tipo/prazo de vela usado para confirmação. Período H1
Indicadores M15 SMMA Period Comprimento da média móvel suavizada na série M15. 200
Indicadores H1 SMMA Period Comprimento da média móvel suavizada na série H1. 200
Indicadores Slow Stochastic Period Comprimento %K para o oscilador estocástico lento que fornece a linha %D. 14
Indicadores Fast Stochastic Period Comprimento %K para o oscilador estocástico rápido que fornece a linha %K principal. 14
Sinais Threshold (points) Distância máxima entre o SMMA M15 e o fechamento atual para permitir entradas. 50
Risco Take Profit (points) Distância de lucro expressa em etapas de preço. 570
Risco Stop Loss (points) Distância de stop-loss expressa em etapas de preço. 30
Risco Trailing Stop (points) Distância do trailing-stop expressa em etapas de preço. 200
Negociação Trade Volume Volume enviado com cada ordem de mercado. 0,1

Notas para uso

  • Certifique-se de que o título negociado exponha PriceStep; caso contrário, as distâncias baseadas em pontos cairão para 1, o que pode levar a grandes ordens de proteção sobre instrumentos cotados em unidades fracionárias.
  • A estratégia cancela e recria ordens de stop assim que um melhor nível de trailing for detectado. Corretores que não permitem modificações podem exigir limitação.
  • Como a porta opera apenas com velas finalizadas, o sistema foi projetado para backtests e execução de fim de barra. Executando os dados do live tick requerem a correspondência das configurações de construção da vela entre o terminal e StockSharp.
using System;

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

namespace StockSharp.Samples.Strategies;

public class GetTrendStochasticStrategy : Strategy
{
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<int> _emaPeriod;
	private readonly StrategyParam<decimal> _oversold;
	private readonly StrategyParam<decimal> _overbought;
	private readonly StrategyParam<int> _cooldownCandles;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevRsi;
	private bool _hasPrev;
	private int _cooldownRemaining;

	public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
	public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
	public decimal Oversold { get => _oversold.Value; set => _oversold.Value = value; }
	public decimal Overbought { get => _overbought.Value; set => _overbought.Value = value; }
	public int CooldownCandles { get => _cooldownCandles.Value; set => _cooldownCandles.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public GetTrendStochasticStrategy()
	{
		_rsiPeriod = Param(nameof(RsiPeriod), 14).SetDisplay("RSI Period", "RSI lookback", "Indicators");
		_emaPeriod = Param(nameof(EmaPeriod), 20).SetDisplay("EMA Period", "EMA filter", "Indicators");
		_oversold = Param(nameof(Oversold), 35m).SetDisplay("Oversold", "RSI oversold level", "Levels");
		_overbought = Param(nameof(Overbought), 65m).SetDisplay("Overbought", "RSI overbought level", "Levels");
		_cooldownCandles = Param(nameof(CooldownCandles), 30).SetDisplay("Cooldown", "Candles between signals", "General");
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame()).SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevRsi = default;
		_hasPrev = default;
		_cooldownRemaining = default;
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevRsi = 0;
		_hasPrev = false;
		_cooldownRemaining = 0;

		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
		var ema = new ExponentialMovingAverage { Length = EmaPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(rsi, ema, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal rsi, decimal ema)
	{
		if (candle.State != CandleStates.Finished) return;
		var close = candle.ClosePrice;
		if (!_hasPrev) { _prevRsi = rsi; _hasPrev = true; return; }

		if (_cooldownRemaining > 0)
		{
			_cooldownRemaining--;
			_prevRsi = rsi;
			return;
		}

		if (_prevRsi <= Oversold && rsi > Oversold && close > ema && Position <= 0)
		{
			if (Position < 0) BuyMarket();
			BuyMarket();
			_cooldownRemaining = CooldownCandles;
		}
		else if (_prevRsi >= Overbought && rsi < Overbought && close < ema && Position >= 0)
		{
			if (Position > 0) SellMarket();
			SellMarket();
			_cooldownRemaining = CooldownCandles;
		}
		_prevRsi = rsi;
	}
}