OverHedge V2 ist ein abgesichertes Rastersystem, das Long- und Short-Positionen abwechselt und gleichzeitig die Handelsgröße nach jeder Füllung erhöht. Die Strategie analysiert die Beziehung zwischen einem schnellen und einem langsamen exponentiellen gleitenden Durchschnitt (EMA), um die vorherrschende Richtung für den nächsten Zyklus zu bestimmen. Sobald ein Zyklus beginnt, platziert der Algorithmus Marktaufträge, sobald der Preis vordefinierte Tunnelniveaus um den Startkurs herum erreicht. Das Gitter dehnt sich symmetrisch aus, sodass jedes neue Bein den schwebenden Verlust des vorherigen ausgleicht. Der Zyklus endet, wenn der gesamte offene Gewinn ein konfigurierbares Ziel überschreitet oder wenn der Händler manuell eine Abschaltung anfordert.
Die Implementierung führt getrennte Bilanzen für Long- und Short-Engagements und nutzt Live-Preise der Stufe 1, um neue Absicherungen auszulösen. Das Handelsvolumen wächst geometrisch entsprechend dem gewählten Multiplikator, der das Martingal-Risiko des ursprünglichen MetaTrader-Expertenberaters reproduziert. Da Aufträge zum Marktwert ausgeführt werden, passt sich das System automatisch an die Liquiditätsbedingungen an und behält dabei den in Punkten ausgedrückten Rasterabstand bei.
Wie es funktioniert
Richtungsfilter – Die Strategie berechnet zwei EMAs für abgeschlossene Kerzen. Wenn der schnelle EMA über dem langsamen EMA liegt, beginnt der nächste Zyklus mit einer langen Tendenz; andernfalls beginnt es mit einer kurzen Voreingenommenheit.
Zyklusinitialisierung – Zu Beginn eines Zyklus zeichnet der Algorithmus den aktuellen Geldpreis auf und leitet zwei Tunnelgrenzen ab, die durch die konfigurierte Breite und den Live-Spread getrennt sind. Die erste Ordnung folgt der EMA-Vorspannung, und der entgegengesetzte Zweig wird im Tunnelabstand abgestuft.
Rastererweiterung – Bleibt der Preis gegenüber dem letzten Eintrag bestehen, werden abwechselnd weitere Marktaufträge ausgelöst (Kauf, Verkauf, Kauf, …). Jedes neue Bein multipliziert das vorherige Volumen mit dem Hedge-Multiplikator, sodass sich die Gesamtposition bei einer Umkehr schneller erholen kann.
Gewinnernte – Der Zyklus überwacht ständig nicht realisierte Gewinne anhand der besten Geld-/Briefkurse. Wenn der Zielwert erreicht ist oder der Bediener das Abschaltflag umschaltet, werden alle offenen Zweige aufgelöst und der Zyklus zurückgesetzt.
Exposure Tracking – Die Strategie behält den durchschnittlichen Preis und das durchschnittliche Volumen sowohl für Long- als auch für Short-Hedges bei, um den offenen Gewinn präzise zu berechnen und das Senden doppelter Aufträge zu vermeiden, während bestehende noch ausstehen.
Standardparameter
Base Volume = 0,1 Lots – anfängliche Handelsgröße für den ersten Rasterabschnitt.
Hedge Multiplier = 2,0 – Volumenmultiplikator, der auf jede nachfolgende Etappe angewendet wird.
Tunnel Width (points) = 20 – Zusätzlicher Abstand zwischen wechselnden Aufträgen über den aktuellen Spread hinaus.
Profit Target = 100 – Nicht realisierter Gewinn in der Kontowährung, der das gesamte Raster schließt.
Short EMA = 8 – Zeitraum des schnellen EMA, der zur Richtungserkennung verwendet wird.
Long EMA = 21 – Zeitraum des langsamen EMA, der zur Richtungserkennung verwendet wird.
Candle Type = 1 Minute – Zeitrahmen, der die EMA-Filter speist.
Shutdown Grid = false – Bei „true“ beendet die Strategie sofort alle Abschnitte und stoppt den Handel.
Notizen
Das Raster funktioniert mit jedem Instrument, das Kurse der Stufe 1 (bester Geld-/Briefkurs) bereitstellt. Größere Spreads erhöhen automatisch die Tunnelgröße.
Das Handelsvolumen wird mithilfe des Sicherheitsvolumenschritts normalisiert, um abgelehnte Aufträge zu vermeiden.
Da das System ein Martingal-Größenschema verwendet, sind große Rückgänge möglich, wenn die Preistrends anhalten, ohne das Gewinnziel zu erreichen.
Um den Handel nach einer Schließung wieder aufzunehmen, schalten Sie den Parameter wieder auf false um oder starten Sie die Strategie neu.
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>
/// OverHedge V2 Grid strategy using RSI mean reversion with grid averaging.
/// Buy when RSI is oversold, sell when RSI is overbought.
/// </summary>
public class OverHedgeV2GridStrategy : Strategy
{
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<decimal> _oversold;
private readonly StrategyParam<decimal> _overbought;
private readonly StrategyParam<DataType> _candleType;
public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
public decimal Oversold { get => _oversold.Value; set => _oversold.Value = value; }
public decimal Overbought { get => _overbought.Value; set => _overbought.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public OverHedgeV2GridStrategy()
{
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetDisplay("RSI Period", "RSI period", "Indicators");
_oversold = Param(nameof(Oversold), 30m)
.SetDisplay("Oversold", "RSI oversold level", "Indicators");
_overbought = Param(nameof(Overbought), 70m)
.SetDisplay("Overbought", "RSI overbought level", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).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();
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(rsi, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal rsiValue)
{
if (candle.State != CandleStates.Finished)
return;
if (rsiValue <= Oversold && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
else if (rsiValue >= Overbought && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
}
}
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 RelativeStrengthIndex
from StockSharp.Algo.Strategies import Strategy
class over_hedge_v2_grid_strategy(Strategy):
"""OverHedge V2 Grid strategy using RSI mean reversion.
Buy when RSI is oversold, sell when RSI is overbought."""
def __init__(self):
super(over_hedge_v2_grid_strategy, self).__init__()
self._rsi_period = self.Param("RsiPeriod", 14) \
.SetDisplay("RSI Period", "RSI period", "Indicators")
self._oversold = self.Param("Oversold", 30.0) \
.SetDisplay("Oversold", "RSI oversold level", "Indicators")
self._overbought = self.Param("Overbought", 70.0) \
.SetDisplay("Overbought", "RSI overbought level", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(1))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def RsiPeriod(self):
return self._rsi_period.Value
@property
def Oversold(self):
return self._oversold.Value
@property
def Overbought(self):
return self._overbought.Value
def OnReseted(self):
super(over_hedge_v2_grid_strategy, self).OnReseted()
def OnStarted2(self, time):
super(over_hedge_v2_grid_strategy, self).OnStarted2(time)
rsi = RelativeStrengthIndex()
rsi.Length = self.RsiPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(rsi, self._process_candle).Start()
def _process_candle(self, candle, rsi_value):
if candle.State != CandleStates.Finished:
return
rsi_val = float(rsi_value)
if rsi_val <= float(self.Oversold) and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
elif rsi_val >= float(self.Overbought) and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
def CreateClone(self):
return over_hedge_v2_grid_strategy()