Diese Strategie ist eine StockSharp-Konvertierung des MetaTrader Expert Advisors "ICHMOKU RETRACEMENT". Sie behält die ursprüngliche Idee bei, Ichimoku-Pullbacks zu handeln, die innerhalb eines Trends auf einem höheren Zeitrahmen auftreten, während sie durch langfristige Momentum- und MACD-Readings gefiltert werden. Die StockSharp-Implementierung konzentriert sich auf Klarheit, Indikator-Wiederverwendung und Risikokontrolle durch die High-Level-API.
Handelsidee
Trendfilter – die Strategie sucht nach einem bullischen oder bärischen Bias unter Verwendung eines Paares von Linear Gewichteten Gleitenden Durchschnitten (LWMA). Ein bullischer Kontext erfordert, dass die schnelle LWMA über der langsamen LWMA liegt, während ein bärischer Kontext die entgegengesetzte Beziehung erfordert.
Ichimoku-Retracement – nach Erkennung eines Trends muss die vorherige Kerze eine der Ichimoku-Linien berühren (Tenkan-sen, Kijun-sen oder die beiden führenden Spans). Die aktuelle Kerze muss auf der Trendseite der berührten Linie wieder öffnen und damit einen Momentum-Pullback signalisieren.
Momentum-Bestätigung – das Schluss-zu-Schluss-Momentum-Verhältnis muss von seinem neutralen Wert (100) um mindestens einen konfigurierbaren Schwellenwert abweichen. Das Verhältnis wird auf demselben Zeitrahmen berechnet, der für den Ichimoku-Indikator verwendet wird.
Makro-Filter – ein monatlicher MACD (12/26/9) bestätigt die dominante Langzeit-Richtung. Long-Trades erfordern die MACD-Hauptlinie über der Signallinie, Short-Trades erfordern das Gegenteil.
Orderverwaltung – die Strategie hält höchstens eine Netto-Position. Schützende Stop-Loss- und Take-Profit-Level werden in Pips gesetzt und bei jeder abgeschlossenen Kerze ausgewertet.
Parameter
Name
Beschreibung
Standard
Signal Candle Type
Zeitrahmen für die LWMA-, Ichimoku- und Momentum-Berechnungen.
1-Stunden-Kerzen
Macro Candle Type
Höherer Zeitrahmen für den MACD-Trendfilter.
30-Tage-Kerzen
Fast LWMA
Periode für den schnellen linear gewichteten gleitenden Durchschnitt.
6
Slow LWMA
Periode für den langsamen linear gewichteten gleitenden Durchschnitt.
85
Tenkan Period
Ichimoku Tenkan-sen-Periode.
9
Kijun Period
Ichimoku Kijun-sen-Periode.
26
Span B Period
Ichimoku Senkou Span B-Periode.
52
Momentum Period
Lookback für das Schluss-zu-Schluss-Momentum-Verhältnis.
14
Momentum Threshold
Mindest-Absolutabweichung von 100, die das Momentum-Verhältnis erfordert.
0.3
Take Profit (pips)
Take-Profit-Abstand in Pips.
50
Stop Loss (pips)
Stop-Loss-Abstand in Pips.
20
Der Basisparameter Volume steuert die Größe neuer Orders. Wenn ein Umkehrsignal erscheint, schließt die Strategie die aktuelle Position (falls vorhanden) und öffnet eine neue Position in entgegengesetzter Richtung mit Volume + |Position| Kontrakten.
Handelsregeln
Long-Einstiege
Schnelle LWMA > langsame LWMA.
MACD-Hauptlinie > MACD-Signallinie auf dem Makro-Zeitrahmen.
Momentum-Verhältnis-Abweichung ≥ Schwellenwert.
Das Tief der vorherigen Kerze berührte mindestens ein Ichimoku-Level und die aktuelle Kerze öffnete wieder über diesem Level.
Netto-Position muss flach oder short sein.
Short-Einstiege
Schnelle LWMA < langsame LWMA.
MACD-Hauptlinie < MACD-Signallinie auf dem Makro-Zeitrahmen.
Momentum-Verhältnis-Abweichung ≥ Schwellenwert.
Das Hoch der vorherigen Kerze berührte mindestens ein Ichimoku-Level und die aktuelle Kerze öffnete wieder unter diesem Level.
Netto-Position muss flach oder long sein.
Ausstiege
Eine Long-Position schließt, wenn das Tief der Kerze den Stop-Loss oder das Hoch das Take-Profit-Level erreicht.
Eine Short-Position schließt, wenn das Hoch der Kerze den Stop-Loss oder das Tief das Take-Profit-Level erreicht.
Unterschiede vs. Original-EA
Geldmanagement-Leitern, Break-Even-Bewegungen und Trailing-Features aus der MQL-Version werden nicht repliziert; die Risikokontrolle ist auf feste Stop-Loss- und Take-Profit-Level beschränkt.
StockSharp arbeitet mit einer einzigen Netto-Position, sodass der Martingale-Order-Stack durch einen Eintrag pro Richtung ersetzt wird.
Alerts, E-Mail- und Push-Benachrichtigungen aus der MetaTrader-Umgebung werden weggelassen.
Verwendungshinweise
Die Strategie einem StockSharp Designer- oder Shell-Projekt hinzufügen.
Das gewünschte Instrument auswählen und den Signal Candle Type an den Zielzeitrahmen anpassen.
Sicherstellen, dass der Macro Candle Type aus den verfügbaren Daten synthetisiert werden kann (das Abonnement verwendet allowBuildFromSmallerTimeFrame).
Stop-Loss, Take-Profit und den Momentum-Schwellenwert entsprechend der Volatilität des Instruments einstellen.
Die enthaltenen Kommentare beschreiben jeden Entscheidungsschritt, sodass die Logik leicht angepasst oder erweitert werden kann.
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
public class IchimokuRetracementStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private decimal? _prevFast, _prevSlow;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public IchimokuRetracementStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame()).SetDisplay("Candle Type", "Timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 9).SetGreaterThanZero().SetDisplay("Fast DEMA", "Fast DEMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 26).SetGreaterThanZero().SetDisplay("Slow DEMA", "Slow DEMA period", "Indicators");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevFast = null;
_prevSlow = null;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevFast = null; _prevSlow = null;
var fast = new DoubleExponentialMovingAverage { Length = FastPeriod };
var slow = new DoubleExponentialMovingAverage { Length = SlowPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(fast, slow, ProcessCandle).Start();
var area = CreateChartArea();
if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fast); DrawIndicator(area, slow); DrawOwnTrades(area); }
}
private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
{
if (candle.State != CandleStates.Finished) return;
if (!IsFormedAndOnlineAndAllowTrading()) { _prevFast = fast; _prevSlow = slow; return; }
if (_prevFast == null || _prevSlow == null) { _prevFast = fast; _prevSlow = slow; return; }
var prevAbove = _prevFast.Value > _prevSlow.Value;
var currAbove = fast > slow;
_prevFast = fast; _prevSlow = slow;
if (!prevAbove && currAbove && Position <= 0) { if (Position < 0) BuyMarket(); BuyMarket(); }
else if (prevAbove && !currAbove && 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
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import DoubleExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class ichimoku_retracement_strategy(Strategy):
def __init__(self):
super(ichimoku_retracement_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(1))) \
.SetDisplay("Candle Type", "Timeframe", "General")
self._fast_period = self.Param("FastPeriod", 9) \
.SetDisplay("Fast DEMA", "Fast DEMA period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 26) \
.SetDisplay("Slow DEMA", "Slow DEMA period", "Indicators")
self._prev_fast = None
self._prev_slow = None
@property
def CandleType(self):
return self._candle_type.Value
@property
def FastPeriod(self):
return self._fast_period.Value
@property
def SlowPeriod(self):
return self._slow_period.Value
def OnReseted(self):
super(ichimoku_retracement_strategy, self).OnReseted()
self._prev_fast = None
self._prev_slow = None
def OnStarted2(self, time):
super(ichimoku_retracement_strategy, self).OnStarted2(time)
self._prev_fast = None
self._prev_slow = None
fast = DoubleExponentialMovingAverage()
fast.Length = self.FastPeriod
slow = DoubleExponentialMovingAverage()
slow.Length = self.SlowPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(fast, slow, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, fast)
self.DrawIndicator(area, 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 self._prev_fast is None or self._prev_slow is None:
self._prev_fast = fv
self._prev_slow = sv
return
prev_above = self._prev_fast > self._prev_slow
curr_above = fv > sv
self._prev_fast = fv
self._prev_slow = sv
if not prev_above and curr_above and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
elif prev_above and not curr_above and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
def CreateClone(self):
return ichimoku_retracement_strategy()