Die Plan-X-Breakout-Strategie repliziert den MetaTrader-Expertenberater „Plan Es konzentriert sich auf die Londoner Vormittagssitzung und wartet vor dem Einstieg darauf, dass der Preis von einer Referenzkerze abweicht. Es kann jeweils nur eine Nettoposition offen sein, und das Risiko wird durch Pip-basierte Stopps kontrolliert, die hinter dem Trade zurückbleiben, wenn er sich zu seinen Gunsten entwickelt.
Handelslogik
Sitzungsanker
Die Strategie berücksichtigt 15-Minuten-Kerzen.
Zur konfigurierten Startzeit der Sitzung (Standard 11:00) wird das Schließen dieser Kerze aufgezeichnet. Dieser Schlusskurs dient als Ankerpreis für den Rest der Sitzung.
Der Handel wird erst in Betracht gezogen, nachdem mindestens eine weitere Kerze geschlossen wurde und vor der Sitzungsendestunde (Standard 15:00 Uhr).
Eintrittsbedingungen
Long: Wenn die zuletzt abgeschlossene Kerze mehr als LongTargetPips (Standard 25 Pips) über dem Ankerschluss schließt und keine Position offen ist.
Short: Wenn die zuletzt abgeschlossene Kerze mehr als ShortTargetPips (Standard 20 Pips) unter dem Ankerschluss schließt und keine Position offen ist.
Alle Vergleiche werden in Pip-Einheiten durchgeführt, die von der Tick-Größe des Instruments abgeleitet werden.
Positionsmanagement
Ein fester anfänglicher Stop-Loss in Höhe von InitialStopPips (Standard 25 Pips) wird relativ zum Einstiegspreis festgelegt.
Der Stop wird in einen Trailing Stop umgewandelt, sobald der Trade mindestens TrailTriggerPips (Standard 10 Pips) gewinnt.
Jedes Mal, wenn der Preis um weitere TrailTriggerPips steigt, wird der Stop um TrailStepPips (Standard 5 Pips) weiter in die profitable Richtung verschoben.
Wenn der Preis den Stop erreicht, wird die Position zum Marktwert geschlossen.
Volumen
Bestellungen verwenden den Parameter TradeVolume (Standard 0,1 Lots). Passen Sie es an die Größe des Sicherheitsvertrags an.
Parameter
Name
Beschreibung
Standard
TradeVolume
Marktauftragsvolumen, das für Ein- und Ausstiege verwendet wird.
0,1
LongTargetPips
Für lange Einstiege ist eine Ausbruchsdistanz über dem Anker erforderlich.
25
ShortTargetPips
Für kurze Einstiege ist eine Ausbruchsdistanz unterhalb des Ankers erforderlich.
20
InitialStopPips
Abstand vom Einstiegspreis bis zum schützenden Stop-Loss.
25
TrailTriggerPips
Gewinn in Pips, der benötigt wird, bevor der Trailing Stop aktiviert wird oder vorrückt.
10
TrailStepPips
Pip-Inkrement, das bei jeder Bewegung auf den Trailing Stop angewendet wird.
5
SessionStartHour
Dezimale Stunde, die angibt, wann die Ankerkerze beginnt (z. B. 11.0, 11.5).
11.0
SessionEndHour
Dezimale Stunde, nach der keine neuen Einträge mehr vorgenommen werden. Muss später als SessionStartHour sein.
15.0
CandleType
Für Auswertungen verwendete Kerzenserien. Standardmäßig sind 15-Minuten-Kerzen eingestellt.
15 Minuten
Notizen
Die Pip-Größe passt sich automatisch an, basierend auf dem PriceStep des Instruments und der Dezimalgenauigkeit (3 oder 5 Dezimalstellen erhalten einen 10-fachen Multiplikator).
Die Strategie geht von einem kontinuierlichen Intraday-Markt aus; Bei Instrumenten mit täglichen Lücken kommt es an jedem Handelstag zu einem Re-Anker-Verhalten.
Da StockSharp-Strategien Nettopositionen verwenden, geht die Konvertierung jeweils nur von einer offenen Richtung aus. Dies spiegelt das Standardverhalten des ursprünglichen Experten wider, wenn keine Absicherung aktiv ist.
Dateien
CS/PlanXBreakoutStrategy.cs – C#-Implementierung der Plan X-Breakout-Logik für StockSharp.
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>
/// Plan X Breakout strategy using highest high / lowest low channel breakout.
/// Buy when price breaks above the highest high of the lookback period.
/// Sell when price breaks below the lowest low of the lookback period.
/// </summary>
public class PlanXBreakoutStrategy : Strategy
{
private readonly StrategyParam<int> _lookback;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevHigh;
private decimal _prevLow;
private bool _hasPrev;
public int Lookback { get => _lookback.Value; set => _lookback.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public PlanXBreakoutStrategy()
{
_lookback = Param(nameof(Lookback), 20)
.SetDisplay("Lookback", "Channel lookback period", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
/// <inheritdoc />
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevHigh = 0m;
_prevLow = 0m;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var highestHigh = new Highest { Length = Lookback };
var lowestLow = new Lowest { Length = Lookback };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(highestHigh, lowestLow, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal highest, decimal lowest)
{
if (candle.State != CandleStates.Finished)
return;
if (!_hasPrev)
{
_prevHigh = highest;
_prevLow = lowest;
_hasPrev = true;
return;
}
// Breakout above previous highest high
if (Position <= 0 && candle.ClosePrice > _prevHigh)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
// Breakout below previous lowest low
else if (Position >= 0 && candle.ClosePrice < _prevLow)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevHigh = highest;
_prevLow = lowest;
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan, Math
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import Highest, Lowest
from StockSharp.Algo.Strategies import Strategy
class plan_x_breakout_strategy(Strategy):
"""Plan X Breakout strategy using highest high / lowest low channel breakout.
Buy when price breaks above the highest high of the lookback period.
Sell when price breaks below the lowest low of the lookback period."""
def __init__(self):
super(plan_x_breakout_strategy, self).__init__()
self._lookback = self.Param("Lookback", 20) \
.SetDisplay("Lookback", "Channel lookback period", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._prev_high = 0.0
self._prev_low = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def Lookback(self):
return self._lookback.Value
def OnReseted(self):
super(plan_x_breakout_strategy, self).OnReseted()
self._prev_high = 0.0
self._prev_low = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(plan_x_breakout_strategy, self).OnStarted2(time)
self._has_prev = False
highest = Highest()
highest.Length = self.Lookback
lowest = Lowest()
lowest.Length = self.Lookback
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(highest, lowest, self._process_candle).Start()
def _process_candle(self, candle, highest, lowest):
if candle.State != CandleStates.Finished:
return
high_val = float(highest)
low_val = float(lowest)
close = float(candle.ClosePrice)
if not self._has_prev:
self._prev_high = high_val
self._prev_low = low_val
self._has_prev = True
return
# Breakout above previous highest high
if self.Position <= 0 and close > self._prev_high:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
# Breakout below previous lowest low
elif self.Position >= 0 and close < self._prev_low:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
self._prev_high = high_val
self._prev_low = low_val
def CreateClone(self):
return plan_x_breakout_strategy()