Auf GitHub ansehen

Histo Scalper-Strategie

Überblick

Die Histo Scalper Strategy ist eine C#-Portierung des MetaTrader Expert Advisors HistoScalperEA v1.0. Der Algorithmus verschmilzt acht Indikatoren im Histogrammstil (ADX, ATR, Bollinger Bands, Bulls/Bears Power, CCI, MACD, RSI und Stochastic) und erfordert die einstimmige Zustimmung aller aktivierten Filter, bevor ein Handel eröffnet wird. Eine zweite Anforderung besteht darin, dass mindestens ein Filter die entgegengesetzte Richtung des vorherigen Balkens meldet, was verhindert, dass die Strategie bei flachen Märkten eintritt, und die ursprüngliche Bestätigungslogik „zwei Balken“ nachahmt.

Signalerzeugung

  1. ADX-Filter – prüft, ob +DI größer als −DI ist. Optional können Sie die Entscheidung umkehren.
  2. ATR-Filter – vergleicht den aktuellen ATR mit einer SMA-Basislinie und misst die prozentuale Abweichung. Long-Trades erfordern eine positive Abweichung über AtrPositiveThreshold; Short-Trades erfordern eine negative Abweichung unter AtrNegativeThreshold.
  3. Bollinger Ausbruch – erwartet, dass der Schlusskurs das obere/untere Band durchbricht.
  4. Bullen-/Bears-Power – nutzt Bulls-Power für Long-Einstiege und Bears-Power-Größe für Short-Einstiege.
  5. CCI – wird ausgelöst, wenn der Wert CCI die konfigurierten überverkauften/überkauften Ebenen überschreitet.
  6. MACD-Histogramm – misst den Abstand zwischen MACD und seiner Signallinie.
  7. RSI – verwendet klassische überverkaufte/überkaufte Zonen.
  8. Stochastic – liest die %K-Zeile und vergleicht sie mit konfigurierten Grenzen.

Wenn ein aktivierter Filter einen neutralen Wert erzeugt, bricht die Strategie die Verarbeitung für die aktuelle Kerze ab. Der historische Zustand jedes Filters wird gespeichert, um die Regel „vorheriger Balken gegenüber“ durchzusetzen.

Risikomanagement

  • Markteinträge verwenden den Parameter TradeVolume.
  • Optionales Pyramiding erhöht die Zahl der offenen Positionen; Andernfalls ändert die Strategie nur die Richtung, wenn sich das Signal ändert.
  • Take-Profit- und Stop-Loss-Level werden in Preisschritten des Instruments ausgedrückt und unmittelbar nach Auftragserteilung über SetTakeProfit und SetStopLoss angewendet.
  • Ein Sitzungsfilter (UseTimeFilter, SessionStart, SessionEnd) kann den Handel außerhalb der konfigurierten Zeiten deaktivieren.

Parameter

Parameter Beschreibung
TradeVolume Basisvolumen für neue Trades.
AllowPyramiding Ermöglicht das Stapeln zusätzlicher Trades, während bereits positioniert.
CloseOnOppositeSignal Schließt bestehende Positionen, wenn das aggregierte Signal umkehrt.
UseTimeFilter, SessionStart, SessionEnd Beschränkt den Handel auf ein benutzerdefiniertes Tagesfenster.
UseTakeProfit, TakeProfitPoints Ermöglicht und konfiguriert Take-Profit in Preisschritten.
UseStopLoss, StopLossPoints Aktiviert und konfiguriert Stop-Loss in Preisschritten.
UseIndicator1UseIndicator8 Aktivieren Sie einzelne Filter.
ModeIndicatorX Wechseln Sie für jeden Filter zwischen gerader und invertierter Logik.
Indikatorenspezifische Einstellungen Zeiträume, Schwellenwerte und Ebenen, die die ursprünglichen Eingaben des Expertenberaters nachbilden.

Unterschiede zum MQL Expert

  • Auf die Korb-Gewinn-/Verlustverwaltung, akustische Alarme und die Rasterauftragsverwaltung wurde bewusst verzichtet.
  • Die Risikoautomatisierung (automatische Losgrößenbestimmung, Break-Even- und Trailing-Logik) ist nicht enthalten; Verwenden Sie stattdessen die oben genannten Risikoparameter.
  • Spread-Checks und Broker-spezifische Schutzmaßnahmen werden nicht portiert.

Nutzungshinweise

  1. Legen Sie Security und Portfolio fest, bevor Sie mit der Strategie beginnen.
  2. Passen Sie den Kerzentyp (CandleType) an den gewünschten Zeitrahmen an.
  3. Konfigurieren Sie die Indikatorschwellenwerte so, dass sie zur Volatilität des Zielinstruments passen.
  4. Aktivieren oder deaktivieren Sie Filter einzeln, um die Optimierung zu vereinfachen.
  5. Verwenden Sie AllowPyramiding und CloseOnOppositeSignal, um die Präsenz in schnellen Märkten zu kontrollieren.
namespace StockSharp.Samples.Strategies;

using System;

using Ecng.Common;

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

/// <summary>
/// Multi-indicator scalping strategy combining MACD, RSI, and CCI filters.
/// Buys when all indicators agree on bullish signal. Sells on bearish agreement.
/// </summary>
public class HistoScalperStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<int> _cciPeriod;

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

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

	public int CciPeriod
	{
		get => _cciPeriod.Value;
		set => _cciPeriod.Value = value;
	}

	public HistoScalperStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");

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

		_cciPeriod = Param(nameof(CciPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("CCI Period", "CCI period", "Indicators");
	}

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

		var macd = new MovingAverageConvergenceDivergence();
		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
		var cci = new CommodityChannelIndex { Length = CciPeriod };

		decimal? prevMacd = null;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(macd, rsi, cci, (candle, macdLine, rsiVal, cciVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				if (prevMacd.HasValue)
				{
					if (prevMacd.Value <= 0 && macdLine > 0 && rsiVal < 70m && cciVal > -100m && Position <= 0)
						BuyMarket();
					else if (prevMacd.Value >= 0 && macdLine < 0 && rsiVal > 30m && cciVal < 100m && Position >= 0)
						SellMarket();
				}

				prevMacd = macdLine;
			})
			.Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawOwnTrades(area);
		}
	}
}