GitHub で見る

RSI & CCI ダイバージェンス戦略

概要

RSI & CCI ダイバージェンス戦略はMetaTraderのエキスパートアドバイザーRSI&CCI_DIVERGENCE.mq4(MQL ID 22266)を変換したものです。このシステムは価格の高値と2つのオシレーター(Commodity Channel IndexとRelative Strength Index)の間の弱気または強気のダイバージェンスを検索し、線形加重移動平均のトレンドフィルターでフィルタリングし、3つの異なる時間軸でのMACDアラインメントでシグナルを検証し、より高い時間軸のモメンタムオシレーターを使用してモメンタムの強さを確認します。オプションの絶対ストップロスとテイクプロフィットターゲットを適用して、オープンポジションを管理できます。

StockSharpの実装は高レベルAPIに焦点を当てています。インジケーターはローソク足サブスクリプションに直接バインドされ、すべての計算はインジケーター値の手動取得なしにストリーミングローソク足の更新によって駆動されます。

トレードロジック

  1. トレンドフィルター

    • プライマリ時間軸の高速と低速の線形加重移動平均(LWMA)が優勢な方向を定義します。
    • 強気のコンテキストは高速LWMAが低速LWMAの上にあることを要求します;弱気のコンテキストはその逆を要求します。
  2. ダイバージェンス検出

    • 最後にクローズされたローソク足が最大CandlesToRetraceの前のローソク足と比較されます。
    • 強気シグナルはCCIまたはRSIがより高い安値を作り、対応する前のローソク足が最後の高値より高い高値を示す場合に発生します(強気ダイバージェンス)。
    • 弱気シグナルはCCIまたはRSIがより低い高値を作り、対応する前のローソク足が最後の高値より低い高値を示す場合に発生します(弱気ダイバージェンス)。
  3. MACD確認

    • MACD(デフォルト12、26、9)がプライマリ、上位、マクロ時間軸で評価されます。
    • ロングトレードはすべての時間軸でMACDがシグナルラインの上にあることを要求します。
    • ショートトレードはすべての時間軸でMACDがシグナルラインの下にあることを要求します。
  4. モメンタム確認

    • モメンタムオシレーター(デフォルト長さ14)がより高い時間軸(デフォルト1時間)でサンプリングされます。
    • 最近のモメンタム読み取り値のニュートラル100レベルからの絶対偏差がトレードを承認するために設定された買い/売りしきい値を超える必要があります。
  5. 価格構造ガード

    • 戦略は元のEAの制約を模倣するために最近の高値/安値を確認します(ロングにはLow[2] < High[1]、ショートにはLow[1] < High[2])。
  6. 注文執行

    • すべてのフィルターが一致すると、戦略はベース戦略ボリュームに現在のポジションの絶対値を加えたボリュームでBuyMarketまたはSellMarketを使用してエントリーし、即時リバーサルを可能にします。
  7. リスク管理

    • オプションの絶対ストップロスとテイクプロフィット距離が完成した各ローソク足で評価されます。
    • 設定されている場合、戦略はストップまたはターゲットが触れられたときにポジションをフラットにするためにサイズされた成行注文を送信します。

パラメータ

名前 デフォルト値 説明
FastMaLength 6 高速LWMAトレンドフィルターの期間。
SlowMaLength 85 低速LWMAトレンドフィルターの期間。
CciLength 14 Commodity Channel Indexのルックバック。
RsiLength 14 Relative Strength Indexのルックバック。
CandlesToRetrace 10 ダイバージェンス検出に使用する完成したローソク足の数。
MacdFastPeriod 12 MACD計算の高速移動平均期間。
MacdSlowPeriod 26 MACD計算の低速移動平均期間。
MacdSignalPeriod 9 MACDのシグナルライン期間。
MomentumLength 14 上位時間軸のモメンタムオシレーターの長さ。
MomentumBuyThreshold 0.3 強気モメンタム確認のための100からの最小絶対偏差。
MomentumSellThreshold 0.3 弱気モメンタム確認のための100からの最小絶対偏差。
StopLoss 0 オプションのストップロスの絶対価格距離(0でストップを無効)。
TakeProfit 0 オプションのテイクプロフィットの絶対価格距離(0でターゲットを無効)。
CandleType 15分時間軸 ダイバージェンスとトレンド分析のプライマリローソク足タイプ。
MomentumCandleType 1時間時間軸 モメンタム確認に使用するローソク足タイプ。
HigherMacdCandleType 1時間時間軸 MACD確認のための二次時間軸。
MacroMacdCandleType 30日時間軸 MACD確認のためのマクロ時間軸(インストゥルメントのデータ可用性に合わせて調整)。

