GitHub で見る

AML CCI 会議ライン戦略

この戦略は、StockSharp の上位フレームワーク内で MetaTrader 5 エキスパート「Expert_AML_CCI」を再現します。オリジナルロボット 日本のローソク足パターン「ミーティングライン」と商品チャネルインデックス (CCI) フィルターを組み合わせ、エキスパートアドバイザーを使用します 強気票と弱気票を重み付けするエンジン。 StockSharp ポートは同じ確認ロジックを維持し、ローソク足を変換します パターン検出を純粋なローソク足演算に組み込み、すべてのしきい値をオプティマイザーに適したパラメーターとして公開します。

仕組み

  • データ ソース – この戦略は、次を使用して、構成可能な時間枠のローソク足シリーズ (デフォルトでは 30 分のローソク足) をサブスクライブします。 SubscribeCandles。完成したすべてのキャンドルは、高レベルの Bind 経由で同期された CCI 値とともに送信されます。 パイプラインなので、手動のインジケーター管理は必要ありません。
  • コア インジケーター – 期間 CciPeriod を持つ単一の CommodityChannelIndex は、MetaTrader オシレーターをミラーリングします。その値は次のとおりです。 内部的にキャッシュされ、最後に完了した 2 つの読み取り値を比較し、MQL からの CCI(1)CCI(2) の呼び出しを複製します。
  • ローソク足ロジック – ヘルパー メソッドは、「強気の会合線」と「弱気の会合線」チェックを再構築します。彼らは計算します AverageBodyPeriod ローソク足にわたる実体長の移動平均 (デフォルトは 3) で、実体長と等値終値を強制します。 元の CML_CCI フィルタの要件。 StockSharp は完成したキャンドルを提供するため、パターンは正確に評価されます パターンの 2 番目のローソク足が閉じるとき – MQL の専門家が 80 ポイントの投票を行うのと同じ瞬間です。
  • エントリールール
    • ロングポジションには、強気のミーティングライン形成と、最後に完了した CCI の値がそれ以下にとどまる必要があります。 LongEntryCciLevel (デフォルトでは -50)。反対側のショートがオープンしている場合、注文サイズには自動的に絶対値が含まれます。 現在位置の方向を反転し、EA の動作と一致します。
    • ショート ポジションはロジックを反映しています: 弱気のミーティング ライン パターンと ShortEntryCciLevel 以上の CCI 値 (デフォルトでは +50)。
  • 出口ルール – エキスパートアドバイザーの投票重みの代わりに、ポートは明示的なフラット化注文を使用します。ポジションはクローズされています CCI が ExtremeCciLevel で定義された極端な帯域 (デフォルトでは 80) を横切るとき:
    • CCI が -Extreme を通って上向きにジャンプするか、+Extreme を下回って戻るとショートが終了します。
    • CCI が +Extreme を下回るか、-Extreme を下回るとロングは終了します。 これらのルールは、MQL 信号クラスの LongCondition および ShortCondition 内の 40 投票ブランチを反映しています。
  • リスク管理 – この戦略では、発信者に保護的な停止を残します。 StockSharp の StartProtection と互換性があります ストップロスまたはテイクプロフィットを外部からアタッチする必要がある場合のヘルパー。

パラメーター

パラメータ 説明 デフォルト
CandleType ソースローソク足のタイムフレーム。 30分の時間枠
CciPeriod 商品チャネルインデックスの長さ。 18
AverageBodyPeriod パターン検証のために平均身体サイズを計算するために使用されるキャンドルの数。 3
LongEntryCciLevel 強気のミーティングラインを裏付ける売られ過ぎのレベル。 −50
ShortEntryCciLevel 弱気のミーティングラインを裏付ける買われ過ぎのレベル。 +50
ExtremeCciLevel CCI 出口クロスオーバーの絶対極端な帯域。 80

すべての数値パラメータは、EA のデフォルトと同じオプティマイザ範囲を公開するため、StockSharp を通じて戦略を調整できます。 最適化ツール。

使用上の注意

  1. 戦略を証券にアタッチし、開始する前に目的の Volume を設定します。
  2. 必要に応じて、元の資金管理プロファイルに一致させるか、感度を調整するために、しきい値を微調整します。
  3. チャートの統合により、ローソク足、CCI 曲線、および実行された取引が描画され、パターン検出を視覚的に迅速に検証できます。

同じローソク足と CCI の組み合わせに焦点を当てることで、この StockSharp 実装はエキスパートの忠実な移植を実現します。 推奨される高レベルの API スタイルを維持しながらアドバイザーを行います。

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;
	}
}