Ver no GitHub

Estratégia Hércules

A estratégia Hercules é uma versão StockSharp do especialista MetaTrader Hercules v1.3 (Majors). Ele combina um cruzamento de média móvel rápida/lenta com filtros de confirmação de vários períodos de tempo e executa duas metas de lucro independentes por sinal.

Lógica de negociação

  • Braço de sinal – calcula um EMA rápido (padrão 1 período) no fechamento da vela e um SMA lento (72 períodos) na abertura da vela. Detecte cruzamentos que aconteceram na última ou penúltima barra. O preço cruzado é calculado em média entre ambas as médias móveis e um nível de gatilho é colocado TriggerPips acima (para posições compradas) ou abaixo (para posições vendidas).
  • Janela de execução – uma vez detectado um cruzamento, a configuração permanece válida por duas barras completas. Somente quando o fechamento atual exceder o preço de gatilho dentro desta janela a ordem poderá ser disparada.
  • Filtros
    • H1 RSI (comprimento padrão 10, entrada de preço típica) deve estar acima de RsiUpper para posições compradas e abaixo de RsiLower para posições vendidas.
    • O fechamento atual deve quebrar a máxima/mínima recente coletada em LookbackMinutes velas no período de negociação.
    • O envelope diário (SMA 24 com ±DailyEnvelopeDeviation%) exige que o preço feche fora da banda na direção da negociação.
    • O envelope H4 (SMA 96 com ±H4EnvelopeDeviation%) adiciona uma segunda confirmação de período de tempo superior.
  • Gerenciamento de risco – o stop-loss é definido para o máximo/mínimo da barra quatro velas atrás. O volume pode ser fixo (OrderVolume) ou recalculado a partir de RiskPercent do valor atual do portfólio.
  • Gestão comercial – cada sinal abre duas ordens de mercado de igual volume. O primeiro é liquidado em TakeProfitFirstPips, o segundo em TakeProfitSecondPips. Um trailing stop de TrailingStopPips mantém ambas as ordens protegidas. Quando o stop ou ambos os alvos são concluídos, a estratégia entra em um período de blackout de BlackoutHours durante o qual nenhuma nova negociação é realizada.

Parâmetros

Parâmetro Descrição
OrderVolume Volume de cada ordem de mercado antes dos ajustes de gestão monetária.
UseMoneyManagement Quando ativado, recalcula o volume de RiskPercent do portfólio e a distância de parada atual.
RiskPercent Porcentagem do valor do portfólio em relação ao risco por configuração.
TriggerPips Distância do preço de cruzamento que deve ser ultrapassada para permitir uma entrada.
TrailingStopPips Distância do trailing stop em pips aplicada à posição combinada.
TakeProfitFirstPips Distância pip do primeiro take-profit parcial.
TakeProfitSecondPips Distância pip do segundo take-profit parcial.
FastPeriod Comprimento da linha de disparo rápida EMA.
SlowPeriod Comprimento da linha de base lenta SMA.
RsiPeriod Comprimento do filtro de confirmação RSI.
RsiUpper / RsiLower RSI limites que permitem negociações longas e curtas.
LookbackMinutes Janela (em minutos) usada para calcular o filtro de rompimento de máxima/mínima recente.
BlackoutHours Horas para pausar após uma execução antes de aceitar uma nova configuração.
DailyEnvelopePeriod / DailyEnvelopeDeviation Parâmetros do filtro de envelope diário.
H4EnvelopePeriod / H4EnvelopeDeviation Parâmetros do filtro envelope H4.
CandleType Prazo principal utilizado para execução da negociação.
RsiTimeFrame Período que alimenta o indicador RSI.
DailyTimeFrame Prazo que alimenta o cálculo do envelope diário.
H4TimeFrame Prazo que alimenta o cálculo do envelope H4.

Arquivos

  • CS/HerculesStrategy.cs – implementação em C# da estratégia Hercules.
  • README.md – este documento.
  • README_ru.md – Descrição russa.
  • README_zh.md – descrição chinesa.
using System;



using StockSharp.Algo.Indicators;

using StockSharp.Algo.Strategies;

using StockSharp.BusinessEntities;

using StockSharp.Messages;



namespace StockSharp.Samples.Strategies;



public class HerculesStrategy : Strategy

{

	private readonly StrategyParam<int> _rsiPeriod;

	private readonly StrategyParam<DataType> _candleType;



	private decimal _prevRsi; private bool _hasPrev;

	private int _cooldown;



	public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }

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



	public HerculesStrategy()

	{

		_rsiPeriod = Param(nameof(RsiPeriod), 14).SetDisplay("RSI Period", "RSI lookback", "Indicators");

		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(15).TimeFrame()).SetDisplay("Candle Type", "Candle timeframe", "General");

	}



	/// <inheritdoc />

	protected override void OnReseted()

	{

		base.OnReseted();

		_prevRsi = default;

		_hasPrev = default;

		_cooldown = default;

	}



	/// <inheritdoc />

	protected override void OnStarted2(DateTime time)

	{

		base.OnStarted2(time);

		_hasPrev = false;

		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };

		var subscription = SubscribeCandles(CandleType);

		subscription.Bind(rsi, ProcessCandle).Start();

	}



	private void ProcessCandle(ICandleMessage candle, decimal rsi)

	{

		if (candle.State != CandleStates.Finished) return;

		if (!IsFormedAndOnlineAndAllowTrading()) return;

		if (!_hasPrev) { _prevRsi = rsi; _hasPrev = true; return; }

		if (_cooldown > 0)

		{

			_cooldown--;

			_prevRsi = rsi;

			return;

		}



		if (_prevRsi <= 30 && rsi > 30 && Position <= 0)

		{

			var volume = Volume + Math.Abs(Position);

			BuyMarket(volume);

			_cooldown = 2;

		}

		else if (_prevRsi >= 70 && rsi < 70 && Position >= 0)

		{

			var volume = Volume + Math.Abs(Position);

			SellMarket(volume);

			_cooldown = 2;

		}

		_prevRsi = rsi;

	}

}