Auf GitHub ansehen

Herkules-Strategie

Die Hercules-Strategie ist eine StockSharp-Portierung des MetaTrader-Experten Hercules v1.3 (Majors). Es kombiniert einen schnellen/langsamen gleitenden Durchschnitt mit Multi-Timeframe-Bestätigungsfiltern und führt zwei unabhängige Gewinnziele pro Signal aus.

Handelslogik

  • Signalarm – Berechnen Sie einen schnellen EMA (Standard 1 Periode) beim Schließen der Kerze und einen langsamen SMA (72 Perioden) beim Öffnen der Kerze. Erkennen Sie Überkreuzungen, die im letzten oder vorletzten Takt aufgetreten sind. Der Crossover-Preis wird über beide gleitenden Durchschnitte gemittelt und ein Auslöseniveau wird TriggerPips darüber (für Long-Positionen) oder darunter (für Short-Positionen) platziert.
  • Ausführungsfenster – Sobald ein Crossover erkannt wird, bleibt das Setup für zwei volle Takte gültig. Nur wenn der aktuelle Schlusskurs den Auslösepreis innerhalb dieses Fensters überschreitet, darf die Order ausgelöst werden.
  • Filter
    • H1 RSI (Standardlänge 10, typische Preiseingabe) muss für Long-Positionen über RsiUpper und für Short-Positionen unter RsiLower liegen.
    • Der aktuelle Schlusskurs muss das letzte Hoch/Tief von über LookbackMinutes Kerzen im Handelszeitraum durchbrechen.
    • Der tägliche Umschlag (SMA 24 mit ±DailyEnvelopeDeviation %) erfordert, dass der Preis außerhalb des Bandes in Handelsrichtung schließt.
    • Der H4-Umschlag (SMA 96 mit ±H4EnvelopeDeviation %) fügt eine zweite Bestätigung für einen höheren Zeitrahmen hinzu.
  • Risikomanagement – der Stop-Loss wird auf das Hoch/Tief des Balkens vier Kerzen zurück gesetzt. Das Volumen kann fest (OrderVolume) oder aus RiskPercent des aktuellen Portfoliowerts neu berechnet werden.
  • Handelsmanagement – jedes Signal eröffnet zwei Marktaufträge mit gleichem Volumen. Der erste wird am TakeProfitFirstPips liquidiert, der zweite am TakeProfitSecondPips. Ein Trailing Stop von TrailingStopPips schützt beide Orders. Wenn entweder der Stop oder beide Ziele erreicht sind, tritt für die Strategie eine Blackout-Periode von BlackoutHours ein, in der keine neuen Trades getätigt werden.

Parameter

Parameter Beschreibung
OrderVolume Volumen jeder Marktorder vor Money-Management-Anpassungen.
UseMoneyManagement Wenn diese Option aktiviert ist, wird das Volumen aus RiskPercent des Portfolios und der aktuellen Stoppdistanz neu berechnet.
RiskPercent Prozentsatz des Portfoliowerts zum Risiko pro Setup.
TriggerPips Abstand vom Crossover-Preis, der überschritten werden muss, um einen Einstieg zu ermöglichen.
TrailingStopPips Trailing-Stop-Distanz in Pips, angewendet auf die kombinierte Position.
TakeProfitFirstPips Pip-Abstand des ersten Teil-Take-Profits.
TakeProfitSecondPips Pip-Abstand des zweiten Teil-Take-Profits.
FastPeriod Länge der schnellen EMA-Triggerlinie.
SlowPeriod Länge der langsamen SMA-Basislinie.
RsiPeriod Länge des Bestätigungsfilters RSI.
RsiUpper / RsiLower RSI Schwellenwerte, die Long- und Short-Trades ermöglichen.
LookbackMinutes Fenster (in Minuten), das zur Berechnung des aktuellen Hoch-/Tief-Breakout-Filters verwendet wird.
BlackoutHours Stundenlange Pause nach einer Ausführung, bevor ein neues Setup akzeptiert wird.
DailyEnvelopePeriod / DailyEnvelopeDeviation Parameter des täglichen Hüllkurvenfilters.
H4EnvelopePeriod / H4EnvelopeDeviation Parameter des H4-Hüllkurvenfilters.
CandleType Hauptzeitrahmen für die Handelsausführung.
RsiTimeFrame Zeitrahmen, der den Indikator RSI speist.
DailyTimeFrame Zeitrahmen, der in die Berechnung des täglichen Umschlags einfließt.
H4TimeFrame Zeitrahmen, der in die Berechnung des H4-Umschlags einfließt.

Dateien

  • CS/HerculesStrategy.cs – C#-Implementierung der Hercules-Strategie.
  • README.md – dieses Dokument.
  • README_ru.md – Russische Beschreibung.
  • README_zh.md – Chinesische Beschreibung.
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;

	}

}