Auf GitHub ansehen

Elite eFibo Trader-Strategie

Überblick

Elite eFibo Trader reproduziert den durchschnittlichen Expertenberater, der eine Fibonacci-Reihenfolge von Aufträgen eröffnet und dabei einen gleitenden Durchschnitt-Crossover und einen optionalen RSI-Filter überwacht. Der StockSharp-Port behält die ursprüngliche Korblogik bei: Ein Markteintritt löst einen Stapel ausstehender Stop-Orders aus, die durch konfigurierbare Pip-Abstände voneinander getrennt sind, und jede weitere Ausführung erhöht das Engagement gemäß der Fibonacci-Sequenz. Die Strategie flacht den Korb automatisch ab, sobald der variable Gewinn ein Cash-Ziel erreicht oder wenn der Trendfilter sich gegen das aktuelle Engagement wendet.

Marktdaten

  • Abonniert einen einzelnen konfigurierbaren Kerzentyp (Standard: 15-Minuten-Kerzen).
  • Verwendet den Kerzenschluss für Indikatorwerte und zur Bewertung von Trailing-/Stop-Bedingungen.

Eingabelogik

  1. Die Richtung wird entweder durch den Crossover des gleitenden Durchschnitts (standardmäßig aktiviert) oder durch die manuelle Umschaltung ManualOpenBuy/ManualOpenSell bestimmt.
  2. Wenn die MA-Logik aktiv ist, führt ein bullischer Crossover (fast über slow) zu Kaufkörben und ein bärischer Crossover zu Verkaufskörben. Es wird ein einzelnes Signal pro Kerze erzwungen.
  3. Wenn der Filter RSI aktiviert ist, erfordern lange Körbe RSI > RsiHigh, während kurze Körbe RSI < RsiLow erfordern.
  4. Eine neue Leiter wird nur geöffnet, wenn keine aktiven Aufträge oder Positionen aus der Strategie vorhanden sind und der Handel zulässig ist (TradeAgainAfterProfit).
  5. Die erste Ebene wird mit einer Marktorder eröffnet, während die restlichen Ebenen als Stop-Orders mit einem Versatz von LevelDistancePips übermittelt werden. Die Lautstärken folgen der Fibonacci-Reihenfolge und können Stufe für Stufe angepasst werden.

Exit-Logik

  • Jede gefüllte Ebene erhält einen anfänglichen Stopp, der ab StopLossPips berechnet wird, und nimmt an einer nachlaufenden Aktualisierung teil, wenn die MA-Logik einen nachteiligen Crossover erkennt.
  • Stopps werden für lange Körbe auf close - TrailingStopPips und für kurze Körbe auf close + TrailingStopPips verschoben und bewegen sich nie weiter als der aktuelle Stopp.
  • Wenn der Preis einen Level-Stop erreicht (basierend auf dem Hoch/Tief der Kerze), schließt die Strategie das verbleibende Volumen dieses Levels mit einer Marktorder.
  • Wenn der variable Gewinn des Korbs (berechnet aus den Instrumenten PriceStep und StepPrice) MoneyTakeProfit erreicht, werden alle Positionen geschlossen und ausstehende Aufträge storniert.
  • Sobald der Korb flach ist, werden alle ausstehenden Stop-Orders automatisch storniert. Wenn TradeAgainAfterProfit den Wert false hat, bleibt die Strategie inaktiv, bis sie zurückgesetzt wird.

Parameter

Name Beschreibung
UseMaLogic Aktivieren oder deaktivieren Sie die Crossover-Logik des gleitenden Durchschnitts, die die Handelsrichtung festlegt.
MaSlowPeriod, MaFastPeriod Perioden der langsamen und schnellen SMAs.
TrailingStopPips Pip-Distanz, die vom schützenden Trailing-Stop verwendet wird, wenn der Trendfilter nachteilig wird.
UseRsiFilter, RsiPeriod, RsiHigh, RsiLow RSI Filterkonfiguration. Der Filter erlaubt Long-Positionen über RsiHigh und Shorts unter RsiLow.
ManualOpenBuy, ManualOpenSell Manuelles Umschalten wird verwendet, wenn die MA-Logik deaktiviert ist.
TradeAgainAfterProfit Nehmen Sie den Handel wieder auf, nachdem Sie den Cash-Take-Profit erreicht haben.
LevelDistancePips Abstand in Pips zwischen aufeinanderfolgenden ausstehenden Aufträgen.
StopLossPips Anfänglicher Stopp-Offset für jedes Level.
MoneyTakeProfit Cash-Gewinnziel, bewertet anhand der offenen Gewinn- und Verlustrechnung des Korbs.
Level1VolumeLevel14Volume Lautstärke jedes Fibonacci Levels. Auf Null setzen, um eine Ebene zu deaktivieren.
CandleType Zeitrahmen/Datentyp, der für Indikatoren verwendet wird.

Hinweise zur Implementierung

  • Pip-Abstände werden aus Punkten im MetaTrader-Stil umgerechnet, indem das Instrument PriceStep mit zehn multipliziert wird, wenn das Wertpapier 3 oder 5 Dezimalstellen hat. Dies spiegelt die ursprüngliche MyPoint-Anpassung für 5-stellige FX-Kurse wider.
  • Jede Ebene wird unabhängig verfolgt. Die Strategie speichert den Einstiegspreis, das verbleibende Volumen und das Stop-Level, sodass Teilfüllungen und einzelne Stop-Outs auf die gleiche Weise wie der MQL-Experte gehandhabt werden.
  • Der variable Gewinn wird aus PriceStep und StepPrice berechnet. Stellen Sie sicher, dass diese Instrumenteigenschaften konfiguriert sind, andernfalls wird die Geldmitnahme nicht korrekt ausgelöst.
  • StartProtection() wird einmal während des Startvorgangs aufgerufen, um die integrierten Sicherheitsprüfungen der Strategiebasisklasse StockSharp zu aktivieren.
  • Wenn kein offenes Volume mehr vorhanden ist, wird CancelAllPendingOrders() automatisch aufgerufen und repliziert die wiederholten subCloseAllPending()-Aufrufe aus dem ursprünglichen Skript.