使用上の注意事項

  • 参照されているすべての時間軸がデータプロバイダーから利用可能であることを確認してください;それ以外の場合は、ローソク足タイプパラメーターを適宜調整してください。
  • デフォルトのストップロスとテイクプロフィットの値は、リスクがトレーリングと純資産ストップを通じて管理された元のEAの動作を反映するために無効になっています。ハードストップを有効にするには正の10進数値を設定してください。
  • モメンタム確認は値を100のベースラインと比較するため、StockSharpのMomentumインジケーターがクラシックな定義(100 * Close / Close[N])を使用することを前提としています。異なる正規化が好まれる場合は、インストゥルメントのボラティリティに合わせてしきい値を調整してください。
  • 戦略はエントリーとエグジットの両方に成行注文を送信し、ソースエキスパートアドバイザーの即時実行ロジックを反映します。

変換に関する注意事項

  • 変換はStockSharpの高レベルインジケーターバインディングを使用します。GetValueへの手動呼び出しは不要です;インジケーター値はバインディングコールバックによって提供されます。
  • 純資産ベースのストップ管理、トレーリングロジック、MQLソースからのメール/通知機能はポートされません。代わりに、プライマリシグナル生成と基本的なストップ/ターゲット処理に焦点が当てられています。
  • ダイバージェンス検出はパターン認識に必要な最近の価格とインジケーター履歴を維持するために軽量なリストを使用して実装されています。
using System;
using System.Collections.Generic;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

public class RsiCciDivergenceStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<int> _cciPeriod;
	private decimal? _prevRsi, _prevCci;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
	public int CciPeriod { get => _cciPeriod.Value; set => _cciPeriod.Value = value; }

	public RsiCciDivergenceStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame()).SetDisplay("Candle Type", "Timeframe", "General");
		_rsiPeriod = Param(nameof(RsiPeriod), 14).SetGreaterThanZero().SetDisplay("RSI Period", "RSI lookback", "Indicators");
		_cciPeriod = Param(nameof(CciPeriod), 14).SetGreaterThanZero().SetDisplay("CCI Period", "CCI lookback", "Indicators");
	}

	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevRsi = null;
		_prevCci = null;
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevRsi = null; _prevCci = null;
		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
		var cci = new CommodityChannelIndex { Length = CciPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(rsi, cci, ProcessCandle).Start();
		var area = CreateChartArea();
		if (area != null) { DrawCandles(area, subscription); DrawOwnTrades(area); }
	}

	private void ProcessCandle(ICandleMessage candle, decimal rsiVal, decimal cciVal)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!IsFormedAndOnlineAndAllowTrading()) { _prevRsi = rsiVal; _prevCci = cciVal; return; }
		if (_prevRsi == null || _prevCci == null) { _prevRsi = rsiVal; _prevCci = cciVal; return; }
		var buySignal = (_prevRsi.Value < 30m && rsiVal >= 30m) || (_prevCci.Value < -100m && cciVal >= -100m);
		var sellSignal = (_prevRsi.Value > 70m && rsiVal <= 70m) || (_prevCci.Value > 100m && cciVal <= 100m);
		_prevRsi = rsiVal; _prevCci = cciVal;
		if (buySignal && Position <= 0) { if (Position < 0) BuyMarket(); BuyMarket(); }
		else if (sellSignal && Position >= 0) { if (Position > 0) SellMarket(); SellMarket(); }
	}
}