GitHub で見る

AML RSI 会議ライン戦略

概要

AML RSI ミーティング ライン戦略は、MetaTrader 5 エキスパート アドバイザー Expert_AML_RSI.mq5 の StockSharp 移植版です。オリジナルのシステムは、日本のローソク足パターン認識と相対力指数 (RSI) を組み合わせて、強気と弱気の「ミーティング ライン」の反転を取引します。この変換では、コア取引ロジックを維持しながら、ローソク足サブスクリプションと組み込みインジケーターを備えた StockSharp の高レベルの API に適応させます。

取引ロジック

  • 構成可能なキャンドル タイプをサブスクライブし、完成したキャンドルのみを処理します。
  • ローソク本体のサイズの単純移動平均を計算して、ミーティング ライン パターンを形成する「長い」ローソクを検出します。
  • 確認シグナルと終了シグナルとして、最も最近完了した 2 つのローソク足の RSI 値を追跡します。
  • 強気のセットアップ: RSI が強気の閾値を下回る 2 本バーのミーティング ラインの反転はロングエントリーをトリガーします。
  • 弱気のセットアップ: 弱気の閾値を上回る RSI のミラーリングされたパターンは、ショートエントリーをトリガーします。
  • ポジションのエグジット: 設定可能な下位レベルと上位レベルを介した RSI クロスオーバーにより、反対方向のオープン取引が終了します。
  • BuyMarketSellMarket、および ClosePosition ヘルパーを使用して露出を管理し、逆の信号が現れたときに位置サイズを自動的に反転します。

パラメーター

名前 説明 デフォルト
CandleType ローソク足パターンを評価するために使用される時間枠。 1時間枠
RsiPeriod RSI ルックバックの長さ。 11
BodyAveragePeriod 平均的な身体サイズに応じたキャンドルの数。 3
BullishRsiLevel 強気のミーティングラインを検証する最大値 RSI。 40
BearishRsiLevel 弱気のミーティングラインを検証する最小値 RSI。 60
LowerExitLevel RSI レベルは上向きのクロスでショートをクローズします。 30
UpperExitLevel 下向きクロスでロングを決済する RSI レベル。 70

すべてのパラメータは StrategyParam<T> オブジェクトとして公開されるため、StockSharp デザイナーで最適化できます。

リスク管理

  • StartProtection()OnStarted で呼び出され、フレームワークの組み込み位置モニタリングを有効にします。
  • この戦略では、RSI が設定された出口境界を越えるたびに、新しいシグナルを検討する前に既存のエクスポージャをクローズします。
  • 成行注文は、現在のエクスポージャーの絶対値を構成されたボリュームに追加することにより、ポジションを自動的に反転します。

変換メモ

  • ローソク足の平均化では、絶対的なローソク足を供給された SimpleMovingAverage を使用し、MQL5 ソースからの AvgBody ヘルパーをミラーリングします。
  • RSI の確認は、前の 2 つのローソク足の値に依存し、元の専門家からの RSI(1)RSI(2) のチェックを再現します。
  • コード内のすべてのコメントは英語で書き直され、その構造は、タブ インデントを使用したファイル スコープの名前空間のリポジトリ要件に従っています。

使用法

  1. StockSharp の証券に戦略をアタッチし、目的のローソクのタイプを選択します。
  2. 取引会場または金融商品のボラティリティに合わせて、RSI と終了しきい値を設定します。
  3. ライブ取引または最適化に移行する前に、最初にペーパー取引で戦略を実行してパターン認識を検証します。
  4. 最適化中に提供されたパラメーターを使用して、さまざまな市場に合わせて RSI レベルと平均体長を微調整します。

免責事項

この戦略は教育目的のみに提供されています。稼働中の資本に導入する前に、過去のデータとシミュレートされた環境で徹底的にテストします。

namespace StockSharp.Samples.Strategies;

using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;

/// <summary>
/// Meeting Lines + RSI strategy.
/// Buys on bullish meeting lines with low RSI, sells on bearish meeting lines with high RSI.
/// </summary>
public class AmlRsiMeetingLinesStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<decimal> _rsiLow;
	private readonly StrategyParam<decimal> _rsiHigh;

	private ICandleMessage _prevCandle;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
	public decimal RsiLow { get => _rsiLow.Value; set => _rsiLow.Value = value; }
	public decimal RsiHigh { get => _rsiHigh.Value; set => _rsiHigh.Value = value; }

	public AmlRsiMeetingLinesStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_rsiPeriod = Param(nameof(RsiPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("RSI Period", "RSI period", "Indicators");
		_rsiLow = Param(nameof(RsiLow), 40m)
			.SetDisplay("RSI Low", "RSI level for bullish entry", "Signals");
		_rsiHigh = Param(nameof(RsiHigh), 60m)
			.SetDisplay("RSI High", "RSI 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 rsi = new RelativeStrengthIndex { Length = RsiPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(rsi, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal rsiValue)
	{
		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;

				if (prevBearish && currBullish && closesNear && rsiValue < RsiLow && 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;

				if (prevBullish && currBearish && closesNear2 && rsiValue > RsiHigh && Position >= 0)
					SellMarket();
			}
		}

		_prevCandle = candle;
	}
}