Auf GitHub ansehen

Martingale Intelligente Strategie

Überblick

Martingale Smart ist eine Umsetzung des MetaTrader Expertenberaters „Martingale Smart“. Die Strategie behält immer nur eine offene Position bei und wechselt nach jedem Verlustzyklus zwischen zwei verschiedenen Einstiegsfiltern:

  1. Primärfilter – Kreuzung zwischen zwei einfachen gleitenden Durchschnitten kombiniert mit der Richtung eines Histogramms mit höherem Zeitrahmen MACD. Dies ist der Standardeingabemodus.
  2. Sekundärer Filter – Hüllkurven mit gleitendem Durchschnitt. Wenn der gleitende Verlust des vorherigen Zyklus negativ ist, wechselt die Strategie zu diesem Filter. Ein weiterer Verlust schaltet zurück auf den Primärfilter.

Die Martingal-Komponente erhöht das Volumen des nächsten Handels nach einem Verlustzyklus. Sie können entweder das letzte Volumen multiplizieren (klassisches Martingal) oder ein festes Inkrement hinzufügen.

Datenabonnements

  • CandleType – Zeitrahmen, der für die Hauptberechnungen und das Handelsmanagement verwendet wird.
  • MacdTimeFrame – sekundärer Zeitrahmen für den MACD-Filter. Der Standardwert ist ein Monat, um den ursprünglichen EA nachzuahmen, der den Zeitrahmen PERIOD_MN1 verwendete.

Beide Abonnements werden automatisch in OnStarted gestartet.

Handelslogik

  1. Ein neuer Handel wird nur dann in Betracht gezogen, wenn keine offene Position vorliegt und alle Indikatoren gebildet sind.
  2. Der Primärfilter geht long, wenn der schnelle MA unter dem langsamen MA liegt und die MACD-Linie über dem Signal liegt (dieselbe Logik für bärische Fälle). Diese Bedingungen folgen dem ursprünglichen EA, das iMA und iMACD mit einer Verschiebung um einen Takt verwendete.
  3. Der Sekundärfilter verwendet eine einfache Hüllkurve mit gleitendem Durchschnitt. Ein Schlusskurs oberhalb des unteren Bandes signalisiert einen Long-Einstieg, während ein Schlusskurs unterhalb des oberen Bandes einen Short-Einstieg signalisiert. Dies reproduziert die auf iEnvelopes basierende Logik.
  4. Wenn ein Zyklus mit einem negativen Gewinn endet, wechselt die Strategie zum alternativen Filter und berechnet das nächste Volumen gemäß den Martingal-Parametern. Ein profitabler Zyklus behält den aktuellen Filter bei und setzt die Lautstärke auf den Anfangswert zurück.
  5. Unmittelbar nach jedem Einstieg werden schützende Stop-Loss- und Take-Profit-Levels mithilfe von Pip-basierten Abständen festgelegt.

Risikomanagement

  • Break-Even-Stop – sobald der nicht realisierte Gewinn BreakEvenTriggerPips erreicht, springt der Stop-Loss auf den Einstiegspreis zuzüglich eines optionalen Offsets.
  • Klassischer Trailing Stop – behält einen beweglichen Stop bei, der TrailingStopPips vom letzten Schlusskurs entfernt bleibt.
  • Gewinn in Geld mitnehmen – schließt die Position, wenn der variable Gewinn MoneyTakeProfit übersteigt.
  • Take Profit in Prozent – ähnlich dem Geldziel, jedoch ausgedrückt als Prozentsatz des aktuellen Portfoliowerts.
  • Geld-Trailing-Stop – wird aktiviert, wenn der variable Gewinn MoneyTrailingTarget erreicht; Anschließend verfolgt die Strategie die Gewinnspitze und liquidiert die Position, wenn der Drawdown MoneyTrailingDrawdown überschreitet.

Alle monetären Berechnungen basieren auf den PriceStep und StepPrice des Instruments. Wenn die Datenquelle diese nicht bereitstellt, greift die Strategie auf eine einfache Preis-Volumen-Schätzung zurück.

Parameter

