Auf GitHub ansehen

Bull-&-Bear-Candle-Martingal-Strategie

Überblick

Die Strategie reagiert auf starke bullische und bärische Kerzen und eröffnet Marktpositionen in dieselbe Richtung. Sie nutzt eine unabhängige Martingal-Sequenz für jede Seite: Long-Positionen skalieren das Volumen mit dem Bull Multiplier, Short-Positionen verwenden den Bear Multiplier. Schutzdistanzen für Stop-Loss und Take-Profit werden ebenfalls getrennt je Richtung konfiguriert, was präzise Kontrolle über das asymmetrische Verhalten des ursprünglichen MQL-Expert-Advisors ermöglicht.

Handelslogik

  1. Den konfigurierten Kerzentyp abonnieren (Standard: 1 Minute) und nur auf abgeschlossene Kerzen warten.
  2. Wenn keine Position offen ist:
    • Bullisches Setup: Wenn Close > Open und die Kerzenkörpergröße den bullischen Körperfilter überschreitet, zum Markt kaufen.
    • Bärisches Setup: Wenn Close < Open und die Körpergröße den bärischen Körperfilter überschreitet, zum Markt verkaufen.
  3. Jeder Einstieg setzt Stop-Loss- und Take-Profit-Orders, die aus Pip-Distanzen in den Preisschritt des Instruments umgerechnet werden.
  4. Wenn eine Position schließt, wird der realisierte PnL mit der vorherigen Basislinie verglichen:
    • Ein negatives Ergebnis multipliziert das jeweilige Martingal-Volumen.
    • Ein positives oder Break-even-Ergebnis setzt diese Seite auf das Anfangsvolumen zurück.
  5. Neue Signale werden ignoriert, solange eine Position offen ist, wodurch das Single-Trade-Verhalten des Quell-EA reproduziert wird.

Geldmanagement

  • Long- und Short-Martingal-Zyklen werden unabhängig verfolgt, sodass eine verlierende Long-Serie den nächsten Short-Trade nicht beeinflusst und umgekehrt.
  • Volumen werden an VolumeStep der Security ausgerichtet, um Orderablehnungen zu vermeiden.
  • StartProtection(useMarketOrders: true) aktiviert StockSharps Schutzorder-Verwaltung für die angehängten Stop- und Take-Niveaus.

Parameter

Parameter Beschreibung
Initial Volume Basisvolumen, mit dem jeder Martingal-Zyklus für beide Richtungen startet.
Bull Multiplier Multiplikator für den nächsten bullischen Trade nach einer verlierenden Long-Position.
Bear Multiplier Multiplikator für den nächsten bärischen Trade nach einer verlierenden Short-Position.
Bull Stop Loss Stop-Loss-Distanz in Pips für bullische Trades, in Preis über den Instrumentenschritt konvertiert.
Bull Take Profit Take-Profit-Distanz in Pips für bullische Trades.
Bear Stop Loss Stop-Loss-Distanz in Pips für bärische Trades.
Bear Take Profit Take-Profit-Distanz in Pips für bärische Trades.
Bull Body Filter Minimaler bullischer Kerzenkörper in Pips, der eine Kauforder auslöst.
Bear Body Filter Minimaler bärischer Kerzenkörper in Pips, der eine Verkaufsorder auslöst.
Candle Type Zeitrahmen für die Signalerzeugung (standardmäßig 1-Minuten-Zeitrahmen).

Nutzungshinweise

  • Stellen Sie sicher, dass die verbundene Security gültige PriceStep- und VolumeStep-Werte bereitstellt. Die Strategie verwendet standardmäßig 0.0001, wenn PriceStep nicht geliefert wird.
  • Die Martingal-Logik stützt sich auf realisierten PnL, daher aktualisiert auch manuelles Schließen von Positionen die Sequenz korrekt.
  • Optimierung kann sich auf Körperfilter und Multiplikator-Kombinationen konzentrieren, um Reaktionsfähigkeit gegen Drawdown auszubalancieren.
using System;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Bull/Bear Candle Martingale strategy: Bullish/bearish candle direction + EMA filter.
/// Buys after strong bullish candle when close crosses above EMA.
/// Sells after strong bearish candle when close crosses below EMA.
/// </summary>
public class BullBearCandleMartingaleStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _emaPeriod;

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

	public int EmaPeriod
	{
		get => _emaPeriod.Value;
		set => _emaPeriod.Value = value;
	}

	public BullBearCandleMartingaleStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");

		_emaPeriod = Param(nameof(EmaPeriod), 30)
			.SetGreaterThanZero()
			.SetDisplay("EMA Period", "EMA period", "Indicators");
	}

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

		var ema = new ExponentialMovingAverage { Length = EmaPeriod };

		decimal? prevClose = null;
		decimal? prevEma = null;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(ema, (candle, emaVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var close = candle.ClosePrice;
				var bullish = close > candle.OpenPrice;
				var bearish = close < candle.OpenPrice;
				var bodySize = Math.Abs(close - candle.OpenPrice);
				var range = candle.HighPrice - candle.LowPrice;

				// Require strong candle body (>50% of range)
				var strongCandle = range > 0 && bodySize / range > 0.5m;

				if (prevClose.HasValue && prevEma.HasValue && strongCandle)
				{
					var crossUp = prevClose.Value <= prevEma.Value && close > emaVal;
					var crossDown = prevClose.Value >= prevEma.Value && close < emaVal;

					if (bullish && crossUp && Position <= 0)
						BuyMarket();
					else if (bearish && crossDown && Position >= 0)
						SellMarket();
				}

				prevClose = close;
				prevEma = emaVal;
			})
			.Start();

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