Diese Strategie reproduziert den MetaTrader 5 Experten „Expert_AML_CCI“ innerhalb des StockSharp High-Level-Frameworks. Der ursprüngliche Roboter
kombiniert das japanische Candlestick-Muster „Meeting Lines“ mit einem Commodity Channel Index (CCI)-Filter und nutzt den Expert Advisor
Motor zur Gewichtung bullischer und bärischer Stimmen. Der Port StockSharp behält die gleiche Bestätigungslogik bei und übersetzt den Candlestick
Mustererkennung in reine Kerzenarithmetik umwandelt und alle Schwellenwerte als optimiererfreundliche Parameter offenlegt.
Wie es funktioniert
Datenquelle – Die Strategie abonniert eine konfigurierbare Zeitrahmen-Kerzenserie (standardmäßig 30-Minuten-Kerzen) mit
SubscribeCandles. Jede fertige Kerze wird zusammen mit dem synchronisierten CCI-Wert über den High-Level Bind versendet.
Pipeline, sodass keine manuelle Indikatorenverwaltung erforderlich ist.
Kernindikator – Ein einzelner CommodityChannelIndex mit der Periode CciPeriod spiegelt den MetaTrader-Oszillator wider. Seine Werte sind
Wird intern zwischengespeichert, um die beiden letzten abgeschlossenen Messwerte zu vergleichen und die Aufrufe CCI(1) und CCI(2) von MQL zu replizieren.
Candlestick-Logik – Die Hilfsmethoden bauen die Prüfungen „Bullish Meeting Lines“ und „Bearish Meeting Lines“ neu auf. Sie berechnen
der gleitende Durchschnitt der Körperlängen über AverageBodyPeriod Kerzen (Standard 3) und erzwingt den langen Körper und den gleichen Schlusskurs
Anforderungen aus dem ursprünglichen CML_CCI-Filter. Da StockSharp fertige Kerzen liefert, wird das Muster genau ausgewertet
wenn die zweite Kerze des Musters schließt – im selben Moment gibt der MQL-Experte seine 80-Punkte-Stimme ab.
Eintrittsregeln –
Long-Positionen erfordern eine bullische Meeting-Lines-Formation und den letzten abgeschlossenen CCI-Wert, um darunter oder gleich zu bleiben
LongEntryCciLevel (standardmäßig −50). Wenn ein entgegengesetzter Short offen ist, umfasst die Ordergröße automatisch den absoluten Wert
der aktuellen Position, um die Richtung umzukehren, was dem Verhalten von EA entspricht.
Short-Positionen spiegeln die Logik wider: ein rückläufiges Meeting-Lines-Muster plus einen CCI-Wert über oder gleich ShortEntryCciLevel
(+50 standardmäßig).
Ausstiegsregeln – Anstelle der Abstimmungsgewichte des Expert Advisors verwendet der Port explizite Flattening Orders. Positionen sind geschlossen
wenn CCI das durch ExtremeCciLevel definierte Extremband überschreitet (standardmäßig 80):
Shorts werden beendet, wenn der CCI durch −Extreme nach oben springt oder wieder unter +Extreme fällt.
Long-Positionen werden beendet, wenn CCI unter +Extreme fällt oder unter −Extreme fällt.
Diese Regeln spiegeln den Abstimmungszweig 40 innerhalb von LongCondition und ShortCondition in der Signalklasse MQL wider.
Risikomanagement – Die Strategie überlässt Schutzstopps dem Anrufer. Es ist kompatibel mit StockSharps StartProtection
Helfer, wenn ein Stop-Loss oder Take-Profit extern angebracht werden muss.
Parameter
Parameter
Beschreibung
Standard
CandleType
Zeitrahmen der Quellkerzen.
30-minütiger Zeitrahmen
CciPeriod
Länge des Commodity Channel Index.
18
AverageBodyPeriod
Anzahl der Kerzen, die zur Berechnung der durchschnittlichen Körpergröße für die Mustervalidierung verwendet werden.
3
LongEntryCciLevel
Überverkauftes Niveau, das bullische Meeting-Linien bestätigt.
−50
ShortEntryCciLevel
Überkauftes Niveau, das die rückläufigen Meeting-Linien bestätigt.
+50
ExtremeCciLevel
Absolutes Extremband für CCI Exit-Crossovers.
80
Alle numerischen Parameter stellen Optimierungsbereiche bereit, die mit den EA-Standardwerten identisch sind, sodass die Strategie durch StockSharp optimiert werden kann
Optimierungstools.
Nutzungshinweise
Hängen Sie die Strategie an ein Wertpapier an und stellen Sie den gewünschten Volume ein, bevor Sie beginnen.
Passen Sie optional die Schwellenwerte an, um sie an das ursprüngliche Geldverwaltungsprofil anzupassen oder um die Empfindlichkeit anzupassen.
Die Chart-Integration zeichnet Kerzen, die CCI-Kurve und ausgeführte Trades für eine schnelle visuelle Validierung der Mustererkennung.
Durch die Fokussierung auf die gleiche Candlestick+CCI-Kombination liefert diese StockSharp-Implementierung eine originalgetreue Portierung des Experten
Berater unter Einhaltung des empfohlenen High-Level-API-Stils.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Meeting Lines + CCI strategy.
/// Buys on bullish meeting lines with low CCI, sells on bearish meeting lines with high CCI.
/// </summary>
public class AmlCciMeetingLinesStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _cciPeriod;
private readonly StrategyParam<decimal> _cciLow;
private readonly StrategyParam<decimal> _cciHigh;
private ICandleMessage _prevCandle;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int CciPeriod { get => _cciPeriod.Value; set => _cciPeriod.Value = value; }
public decimal CciLow { get => _cciLow.Value; set => _cciLow.Value = value; }
public decimal CciHigh { get => _cciHigh.Value; set => _cciHigh.Value = value; }
public AmlCciMeetingLinesStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_cciPeriod = Param(nameof(CciPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("CCI Period", "CCI period", "Indicators");
_cciLow = Param(nameof(CciLow), -50m)
.SetDisplay("CCI Low", "CCI level for bullish entry", "Signals");
_cciHigh = Param(nameof(CciHigh), 50m)
.SetDisplay("CCI High", "CCI level for bearish entry", "Signals");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevCandle = null;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevCandle = null;
var cci = new CommodityChannelIndex { Length = CciPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(cci, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal cciValue)
{
if (candle.State != CandleStates.Finished) return;
if (_prevCandle != null)
{
var avgBody = (Math.Abs(candle.ClosePrice - candle.OpenPrice) +
Math.Abs(_prevCandle.ClosePrice - _prevCandle.OpenPrice)) / 2m;
if (avgBody > 0)
{
var prevBearish = _prevCandle.OpenPrice > _prevCandle.ClosePrice;
var currBullish = candle.ClosePrice > candle.OpenPrice;
var closesNear = Math.Abs(candle.ClosePrice - _prevCandle.ClosePrice) < avgBody * 0.3m;
// Bullish meeting lines
if (prevBearish && currBullish && closesNear && cciValue < CciLow && Position <= 0)
BuyMarket();
var prevBullish = _prevCandle.ClosePrice > _prevCandle.OpenPrice;
var currBearish = candle.OpenPrice > candle.ClosePrice;
var closesNear2 = Math.Abs(candle.ClosePrice - _prevCandle.ClosePrice) < avgBody * 0.3m;
// Bearish meeting lines
if (prevBullish && currBearish && closesNear2 && cciValue > CciHigh && Position >= 0)
SellMarket();
}
}
_prevCandle = candle;
}
}
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 CandleStates
from StockSharp.Algo.Indicators import CommodityChannelIndex
from StockSharp.Algo.Strategies import Strategy
from datatype_extensions import *
class aml_cci_meeting_lines_strategy(Strategy):
"""
Meeting Lines + CCI strategy.
Buys on bullish meeting lines with low CCI, sells on bearish meeting lines with high CCI.
"""
def __init__(self):
super(aml_cci_meeting_lines_strategy, self).__init__()
self._candle_type = self.Param("CandleType", tf(5)) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._cci_period = self.Param("CciPeriod", 14) \
.SetGreaterThanZero() \
.SetDisplay("CCI Period", "CCI period", "Indicators")
self._cci_low = self.Param("CciLow", -50.0) \
.SetDisplay("CCI Low", "CCI level for bullish entry", "Signals")
self._cci_high = self.Param("CciHigh", 50.0) \
.SetDisplay("CCI High", "CCI level for bearish entry", "Signals")
self._prev_open = None
self._prev_close = None
@property
def CandleType(self): return self._candle_type.Value
@CandleType.setter
def CandleType(self, v): self._candle_type.Value = v
@property
def CciPeriod(self): return self._cci_period.Value
@CciPeriod.setter
def CciPeriod(self, v): self._cci_period.Value = v
@property
def CciLow(self): return self._cci_low.Value
@CciLow.setter
def CciLow(self, v): self._cci_low.Value = v
@property
def CciHigh(self): return self._cci_high.Value
@CciHigh.setter
def CciHigh(self, v): self._cci_high.Value = v
def OnReseted(self):
super(aml_cci_meeting_lines_strategy, self).OnReseted()
self._prev_open = None
self._prev_close = None
def OnStarted2(self, time):
super(aml_cci_meeting_lines_strategy, self).OnStarted2(time)
self._prev_open = None
self._prev_close = None
cci = CommodityChannelIndex()
cci.Length = self.CciPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(cci, self.ProcessCandle).Start()
def ProcessCandle(self, candle, cci_value):
if candle.State != CandleStates.Finished:
return
c_open = float(candle.OpenPrice)
c_close = float(candle.ClosePrice)
if self._prev_open is not None and self._prev_close is not None:
avg_body = (abs(c_close - c_open) + abs(self._prev_close - self._prev_open)) / 2.0
if avg_body > 0:
prev_bearish = self._prev_open > self._prev_close
curr_bullish = c_close > c_open
closes_near = abs(c_close - self._prev_close) < avg_body * 0.3
if prev_bearish and curr_bullish and closes_near and cci_value < self.CciLow and self.Position <= 0:
self.BuyMarket()
prev_bullish = self._prev_close > self._prev_open
curr_bearish = c_open > c_close
closes_near2 = abs(c_close - self._prev_close) < avg_body * 0.3
if prev_bullish and curr_bearish and closes_near2 and cci_value > self.CciHigh and self.Position >= 0:
self.SellMarket()
self._prev_open = c_open
self._prev_close = c_close
def CreateClone(self):
"""!! REQUIRED!! Creates a new instance of the strategy."""
return aml_cci_meeting_lines_strategy()