Parameter Beschreibung
UseMoneyTakeProfit Aktivieren Sie die feste monetäre Take-Profit-Regel.
MoneyTakeProfit Variables Gewinnziel in der Kontowährung.
UsePercentTakeProfit Aktivieren Sie den prozentualen Take-Profit.
PercentTakeProfit Variables Gewinnziel in % des Portfoliowerts.
EnableMoneyTrailing Ermöglichen Sie einen Gewinnrücklauf in Geld.
MoneyTrailingTarget Gewinnniveau, das den Trailing Block aktiviert.
MoneyTrailingDrawdown Maximal zulässige Gewinnrückgabe, sobald das Trailing aktiv ist.
UseBreakEven Verschieben Sie den Stop-Loss nach der konfigurierten Distanz auf die Gewinnschwelle.
BreakEvenTriggerPips Erforderliche Gewinndistanz in Pips, bevor sich der Stop bewegt.
BreakEvenOffsetPips Zusätzliche Pips werden zum Break-Even-Stopp hinzugefügt.
MartingaleMultiplier Nach einem Verlustzyklus angewendeter Multiplikationsfaktor.
InitialVolume Für die erste Ordnung jedes Zyklus verwendetes Volumen.
UseDoubleVolume Wenn wahr, multiplizieren Sie das Volumen; andernfalls gilt LotIncrement.
LotIncrement Festes Losinkrement, das verwendet wird, wenn die Verdoppelung deaktiviert ist.
TrailingStopPips Abstand des klassischen Trailing Stops in Pips.
StopLossPips Anfängliche Stop-Loss-Distanz in Pips.
TakeProfitPips Anfängliche Take-Profit-Distanz in Pips.
FastMaPeriod Periode des schnellen gleitenden Durchschnitts.
SlowMaPeriod Periode des langsamen gleitenden Durchschnitts.
EnvelopePeriod Periode des gleitenden Hüllkurvendurchschnitts.
EnvelopeDeviation Umschlagbreite in Prozent.
MacdFastLength Schnelle EMA-Länge innerhalb von MACD.
MacdSlowLength Langsame EMA-Länge innerhalb von MACD.
MacdSignalLength Signallänge EMA innerhalb von MACD.
CandleType Zeitrahmen des Hauptsignals.
MacdTimeFrame Zeitrahmen für die MACD Kerzen.

Nutzungshinweise

  1. Der Martingal-Schritt wird nur ausgeführt, wenn die vorherige Position vollständig mit einem Verlust geschlossen wurde.
  2. Die Strategie erwartet jeweils eine offene Position; Es liquidiert immer die aktuelle Position, bevor es in die entgegengesetzte Richtung einsteigt.
  3. Für genaue geldbasierte Schwellenwerte konfigurieren Sie die Vertragsspezifikationen des Instruments (PriceStep, StepPrice und VolumeStep).
  4. Break-even- und Trailing-Stops werden bei geschlossenen Kerzen im Hauptzeitrahmen ausgewertet; Intrabar-Spikes werden ignoriert.

Unterschiede zum MetaTrader EA

  • Die Konvertierung verwendet StockSharps übergeordnetes API (SubscribeCandles + Bind) und den Indikator MovingAverageConvergenceDivergenceSignal anstelle direkter Aufrufe von iMACD.
  • Einige Broker-spezifische Prüfungen (Einfrierstufen, manuelle E-Mail-/Benachrichtigungsaufrufe, Ticket-basierte Schleifen) werden weggelassen, da die StockSharp-Engine diese Aspekte intern verwaltet.
  • Geldbasierte Schutzmaßnahmen basieren auf aggregierten Positionen und nicht auf Berechnungen pro Ticket und entsprechen dem Kontomodell von StockSharp.
namespace StockSharp.Samples.Strategies;

using System;

using Ecng.Common;

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

/// <summary>
/// Smart Martingale strategy: MACD + MA filter with martingale volume on loss.
/// Buys when fast MA crosses above slow MA. Sells on cross below.
/// </summary>
public class MartingaleSmartStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;

	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 MartingaleSmartStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");

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

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

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

		var fast = new SimpleMovingAverage { Length = FastPeriod };
		var slow = new SimpleMovingAverage { Length = SlowPeriod };

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

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

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				if (prevFast.HasValue && prevSlow.HasValue)
				{
					if (prevFast.Value <= prevSlow.Value && fastVal > slowVal && Position <= 0)
						BuyMarket();
					else if (prevFast.Value >= prevSlow.Value && fastVal < slowVal && 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);
		}
	}
}