Auf GitHub ansehen

AML CCI Meeting Lines-Strategie

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

  1. Hängen Sie die Strategie an ein Wertpapier an und stellen Sie den gewünschten Volume ein, bevor Sie beginnen.
  2. Passen Sie optional die Schwellenwerte an, um sie an das ursprüngliche Geldverwaltungsprofil anzupassen oder um die Empfindlichkeit anzupassen.
  3. 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;
	}
}