Die Fibonacci Retracement-Strategie für potenzielle Entries bildet den MetaTrader-Experten EA_PUB_FibonacciPotentialEntries nach. Der Algorithmus wartet auf Live-Kurse der Stufe 1 und platziert dann zwei ausstehende Aufträge um die manuell eingegebenen Fibonacci-Retracement-Niveaus. Wenn das gemeinsame Gewinnziel erreicht ist, skaliert die Strategie jede Position um 50 % und verschiebt den Schutzstopp auf die Gewinnschwelle für die verbleibende Menge.
Mapping of the original logic
Einstiegsaufträge – Zwei Limitaufträge werden ausgegeben, sobald sowohl der beste Geld- als auch der beste Briefkurs verfügbar sind:
Erste Bestellung: platziert beim 50 %-Retracement (P50Level). Der Stop-Loss ist drei Spreads unterhalb (Bull-Modus) bzw. oberhalb (Bear-Modus) der 61 %-Marke verankert.
Zweite Ordnung: platziert beim 61 %-Retracement (P61Level), wobei der Stop-Loss drei Spreads vom Mittelpunkt zwischen den 61 %- und 100 %-Niveaus entfernt definiert ist.
Richtungsbias – Die ursprüngliche Eingabe bType wird zum Parameter MarketBias (Bull für Kauflimits, Bear für Verkaufslimits).
Risikoverteilung – Der erste Trade riskiert immer 0.7% des Portfolio-Eigenkapitals. Der zweite Handel verbraucht den verbleibenden Teil von RiskPercent (max(RiskPercent - 0.7, 0)), wobei die von EA verwendete Aufteilung beibehalten wird.
Volumenberechnung – Das Risiko wird über Portfolio.CurrentValue (mit Rückgriffen auf CurrentBalance und BeginValue) zusammen mit der Preisstufe, den Stufenkosten und dem Multiplikator des Instruments in die Positionsgröße übersetzt.
Teilweise Gewinnmitnahme – Wenn der Preis TargetLevel überschreitet, sendet jeder ausgeführte Trade eine Marktorder, um die Hälfte seines offenen Volumens zu schließen. Anschließend wird die Stop-Order auf den aufgezeichneten Einstiegspreis verschoben, der mit der OrderClose + OrderModify-Sequenz von EA übereinstimmt.
Parameter
Name
Beschreibung
P50Level
Price assigned to the 50% Fibonacci retracement.
P61Level
Preis, der dem 61,8 % Fibonacci-Retracement zugeordnet ist.
P100Level
Dem 100 % Fibonacci-Retracement zugeordneter Preis (wird für den Midpoint-Stopp verwendet).
TargetLevel
Shared profit target for both trades.
RiskPercent
Gesamtrisikobudget in Prozent des Eigenkapitals (muss ≥ 0,7 sein).
MarketBias
Wählt eine lange (Bull) oder kurze (Bear) Kampagne.
Ausführungsdetails
Abonnieren Sie Kurse der Stufe 1 über SubscribeLevel1() und warten Sie auf positive Geld-/Briefwerte.
Compute spread, stop levels and position sizes. Bestellungen werden einmal pro Lauf übermittelt und danach nicht automatisch neu erstellt (gleiches Verhalten wie beim MQL-Experten).
Bei Ausführungen zeichnet die Strategie den durchschnittlichen Einstiegspreis auf, platziert die entsprechende Stop-Order und verfolgt das offene Volumen pro Abschnitt.
Wenn der Markt über TargetLevel hinausgeht, sendet die Strategie eine Teil-Close-Market-Order pro Abschnitt und verschiebt anschließend den Stop auf die Gewinnschwelle für die verbleibende Menge.
Stop-Orders werden storniert, wenn kein Volumen mehr vorhanden ist oder die Strategie stoppt.
Hinweise und Einschränkungen
Der Stop-Loss wird immer dann neu generiert, wenn sich die Positionsgröße ändert. Wenn der Broker Stop-Orders ablehnt, überprüfen Sie die Connector-Berechtigungen und passen Sie die börsenspezifischen Einstellungen entsprechend an.
Der Take-Profit wird nicht als ausstehende Order registriert. Stattdessen spiegelt der Algorithmus den EA wider, indem er das Preisniveau überwacht und Exits in Echtzeit verwaltet.
Da Bestellungen nur einmal erstellt werden, starten Sie die Strategie neu, um ausstehende Orders zu aktualisieren, nachdem sich Parameter geändert haben (identisch mit dem MetaTrader-Workflow).
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Fibonacci Retracement Entries strategy: EMA trend with Fibonacci retracement levels.
/// Buys on retracement to 61.8% in uptrend, sells on retracement to 38.2% in downtrend.
/// </summary>
public class FibonacciPotentialEntriesRetracementStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _emaPeriod;
private readonly StrategyParam<int> _lookback;
private readonly StrategyParam<int> _signalCooldownCandles;
private decimal _high;
private decimal _low;
private int _barCount;
private int _candlesSinceTrade;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
public int Lookback { get => _lookback.Value; set => _lookback.Value = value; }
public int SignalCooldownCandles { get => _signalCooldownCandles.Value; set => _signalCooldownCandles.Value = value; }
public FibonacciPotentialEntriesRetracementStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_emaPeriod = Param(nameof(EmaPeriod), 50)
.SetGreaterThanZero()
.SetDisplay("EMA Period", "EMA period", "Indicators");
_lookback = Param(nameof(Lookback), 50)
.SetGreaterThanZero()
.SetDisplay("Lookback", "Lookback for high/low", "General");
_signalCooldownCandles = Param(nameof(SignalCooldownCandles), 6)
.SetGreaterThanZero()
.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_high = 0;
_low = decimal.MaxValue;
_barCount = 0;
_candlesSinceTrade = SignalCooldownCandles;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_high = 0;
_low = decimal.MaxValue;
_barCount = 0;
_candlesSinceTrade = SignalCooldownCandles;
var ema = new ExponentialMovingAverage { Length = EmaPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(ema, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal emaValue)
{
if (candle.State != CandleStates.Finished) return;
if (_candlesSinceTrade < SignalCooldownCandles)
_candlesSinceTrade++;
if (candle.HighPrice > _high) _high = candle.HighPrice;
if (candle.LowPrice < _low) _low = candle.LowPrice;
_barCount++;
if (_barCount < 20) return;
var range = _high - _low;
if (range <= 0) return;
var close = candle.ClosePrice;
var fib618 = _high - range * 0.618m;
var fib382 = _high - range * 0.382m;
if (close > emaValue && close <= fib618 && Position <= 0 && _candlesSinceTrade >= SignalCooldownCandles)
{
BuyMarket();
_candlesSinceTrade = 0;
}
else if (close < emaValue && close >= fib382 && Position >= 0 && _candlesSinceTrade >= SignalCooldownCandles)
{
SellMarket();
_candlesSinceTrade = 0;
}
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class fibonacci_potential_entries_retracement_strategy(Strategy):
def __init__(self):
super(fibonacci_potential_entries_retracement_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(30)))
self._ema_period = self.Param("EmaPeriod", 50)
self._lookback = self.Param("Lookback", 50)
self._signal_cooldown_candles = self.Param("SignalCooldownCandles", 6)
self._high = 0.0
self._low = float('inf')
self._bar_count = 0
self._candles_since_trade = 6
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def EmaPeriod(self):
return self._ema_period.Value
@EmaPeriod.setter
def EmaPeriod(self, value):
self._ema_period.Value = value
@property
def Lookback(self):
return self._lookback.Value
@Lookback.setter
def Lookback(self, value):
self._lookback.Value = value
@property
def SignalCooldownCandles(self):
return self._signal_cooldown_candles.Value
@SignalCooldownCandles.setter
def SignalCooldownCandles(self, value):
self._signal_cooldown_candles.Value = value
def OnReseted(self):
super(fibonacci_potential_entries_retracement_strategy, self).OnReseted()
self._high = 0.0
self._low = float('inf')
self._bar_count = 0
self._candles_since_trade = self.SignalCooldownCandles
def OnStarted2(self, time):
super(fibonacci_potential_entries_retracement_strategy, self).OnStarted2(time)
self._high = 0.0
self._low = float('inf')
self._bar_count = 0
self._candles_since_trade = self.SignalCooldownCandles
ema = ExponentialMovingAverage()
ema.Length = self.EmaPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(ema, self._process_candle).Start()
def _process_candle(self, candle, ema_value):
if candle.State != CandleStates.Finished:
return
if self._candles_since_trade < self.SignalCooldownCandles:
self._candles_since_trade += 1
high = float(candle.HighPrice)
low = float(candle.LowPrice)
close = float(candle.ClosePrice)
ema_val = float(ema_value)
if high > self._high:
self._high = high
if low < self._low:
self._low = low
self._bar_count += 1
if self._bar_count < 20:
return
range_val = self._high - self._low
if range_val <= 0:
return
fib618 = self._high - range_val * 0.618
fib382 = self._high - range_val * 0.382
if close > ema_val and close <= fib618 and self.Position <= 0 and self._candles_since_trade >= self.SignalCooldownCandles:
self.BuyMarket()
self._candles_since_trade = 0
elif close < ema_val and close >= fib382 and self.Position >= 0 and self._candles_since_trade >= self.SignalCooldownCandles:
self.SellMarket()
self._candles_since_trade = 0
def CreateClone(self):
return fibonacci_potential_entries_retracement_strategy()