Die E-Friday Session-Strategie repliziert den klassischen MetaTrader-Expertenberater, der nur freitags handelt. Es beobachtet die vorherige Tageskerze und eröffnet zu einer konfigurierten Stunde zu Beginn der Freitagssitzung eine Position. Die Richtung ist konträr: Wenn der Vortag unter seinem Eröffnungskurs (bärische Kerze) schloss, kauft die Strategie; Wenn der Vortag über seinem Eröffnungskurs schloss (bullische Kerze), wird die Strategie verkauft. Positionen werden untertägig verwaltet und können automatisch nach einer konfigurierbaren Stunde oder durch Schutzstopps geschlossen werden.
Handelsregeln
Sammeln Sie tägliche Kerzen (Standard: 1 Tag), um die Eröffnungs- und Schlusskurse des Vortages zu erhalten.
Überwachen Sie freitags die Intraday-Kerzen (Standard: 1 Minute), um die konfigurierte Eintrittsstunde zu erkennen.
Bei der ersten Kerze der Eintrittsstunde:
Gehen Sie long, wenn der Vortag bärisch war.
Gehen Sie short, wenn der Vortag bullisch war.
Überspringen Sie den Handel, wenn der Vortag ein Doji war (eröffnet gleich geschlossen).
Optional können Sie die Position automatisch schließen, sobald die konfigurierte Ausstiegsstunde erreicht ist.
Verwalten Sie Exits mithilfe von Stop-Loss, Take-Profit und optionaler Trailing-Stop-Logik, die den ursprünglichen Expert Advisor nachahmt, einschließlich der Gewinnaktivierung und der Trailing-Step-Schwellenwerte.
Implementierungshinweise
Verwendet StockSharp Kerzenabonnements auf hoher Ebene sowohl für den täglichen Kontext als auch für das Intraday-Timing.
Konvertiert punktbasierte Risikokontrollen aus der MQL-Version mithilfe der Preisstufe des Wertpapiers in absolute Preisversätze.
Behält Trailing-Stops im Code bei, aktualisiert sie bei jeder abgeschlossenen Kerze und schließt die Position, wenn Preisextreme durchbrochen werden.
Stellt nur einen Handel pro Freitag sicher, indem der tägliche Status verfolgt wird.
Unterstützt sowohl Long- als auch Short-Einträge unter Berücksichtigung des ursprünglichen Magic-Number-Gatings durch den Handel mit einem einzelnen Symbol pro Strategieinstanz.
Parameter
Name
Beschreibung
Standard
Volume
Handelsgröße in Losen/Kontrakten.
0.1
StopLossPoints
Stop-Loss-Distanz in Preisschritten (0 deaktiviert).
75
TakeProfitPoints
Take-Profit-Distanz in Preisschritten (0 deaktiviert).
0
HourOpen
Stunde des Tages (0-23), um die Position zu eröffnen.
7
UseClosePositions
Aktivieren Sie das automatische Schließen nach der Ausgangsstunde.
true
HourClose
Stunde des Tages (0-23), um die Position zu schließen, falls aktiviert.
19
UseTrailing
Aktivieren Sie Trailing-Stop-Anpassungen.
true
ProfitTrailing
Der Gewinn muss die Trailing-Distanz überschreiten, bevor das Trailing aktiviert wird.
true
TrailingStopPoints
Trailing-Stop-Distanz in Preisschritten.
60
TrailingStepPoints
Vor dem Festziehen des Trailing Stop sind zusätzliche Punkte erforderlich.
5
IntradayCandleType
Kerzentyp für Intraday-Timing (Standard-1-Minuten-Kerzen).
TimeSpan.FromMinutes(1)
DailyCandleType
Kerzentyp für die tägliche Stimmungserkennung (Standard-1-Tages-Kerzen).
TimeSpan.FromDays(1)
Nutzungstipps
Richten Sie die Handelssitzung des Instruments so aus, dass die Einstiegsstunde am Freitag mit der gewünschten Marktöffnung übereinstimmt.
Wenn Sie Stop-Loss- und Trailing-Werte konfigurieren, drücken Sie diese in denselben „Punkten“ aus, die von der Preisstufe des Symbols verwendet werden, um das Verhalten von MetaTrader zu reproduzieren.
Die Strategie ist auf einen einzelnen Trade pro Freitag ausgelegt. Um mit mehreren Symbolen zu handeln, führen Sie für jedes Symbol separate Strategieinstanzen aus.
Unterschiede zum Original EA
Verwendet Kerzenschlussdaten für die Entscheidungsfindung, während die ursprünglich abgefragten Preise pro Tick verwendet werden.
Schutzausstiege werden über Marktaufträge ausgeführt, wenn Kerzen anzeigen, dass Stop- oder Zielniveaus innerhalb des Intervalls berührt wurden.
Strategieparameter werden über das StrategyParam-System von StockSharp bereitgestellt und unterstützen die Optimierung und UI-Bindung.
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// E-Friday Session strategy - candle body direction with EMA filter.
/// Buys when previous candle was bearish and current closes above EMA (reversal).
/// Sells when previous candle was bullish and current closes below EMA (reversal).
/// </summary>
public class EFridaySessionStrategy : Strategy
{
private readonly StrategyParam<int> _emaPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevOpen;
private decimal _prevClose;
private bool _hasPrev;
public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public EFridaySessionStrategy()
{
_emaPeriod = Param(nameof(EmaPeriod), 20)
.SetDisplay("EMA Period", "EMA trend filter", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
protected override void OnReseted() { base.OnReseted(); _prevOpen = 0m; _prevClose = 0m; _hasPrev = false; }
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var ema = new ExponentialMovingAverage { Length = EmaPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(ema, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal ema)
{
if (candle.State != CandleStates.Finished)
return;
var close = candle.ClosePrice;
if (!_hasPrev)
{
_prevOpen = candle.OpenPrice;
_prevClose = close;
_hasPrev = true;
return;
}
var prevBearish = _prevClose < _prevOpen;
var prevBullish = _prevClose > _prevOpen;
// Previous bearish + close above EMA = buy reversal
if (prevBearish && close > ema && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
// Previous bullish + close below EMA = sell reversal
else if (prevBullish && close < ema && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevOpen = candle.OpenPrice;
_prevClose = close;
}
}
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 e_friday_session_strategy(Strategy):
def __init__(self):
super(e_friday_session_strategy, self).__init__()
self._ema_period = self.Param("EmaPeriod", 20).SetDisplay("EMA Period", "EMA trend filter", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))).SetDisplay("Candle Type", "Candle timeframe", "General")
self._prev_open = 0.0
self._prev_close = 0.0
self._has_prev = False
@property
def ema_period(self): return self._ema_period.Value
@property
def candle_type(self): return self._candle_type.Value
def OnReseted(self):
super(e_friday_session_strategy, self).OnReseted()
self._prev_open = 0.0; self._prev_close = 0.0; self._has_prev = False
def OnStarted2(self, time):
super(e_friday_session_strategy, self).OnStarted2(time)
self._has_prev = False
ema = ExponentialMovingAverage()
ema.Length = self.ema_period
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(ema, self.process_candle).Start()
def process_candle(self, candle, ema):
if candle.State != CandleStates.Finished: return
close = float(candle.ClosePrice)
ema_val = float(ema)
if not self._has_prev:
self._prev_open = float(candle.OpenPrice); self._prev_close = close; self._has_prev = True; return
prev_bearish = self._prev_close < self._prev_open
prev_bullish = self._prev_close > self._prev_open
if prev_bearish and close > ema_val and self.Position <= 0:
if self.Position < 0: self.BuyMarket()
self.BuyMarket()
elif prev_bullish and close < ema_val and self.Position >= 0:
if self.Position > 0: self.SellMarket()
self.SellMarket()
self._prev_open = float(candle.OpenPrice); self._prev_close = close
def CreateClone(self): return e_friday_session_strategy()