Auf GitHub ansehen

Gonna Scalp-Strategie

Überblick

Die Gonna Scalp-Strategie ist ein hochfrequenter MetaTrader-Expertenberater, der auf die StockSharp-Hochebene API portiert wurde. Das System sucht auf einem kurzfristigen Chart nach schnellen Mean-Reversion-Einträgen und respektiert dabei den vorherrschenden Markttrend. Die Bestätigung erfolgt durch einen Abstimmungsmechanismus, der Momentum-, CCI-, ATR-, stochastische Oszillator- und MACD-Filter bewertet, bevor ein Handel zugelassen wird. Es kann jeweils nur eine Position offen sein und jeder Trade ist durch feste Stop-Loss- und Take-Profit-Abstände geschützt, ausgedrückt in MetaTrader Punkten.

Handelslogik

  1. Indikatorvorbereitung
    • Schnelle und langsame gewichtete gleitende Durchschnitte (WMA), berechnet auf Basis typischer Preise.
    • Momentum (Periode 14) wird im Handelszeitraum bewertet und in einen absoluten Abstand vom neutralen Wert 100 umgerechnet.
    • Commodity Channel Index (Periode 20) und Average True Range (Periode 12) werden als Richtungsfilter verwendet.
    • Stochastic-Oszillator %K/%D (5/3/3) und MACD (26.12.9) wurden auf derselben Kerzenserie verarbeitet.
  2. Signalabstimmung
    • Jeder Indikator gibt eine Stimme für die bullische oder bärische Seite, wenn sein aktueller Wert den im ursprünglichen MetaTrader-Code identifizierten Trend unterstützt.
    • Die Strategie erfasst drei aktuelle Momentum-Distanzen und erfordert, dass mindestens eine davon einen konfigurierbaren Schwellenwert überschreitet, bevor ein neuer Trade zugelassen wird.
    • Zusätzliche Strukturprüfungen erfordern, dass das Tief des Balkens vor zwei Kerzen unter dem Hoch des vorherigen Balkens für Long-Positionen bleibt (Spiegelbedingung für Shorts).
  3. Auftragsausführung
    • Wenn die bullischen Stimmen die bärischen Stimmen übersteigen und alle Filter übereinstimmen, eröffnet die Strategie eine Long-Position mit der konfigurierten Losgröße.
    • Wenn die bärischen Stimmen die bullischen Stimmen überwiegen und der Momentumfilter zustimmt, wird eine Short-Position eröffnet.
  4. Risikomanagement
    • Jeder offene Handel wird von festen Stop-Loss- und Take-Profit-Abständen begleitet, die in MetaTrader Punkten gemessen und in Instrumentenpreisschritte übersetzt werden.
    • Die Schutzlogik schließt die Position auf der aktuellen Kerze, sobald eines der Niveaus durchbrochen wurde.

Schlüsselparameter

Name Beschreibung Standard
TradeVolume Basisauftragsgröße in Losen nach Volumenausrichtung. 0.01
FastMaPeriod Länge des schnellen WMA-Filters. 1
SlowMaPeriod Länge des langsamen WMA-Filters. 5
MomentumPeriod Anzahl der vom Momentum-Indikator verwendeten Balken. 14
MomentumBuyThreshold Minimale absolute Impulsabweichung, die für lange Einstiege erforderlich ist. 0.3
MomentumSellThreshold Minimale absolute Impulsabweichung, die für Short-Einstiege erforderlich ist. 0.3
StopLossSteps Stop-Loss-Distanz, ausgedrückt in MetaTrader Punkten. 200
TakeProfitSteps Take-Profit-Distanz ausgedrückt in MetaTrader Punkten. 200
CandleType Für alle Indikatoren verwendeter Zeitrahmen (standardmäßig 5-Minuten-Kerzen). M5

Nutzungshinweise

  • Passen Sie das Strategievolumen an das gehandelte Instrument an, indem Sie TradeVolume anpassen; Die Implementierung normalisiert es automatisch auf den Austauschlosschritt.
  • Die Stop-Loss- und Take-Profit-Parameter arbeiten in MetaTrader Punkten. Sie werden basierend auf der Präzision des Instruments in Instrumentenpreiseinheiten umgerechnet.
  • Aufgrund des Momentum-History-Puffers sind mindestens drei abgeschlossene Kerzen erforderlich, bevor die Abstimmungslogik Signale erzeugen kann.
  • Die Strategie vermeidet bewusst Pyramidenbildung; Ein neuer Trade wird erst dann eröffnet, wenn die vorherige Position durch das Risikomanagement oder ein gegenteiliges Signal geschlossen wurde.
  • Sie können die Strategie mit StockSharp-Diagrammen verbinden, um die WMAs, stochastischen und MACD-Reihen zur Signalvalidierung zu visualisieren.
namespace StockSharp.Samples.Strategies;

using System;

using Ecng.Common;

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

/// <summary>
/// Gonna Scalp strategy: WMA crossover with CCI momentum filter.
/// Buys when fast WMA above slow WMA and CCI above -100.
/// Sells when fast WMA below slow WMA and CCI below 100.
/// </summary>
public class GonnaScalpStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private readonly StrategyParam<int> _cciPeriod;

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

	public int FastPeriod
	{
		get => _fastPeriod.Value;
		set => _fastPeriod.Value = value;
	}

	public int SlowPeriod
	{
		get => _slowPeriod.Value;
		set => _slowPeriod.Value = value;
	}

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

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

		_fastPeriod = Param(nameof(FastPeriod), 10)
			.SetGreaterThanZero()
			.SetDisplay("Fast WMA", "Fast WMA period", "Indicators");

		_slowPeriod = Param(nameof(SlowPeriod), 30)
			.SetGreaterThanZero()
			.SetDisplay("Slow WMA", "Slow WMA period", "Indicators");

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

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

		var fast = new WeightedMovingAverage { Length = FastPeriod };
		var slow = new WeightedMovingAverage { Length = SlowPeriod };
		var cci = new CommodityChannelIndex { Length = CciPeriod };

		decimal? prevFast = null;
		decimal? prevSlow = null;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(fast, slow, cci, (candle, fastVal, slowVal, cciVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				if (prevFast.HasValue && prevSlow.HasValue)
				{
					var crossUp = prevFast.Value <= prevSlow.Value && fastVal > slowVal;
					var crossDown = prevFast.Value >= prevSlow.Value && fastVal < slowVal;

					if (crossUp && cciVal > -100m && Position <= 0)
						BuyMarket();
					else if (crossDown && cciVal < 100m && Position >= 0)
						SellMarket();
				}

				prevFast = fastVal;
				prevSlow = slowVal;
			})
			.Start();

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