Anwendungstipps

  • Überprüfen Sie die Brokereinstellungen für PriceStep, StepPrice, VolumeStep und die Mindestlosgröße, um sicherzustellen, dass Volumen von Fibonacci in gültige Aufträge umgewandelt werden.
  • Die Strategie basiert auf Kerzendaten; Stellen Sie sicher, dass der ausgewählte Zeitrahmen mit dem beabsichtigten Diagrammzeitraum MetaTrader übereinstimmt.
  • Erwägen Sie, die Strategie zunächst auf Demo-Feeds anzuwenden: Mittelungssysteme können bei ungünstigen Trends ein hohes Risiko eingehen.
  • Deaktivieren Sie UseMaLogic, um die in den ursprünglichen EA-Eingaben verwendete manuelle Tendenz zu reproduzieren, oder lassen Sie es für die automatische Trenderkennung aktiviert.
using System;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Elite eFibo Trader: MA crossover with RSI filter and grid averaging.
/// Adds to winning positions on pullbacks using Fibonacci-style scaling.
/// </summary>
public class EliteEfiboTraderStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastLength;
	private readonly StrategyParam<int> _slowLength;
	private readonly StrategyParam<int> _rsiLength;
	private readonly StrategyParam<int> _atrLength;

	private decimal _prevFast;
	private decimal _prevSlow;
	private decimal _entryPrice;
	private int _addCount;

	public EliteEfiboTraderStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(8).TimeFrame())
			.SetDisplay("Candle Type", "Timeframe.", "General");

		_fastLength = Param(nameof(FastLength), 10)
			.SetDisplay("Fast MA", "Fast SMA period.", "Indicators");

		_slowLength = Param(nameof(SlowLength), 30)
			.SetDisplay("Slow MA", "Slow SMA period.", "Indicators");

		_rsiLength = Param(nameof(RsiLength), 14)
			.SetDisplay("RSI Length", "RSI filter period.", "Indicators");

		_atrLength = Param(nameof(AtrLength), 14)
			.SetDisplay("ATR Length", "ATR period.", "Indicators");
	}

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

	public int FastLength
	{
		get => _fastLength.Value;
		set => _fastLength.Value = value;
	}

	public int SlowLength
	{
		get => _slowLength.Value;
		set => _slowLength.Value = value;
	}

	public int RsiLength
	{
		get => _rsiLength.Value;
		set => _rsiLength.Value = value;
	}

	public int AtrLength
	{
		get => _atrLength.Value;
		set => _atrLength.Value = value;
	}

	/// <inheritdoc />
	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();

		_prevFast = 0;
		_prevSlow = 0;
		_entryPrice = 0;
		_addCount = 0;
	}

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

		_prevFast = 0;
		_prevSlow = 0;
		_entryPrice = 0;
		_addCount = 0;

		var fast = new SimpleMovingAverage { Length = FastLength };
		var slow = new SimpleMovingAverage { Length = SlowLength };
		var rsi = new RelativeStrengthIndex { Length = RsiLength };
		var atr = new AverageTrueRange { Length = AtrLength };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(fast, slow, rsi, atr, ProcessCandle)
			.Start();

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

	private void ProcessCandle(ICandleMessage candle, decimal fastVal, decimal slowVal, decimal rsiVal, decimal atrVal)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (_prevFast == 0 || _prevSlow == 0 || atrVal <= 0)
		{
			_prevFast = fastVal;
			_prevSlow = slowVal;
			return;
		}

		var close = candle.ClosePrice;

		// Position management
		if (Position > 0)
		{
			// Take profit or stop
			if (close >= _entryPrice + atrVal * 3m)
			{
				SellMarket();
				_entryPrice = 0;
				_addCount = 0;
			}
			else if (close <= _entryPrice - atrVal * 2m)
			{
				SellMarket();
				_entryPrice = 0;
				_addCount = 0;
			}
			else if (_addCount < 2 && close <= _entryPrice - atrVal * 0.8m && rsiVal < 40)
			{
				// Fibonacci add: buy more on pullback
				_entryPrice = (_entryPrice + close) / 2m;
				_addCount++;
				BuyMarket();
			}
		}
		else if (Position < 0)
		{
			if (close <= _entryPrice - atrVal * 3m)
			{
				BuyMarket();
				_entryPrice = 0;
				_addCount = 0;
			}
			else if (close >= _entryPrice + atrVal * 2m)
			{
				BuyMarket();
				_entryPrice = 0;
				_addCount = 0;
			}
			else if (_addCount < 2 && close >= _entryPrice + atrVal * 0.8m && rsiVal > 60)
			{
				_entryPrice = (_entryPrice + close) / 2m;
				_addCount++;
				SellMarket();
			}
		}

		// Entry: MA crossover with RSI confirmation
		if (Position == 0)
		{
			if (_prevFast <= _prevSlow && fastVal > slowVal && rsiVal > 50)
			{
				_entryPrice = close;
				_addCount = 0;
				BuyMarket();
			}
			else if (_prevFast >= _prevSlow && fastVal < slowVal && rsiVal < 50)
			{
				_entryPrice = close;
				_addCount = 0;
				SellMarket();
			}
		}

		_prevFast = fastVal;
		_prevSlow = slowVal;
	}
}