Pipso ist ein Breakout-System für Nachtsitzungen, das vom MetaTrader Expert Advisor Pipso.mq4 abgeleitet wurde. Die Strategie misst die
den höchsten und niedrigsten Preis der zuvor abgeschlossenen Kerzen und reagiert, wenn der Markt aus diesem Bereich ausbricht. Jeder
Ein Ausbruch kehrt die Position um: Long-Positionen werden geschlossen und eine Short-Position wird eröffnet, wenn der Preis über die jüngsten Höchststände bricht
Short-Positionen werden abgedeckt und eine neue Long-Position wird aufgebaut, wenn der Preis die jüngsten Tiefststände durchbricht. Schutzstopps werden abgeleitet von
die Breite des Bereichs, sodass sich der Stoppabstand automatisch an die aktuelle Volatilität anpasst.
Wie es funktioniert
Abonnieren Sie den konfigurierten Zeitrahmen (standardmäßig 15 Minuten) und warten Sie, bis die Indikatoren einen vollständigen Verlauf erstellt haben.
Berechnen Sie für jede neue fertige Kerze das höchste Hoch und das niedrigste Tief der vorherigen BreakoutPeriod Kerzen. Der Strom
Kerze ist nicht Teil dieses Bereichs, genau wie im Original EA, wobei iHighest(..., shift = 1) den Arbeitsbalken überspringt.
Berechnen Sie den Stoppabstand als (high - low) * StopLossMultiplier neu und erzwingen Sie dabei den durch definierten Mindestabstand
MinStopDistance.
Pflegen Sie ein durch SessionStartHour und SessionLengthHours definiertes Handelsfenster. Wenn das Fenster am Freitag Mitternacht überschreitet
es wird um zwei Tage verlängert, sodass offene Trades das Wochenende überdauern, genau wie in MetaTrader.
Wenn das Hoch der Kerze das gespeicherte Ausbruchshoch überschreitet:
Schließen Sie alle vorhandenen Long-Positionen und eröffnen Sie, sofern der Handel zulässig ist, eine Short-Position mit der Größe OrderVolume.
Fügen Sie einen Stop-Loss über dem Einstiegspreis hinzu, indem Sie die berechnete Stop-Distanz verwenden.
Wenn das Tief der Kerze unter das gespeicherte Ausbruchstief fällt:
Schließen Sie alle vorhandenen Short-Positionen und eröffnen Sie, sofern der Handel zulässig ist, eine Long-Position mit der Größe OrderVolume.
Fügen Sie einen Stop-Loss unter dem Einstiegspreis hinzu, indem Sie die berechnete Stop-Distanz verwenden.
Bei jeder fertigen Kerze werden Schutzstopps bewertet. Wenn das Tief den langen Stopp berührt oder das Hoch den kurzen Stopp erreicht,
die Position wird sofort abgeflacht.
Handelssitzungslogik
SessionStartHour wird in Wechselstunden ausgedrückt. Die Fensterlänge wird mit SessionLengthHours eingestellt.
Wenn die Sitzung länger als 24 Stunden dauert und der aktuelle Tag Freitag ist, wird das Ende des Fensters um 48 Stunden nach vorne verschoben
dass der Handel am Montag wieder aufgenommen wird, entsprechend der Wochenendbehandlung im Code MQL4.
Außerhalb des Handelsfensters schließt die Strategie nur bestehende Positionen; Sobald sich das Fenster öffnet, sind neue Trades wieder erlaubt.
Parameter
Name
Beschreibung
Standard
CandleType
Kerzendatentyp, der für die Signalberechnung verwendet wird.
15-minütiger Zeitrahmen
OrderVolume
Feste Ordergröße für jede Marktorder.
1
SessionStartHour
Tageszeit, zu der das Breakout-Fenster beginnt.
21
SessionLengthHours
Dauer des Handelsfensters in Stunden.
9
BreakoutPeriod
Anzahl der abgeschlossenen Kerzen, die den Ausbruchsbereich definieren.
36
StopLossMultiplier
Auf die Bereichsbreite angewendeter Multiplikator, um die Stoppentfernung abzuleiten (Wert 3 entspricht dem ursprünglichen SLpp = 300).
3
MinStopDistance
Minimaler Stop-Loss-Abstand in absoluten Preiseinheiten, der die Stop-Level-Beschränkung MetaTrader nachahmt.
0
Notizen
Die Strategie verwendet nur Marktaufträge; es gibt keinen Take-Profit. Der schützende Stop-Loss ist außerdem der einzige Ausstiegsmechanismus
das entgegengesetzte Ausbruchssignal.
Beim Wechsel von Long zu Short (oder umgekehrt) sendet die Strategie eine einzelne Marktorder, die beide die vorherige schließt
Position und öffnet die neue, was das Verhalten der Quelle EA widerspiegelt, die nacheinander OrderClose und aufgerufen hat
OrderSend.
Indikatorlinien für die Ausbruchshochs und -tiefs werden zusammen mit den ausgeführten Trades automatisch im Strategiediagramm eingezeichnet.
using System;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Range breakout strategy that uses Highest/Lowest channel.
/// Enters on breakouts above/below the channel and exits on reversion.
/// </summary>
public class PipsoNightBreakoutStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _breakoutPeriod;
private decimal _entryPrice;
private decimal _prevHighest;
private decimal _prevLowest;
private bool _hasPrev;
public PipsoNightBreakoutStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Timeframe for analysis.", "General");
_breakoutPeriod = Param(nameof(BreakoutPeriod), 36)
.SetDisplay("Breakout Period", "Period for Highest/Lowest channel.", "Indicators");
}
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int BreakoutPeriod
{
get => _breakoutPeriod.Value;
set => _breakoutPeriod.Value = value;
}
/// <inheritdoc />
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_entryPrice = 0;
_prevHighest = 0;
_prevLowest = 0;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_entryPrice = 0;
_prevHighest = 0;
_prevLowest = 0;
_hasPrev = false;
var highest = new Highest { Length = BreakoutPeriod };
var lowest = new Lowest { Length = BreakoutPeriod };
var ema = new ExponentialMovingAverage { Length = BreakoutPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(highest, lowest, ema, ProcessCandle)
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, ema);
DrawOwnTrades(area);
}
}
private void ProcessCandle(ICandleMessage candle, decimal highestValue, decimal lowestValue, decimal emaValue)
{
if (candle.State != CandleStates.Finished)
return;
var close = candle.ClosePrice;
var mid = (highestValue + lowestValue) / 2m;
// Exit conditions
if (Position > 0)
{
// Exit when price reverts to middle or stop-loss
if (close < mid || (_entryPrice > 0 && close < _entryPrice * 0.98m))
{
SellMarket();
}
}
else if (Position < 0)
{
if (close > mid || (_entryPrice > 0 && close > _entryPrice * 1.02m))
{
BuyMarket();
}
}
// Entry conditions: breakout above previous highest or below previous lowest
if (Position == 0 && _hasPrev)
{
if (close > _prevHighest && close > emaValue)
{
_entryPrice = close;
BuyMarket();
}
else if (close < _prevLowest && close < emaValue)
{
_entryPrice = close;
SellMarket();
}
}
_prevHighest = highestValue;
_prevLowest = lowestValue;
_hasPrev = true;
}
}
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 Highest, Lowest, ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class pipso_night_breakout_strategy(Strategy):
def __init__(self):
super(pipso_night_breakout_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5))).SetDisplay("Candle Type", "Timeframe", "General")
self._breakout_period = self.Param("BreakoutPeriod", 36).SetDisplay("Breakout Period", "Period for Highest/Lowest channel", "Indicators")
@property
def CandleType(self): return self._candle_type.Value
@CandleType.setter
def CandleType(self, value): self._candle_type.Value = value
def OnReseted(self):
super(pipso_night_breakout_strategy, self).OnReseted()
self._entry_price = 0
self._prev_highest = 0
self._prev_lowest = 0
self._has_prev = False
def OnStarted2(self, time):
super(pipso_night_breakout_strategy, self).OnStarted2(time)
self._entry_price = 0
self._prev_highest = 0
self._prev_lowest = 0
self._has_prev = False
highest = Highest()
highest.Length = self._breakout_period.Value
lowest = Lowest()
lowest.Length = self._breakout_period.Value
ema = ExponentialMovingAverage()
ema.Length = self._breakout_period.Value
sub = self.SubscribeCandles(self.CandleType)
sub.Bind(highest, lowest, ema, self.OnProcess).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, sub)
self.DrawIndicator(area, ema)
self.DrawOwnTrades(area)
def OnProcess(self, candle, highest_val, lowest_val, ema_val):
if candle.State != CandleStates.Finished:
return
close = candle.ClosePrice
mid = (highest_val + lowest_val) / 2.0
if self.Position > 0:
if close < mid or (self._entry_price > 0 and close < self._entry_price * 0.98):
self.SellMarket()
elif self.Position < 0:
if close > mid or (self._entry_price > 0 and close > self._entry_price * 1.02):
self.BuyMarket()
if self.Position == 0 and self._has_prev:
if close > self._prev_highest and close > ema_val:
self._entry_price = close
self.BuyMarket()
elif close < self._prev_lowest and close < ema_val:
self._entry_price = close
self.SellMarket()
self._prev_highest = highest_val
self._prev_lowest = lowest_val
self._has_prev = True
def CreateClone(self):
return pipso_night_breakout_strategy()