Die Strategie repliziert die Logik des Expertenberaters Caudate X Period Candle TM Plus. Sie glättet die Eröffnungs-, Hoch-, Tief- und Schlusskurse der Kerze mit einem konfigurierbaren gleitenden Durchschnitt, erstellt einen Donchian-ähnlichen Bereich und klassifiziert jede abgeschlossene Kerze in einen von sechs Farbcodes, abhängig von der Position des Körpers innerhalb des Bereichs. Long-Einstiege werden durch die bullischen Unterhalt-Farben (0 oder 1) ausgelöst, während Short-Einstiege durch die bärischen Oberhalt-Farben (5 oder 6) ausgelöst werden. Entgegengesetzte Farbgruppen werden verwendet, um bestehende Positionen zu beenden.
Handelsregeln
Die ausgewählte Kerzenserie abonnieren und jede Komponente mit dem gewählten gleitenden Durchschnitt glätten.
Das höchste Hoch und das niedrigste Tief der geglätteten Hochs und Tiefs über den angegebenen Donchian Period berechnen, dann den Bereich erweitern, damit er immer die geglättete Eröffnung und den Schluss enthält.
Die Kerzenfarbe bestimmen:
Farben 0/1 – Körper nahe der Oberseite des Bereichs (unterer Schatten).
Farben 2/4 – Körper zentriert innerhalb des Bereichs.
Farben 5/6 – Körper nahe der Unterseite des Bereichs (oberer Schatten).
Die Farbe des durch Signal Bar versetzten Balkens auswerten (Standard 1 verwendet die vorherige abgeschlossene Kerze).
Positionen öffnen, wenn die Farbe zur Einstiegsgruppe gehört und die entgegengesetzte Position nicht aktiv ist.
Positionen schließen, wenn die Farbe zur Ausstiegsgruppe gehört oder die maximale Haltezeit abläuft.
Optionale Stop-Loss- und Take-Profit-Versätze werden über das integrierte Schutzmodul eingestellt.
Parameter
Parameter
Beschreibung
Candle Type
Zeitrahmen für Signalberechnungen.
Donchian Period
Anzahl der Kerzen für den geglätteten Hoch-/Tief-Bereich.
Signal Bar
Anzahl der Balken zur Verzögerung der Signalauswertung (0 = aktueller Balken).
Smoothing Method
Gleitender Durchschnitt auf OHLC-Kurse angewendet (SMA, EMA, SMMA, LWMA, Jurik JJMA-Annäherung, Kaufman AMA).
MA Length
Länge des Glättungsfilters.
MA Phase
Reserviert für JJMA-Kompatibilität (nicht von StockSharp-Durchschnitten verwendet).
Enable Long/Short Entries
Öffnen neuer Long- oder Short-Positionen umschalten.
Enable Long/Short Exits
Schließen bestehender Long- oder Short-Positionen bei Signalen umschalten.
Enable Time Exit
Maximalen Haltezeitfilter aktivieren.
Time Exit (minutes)
Haltedauer vor einem erzwungenen Ausstieg.
Stop Loss (points)
Stop-Loss-Abstand in Kursschritten (multipliziert mit Security.PriceStep).
Take Profit (points)
Take-Profit-Abstand in Kursschritten.
Hinweise
Signal Bar = 1 entspricht dem MQL5-Expertenverhalten, indem auf der letzten vollständig geschlossenen Kerze agiert wird.
Wenn Stop- oder Zielabstände größer als null sind, ruft die Strategie StartProtection mit absoluten Versätzen basierend auf dem Instrumentenpreisschritt auf.
MA Phase wird für Kompatibilität beibehalten, wird aber nicht von den StockSharp-gleitenden Durchschnittsimplementierungen verbraucht.
Die Basis-Ordergröße durch die geerbte Strategy.Volume-Eigenschaft einstellen; die Implementierung schließt immer entgegengesetzte Positionen, bevor eine neue eröffnet wird.
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>
/// Caudate X Period Candle TM Plus strategy (simplified). Detects candle body/tail
/// patterns using ATR-based filtering and EMA trend direction.
/// </summary>
public class CaudateXPeriodCandleTmPlusStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _atrLength;
private readonly StrategyParam<int> _emaLength;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int AtrLength
{
get => _atrLength.Value;
set => _atrLength.Value = value;
}
public int EmaLength
{
get => _emaLength.Value;
set => _emaLength.Value = value;
}
public CaudateXPeriodCandleTmPlusStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
.SetDisplay("Candle Type", "Candles", "General");
_atrLength = Param(nameof(AtrLength), 14)
.SetGreaterThanZero()
.SetDisplay("ATR Length", "ATR period", "Indicators");
_emaLength = Param(nameof(EmaLength), 20)
.SetGreaterThanZero()
.SetDisplay("EMA Length", "Trend EMA period", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var atr = new AverageTrueRange { Length = AtrLength };
var ema = new ExponentialMovingAverage { Length = EmaLength };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(atr, ema, (ICandleMessage candle, decimal atrValue, decimal emaValue) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (atrValue <= 0)
return;
var close = candle.ClosePrice;
var body = Math.Abs(close - candle.OpenPrice);
// Strong body candle in the trend direction.
if (body > atrValue * 0.75m)
{
if (close > candle.OpenPrice && close > emaValue && Position <= 0)
BuyMarket();
else if (close < candle.OpenPrice && close < emaValue && Position >= 0)
SellMarket();
}
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, ema);
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, Math
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import AverageTrueRange, ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class caudate_x_period_candle_tm_plus_strategy(Strategy):
def __init__(self):
super(caudate_x_period_candle_tm_plus_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(1))) \
.SetDisplay("Candle Type", "Candles", "General")
self._atr_length = self.Param("AtrLength", 14) \
.SetDisplay("ATR Length", "ATR period", "Indicators")
self._ema_length = self.Param("EmaLength", 20) \
.SetDisplay("EMA Length", "Trend EMA period", "Indicators")
@property
def CandleType(self):
return self._candle_type.Value
@property
def AtrLength(self):
return self._atr_length.Value
@property
def EmaLength(self):
return self._ema_length.Value
def OnStarted2(self, time):
super(caudate_x_period_candle_tm_plus_strategy, self).OnStarted2(time)
atr = AverageTrueRange()
atr.Length = self.AtrLength
ema = ExponentialMovingAverage()
ema.Length = self.EmaLength
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(atr, ema, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, ema)
self.DrawOwnTrades(area)
def _on_process(self, candle, atr_value, ema_value):
if candle.State != CandleStates.Finished:
return
av = float(atr_value)
if av <= 0:
return
close = float(candle.ClosePrice)
open_p = float(candle.OpenPrice)
ev = float(ema_value)
body = abs(close - open_p)
if body > av * 0.75:
if close > open_p and close > ev and self.Position <= 0:
self.BuyMarket()
elif close < open_p and close < ev and self.Position >= 0:
self.SellMarket()
def CreateClone(self):
return caudate_x_period_candle_tm_plus_strategy()