Tägliches Ausbruchssystem für GBPUSD, das einen auf Hochs berechneten EMA, RSI-Filter, MACD-Momentum-Bestätigung und ATR-basiertes Risikomanagement kombiniert. Das Skript reproduziert das Verhalten der vierstufigen Gewinnmitnahme und Gewinnsicherung der ursprünglichen MetaTrader-Version.
Wichtige Fakten
Markt: GBP/USD Spot oder CFD
Zeitrahmen: Tageskerzen (konfigurierbar)
Richtung: Long und Short
Positionsstil: Multi-Ziel-Skalierung mit gemeinsamem Stop-Loss
Verwendete Instrumente: EMA (High), RSI, MACD-Hauptlinie, ATR
Indikatoreinrichtung
EMA auf Hochpreisen – Standardlänge 6, approximiert das dynamische Ausbruchsniveau.
RSI – Standardlänge 10, definiert Überkauft/Überverkauft-Korridore als Momentum-Filter.
MACD-Hauptlinie – schnell 5, langsam 21, Signal 14. Nur die Hauptlinie wird zur Messung der Momentum-Steigung verwendet.
ATR – Länge 28, liefert volatilitätsabhängige Stops und Ziele.
Einstiegslogik
Long-Einstiege
Der vorherige Tagesbalken öffnet unter dem EMA (High) und schließt darüber (Kreuzungsbestätigung aufwärts).
RSI bleibt zwischen 60 und 80 – verhindert Trades bei schwachem Momentum und vermeidet überdehnte Rallys.
Die MACD-Hauptlinie erfüllt eine von zwei Momentum-Prüfungen:
Der Wert vor zwei Balken ist negativ (was darauf hinweist, dass der Trend kürzlich positiv wurde), oder
Die relative Reduktion im absoluten MACD zwischen den letzten zwei Balken überschreitet den konfigurierbaren MacdDiffBuy-Schwellenwert (Standard 0.5).
Wenn alle Bedingungen zutreffen, werden vier gleiche Markt-Kaufaufträge platziert (Standard je 0.1 Lots). Jedes vorhandene Short-Engagement wird vor dem Senden des neuen Batches geflacht.
Short-Einstiege
Der Balken öffnet über dem EMA (High) und schließt darunter.
RSI liegt zwischen 25 und 39 – spiegelt die Long-seitigen Schwellenwerte wider.
MACD vor zwei Balken ist positiv oder die relative Änderung im absoluten MACD zwischen den letzten zwei Balken liegt über MacdDiffSell (Standard 0.15).
Bei Bestätigung flacht die Strategie vorhandene Longs ab und sendet dann vier gleiche Marktverkäufe.
Gewinnziele: Vier inkrementelle ATR-basierte Niveaus pro Richtung: 1.0, 1.5, 2.0 und 2.5 ATR-Vielfache skaliert durch den TakeProfitMultiplier-Parameter (Standard 1). Jedes Niveau schließt ein Viertel der ursprünglichen Position über einen Marktauftrag, wenn der Preis das Niveau durchbricht.
Gewinnsicherungsverhalten: Nach jedem Teilausstieg wird der Schutzstopp für die verbleibende Position auf den letzten Zielpreis verschoben. Dies imitiert den ursprünglichen EA, der Stop-Losses auf den ausgeführten Take-Profit-Preis modifiziert, wann immer ein TP-Deal auftritt.
Stopp-Behandlung: Wenn der Preis das Schutzniveau intrabar berührt (unter Verwendung von Kerzen-Hoch/Tief), wird die verbleibende Position sofort zum Marktpreis geschlossen.
Risikokontroll-Hinweise
Die Strategie pyramidiert nicht über den Vier-Einstiegs-Batch hinaus. Ein neues Signal wird ignoriert, während Engagement in der gleichen Richtung verbleibt.
ATR muss positiv sein; Signale werden übersprungen, wenn der Volatilitätsindikator noch nicht gebildet wurde.
Parameteränderungen zur Laufzeit betreffen nur zukünftige Aufträge; das Volumen pro Auftrag wird beim Einstieg für korrektes Skalieren bei Ausstiegen erfasst.
Parameter
Name
Beschreibung
Standard
OrderVolume
Volumen pro individuellem Marktauftrag im Batch
0.1
EmaPeriod
EMA-Länge angewendet auf Kerzen-Hochs
6
RsiPeriod
RSI-Durchschnittsperiode
10
AtrPeriod
ATR-Durchschnittsperiode
28
StopLossMultiplier
ATR-Vielfaches für den Schutzstopp
1.6
TakeProfitMultiplier
Basis-ATR-Vielfaches für Gewinnziele
1.0
MacdFastPeriod
MACD-Schnell-EMA-Länge
5
MacdSlowPeriod
MACD-Langsam-EMA-Länge
21
MacdSignalPeriod
MACD-Signal-EMA-Länge
14
MacdDiffBuyThreshold
Minimale MACD-Steigungsverbesserung für Long-Trades
0.5
MacdDiffSellThreshold
Minimale MACD-Steigungsverbesserung für Short-Trades
0.15
RsiUpperLimit
Maximaler RSI vor einem Long-Einstieg
80
RsiUpperLevel
Minimaler RSI für einen Long-Einstieg
60
RsiLowerLevel
Maximaler RSI für einen Short-Einstieg
39
RsiLowerLimit
Minimaler RSI vor Shorts
25
CandleType
Zeitrahmen für das Kerzenabonnement
1 Day
Einsatztipps
RSI- und MACD-Schwellenwerte gemeinsam optimieren; das Lockern von RSI-Korridoren ohne Anpassung der MACD-Beschleunigungsfilter kann zu Fehlsignalen führen.
Da Teilausstiege auf Kerzenextremen basieren, sind genaue Daten für Hoch/Tief-Werte für realistische Backtests wichtig.
Immer mit ausreichend Kapital arbeiten, um vier gleichzeitige Aufträge pro Signal zu verwalten.
using System;
using System.Collections.Generic;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Alexav D1 Profit GBPUSD strategy (simplified). Uses EMA crossover with RSI
/// filter for breakout entries with ATR-based stop/take management.
/// </summary>
public class AlexavD1ProfitGbpUsdStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _emaFastLength;
private readonly StrategyParam<int> _emaSlowLength;
private readonly StrategyParam<int> _rsiLength;
private readonly StrategyParam<decimal> _rsiUpperLevel;
private readonly StrategyParam<decimal> _rsiLowerLevel;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int EmaFastLength
{
get => _emaFastLength.Value;
set => _emaFastLength.Value = value;
}
public int EmaSlowLength
{
get => _emaSlowLength.Value;
set => _emaSlowLength.Value = value;
}
public int RsiLength
{
get => _rsiLength.Value;
set => _rsiLength.Value = value;
}
public decimal RsiUpperLevel
{
get => _rsiUpperLevel.Value;
set => _rsiUpperLevel.Value = value;
}
public decimal RsiLowerLevel
{
get => _rsiLowerLevel.Value;
set => _rsiLowerLevel.Value = value;
}
public AlexavD1ProfitGbpUsdStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candles", "General");
_emaFastLength = Param(nameof(EmaFastLength), 6)
.SetGreaterThanZero()
.SetDisplay("EMA Fast", "Fast EMA period", "Indicators");
_emaSlowLength = Param(nameof(EmaSlowLength), 21)
.SetGreaterThanZero()
.SetDisplay("EMA Slow", "Slow EMA period", "Indicators");
_rsiLength = Param(nameof(RsiLength), 10)
.SetGreaterThanZero()
.SetDisplay("RSI Length", "RSI period", "Indicators");
_rsiUpperLevel = Param(nameof(RsiUpperLevel), 65m)
.SetDisplay("RSI Upper", "Max RSI for buy", "Filters");
_rsiLowerLevel = Param(nameof(RsiLowerLevel), 35m)
.SetDisplay("RSI Lower", "Min RSI for sell", "Filters");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var emaFast = new ExponentialMovingAverage { Length = EmaFastLength };
var emaSlow = new ExponentialMovingAverage { Length = EmaSlowLength };
decimal prevFast = 0, prevSlow = 0;
var hasPrev = false;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(emaFast, emaSlow, (ICandleMessage candle, decimal fastVal, decimal slowVal) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!hasPrev)
{
prevFast = fastVal;
prevSlow = slowVal;
hasPrev = true;
return;
}
if (!IsFormedAndOnlineAndAllowTrading())
{
prevFast = fastVal;
prevSlow = slowVal;
return;
}
var close = candle.ClosePrice;
// EMA fast crosses above slow - buy signal
var bullishCross = prevFast <= prevSlow && fastVal > slowVal;
// EMA fast crosses below slow - sell signal
var bearishCross = prevFast >= prevSlow && fastVal < slowVal;
if (bullishCross && Position <= 0)
BuyMarket();
else if (bearishCross && Position >= 0)
SellMarket();
prevFast = fastVal;
prevSlow = slowVal;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, emaFast);
DrawIndicator(area, emaSlow);
DrawOwnTrades(area);
}
}
}
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 alexav_d1_profit_gbp_usd_strategy(Strategy):
def __init__(self):
super(alexav_d1_profit_gbp_usd_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candles", "General")
self._ema_fast_length = self.Param("EmaFastLength", 6) \
.SetDisplay("EMA Fast", "Fast EMA period", "Indicators")
self._ema_slow_length = self.Param("EmaSlowLength", 21) \
.SetDisplay("EMA Slow", "Slow EMA period", "Indicators")
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@property
def EmaFastLength(self):
return self._ema_fast_length.Value
@property
def EmaSlowLength(self):
return self._ema_slow_length.Value
def OnReseted(self):
super(alexav_d1_profit_gbp_usd_strategy, self).OnReseted()
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(alexav_d1_profit_gbp_usd_strategy, self).OnStarted2(time)
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
ema_fast = ExponentialMovingAverage()
ema_fast.Length = self.EmaFastLength
ema_slow = ExponentialMovingAverage()
ema_slow.Length = self.EmaSlowLength
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(ema_fast, ema_slow, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, ema_fast)
self.DrawIndicator(area, ema_slow)
self.DrawOwnTrades(area)
def _on_process(self, candle, fast_value, slow_value):
if candle.State != CandleStates.Finished:
return
fv = float(fast_value)
sv = float(slow_value)
if not self._has_prev:
self._prev_fast = fv
self._prev_slow = sv
self._has_prev = True
return
if self._prev_fast <= self._prev_slow and fv > sv and self.Position <= 0:
self.BuyMarket()
elif self._prev_fast >= self._prev_slow and fv < sv and self.Position >= 0:
self.SellMarket()
self._prev_fast = fv
self._prev_slow = sv
def CreateClone(self):
return alexav_d1_profit_gbp_usd_strategy()