GitHub で見る

XRSI ヒストグラム Vol ダイレクト戦略

概要

  • 元のソース: Exp_XRSI_Histogram_Vol_Direct.mq5
  • 変換プラットフォーム: StockSharp C# 高レベル戦略API
  • アイデア: 平滑化されたボリューム加重RSIヒストグラムが傾きを変えたときのリバーサルを取引する
  • データ: 単一証券、単一時間軸(デフォルトH4)

戦略はRSI値にボリュームを乗算して構築されたカスタムオシレーターを評価します。この平滑化されたオシレーターの傾きが変わると、戦略はポジションを反転させるか、反対方向で新しいトレードを開きます。ロジックは最後の2つの完成したキャンドルの傾き方向を追跡することで、元のエキスパートアドバイザーのカラーバッファーアプローチを複製します。

インジケータースタックと計算

  1. RSIRsiPeriod)は選択したキャンドルシリーズで計算され、50を引くことでゼロを中心に配置されます。
  2. ボリューム選択Use Tick Volumeパラメーターによって制御され、ティックカウントまたは取引ボリュームのいずれかを使用します。
  3. ボリューム加重オシレーターは中心化されたRSIに選択したボリュームを乗算し、より高い活動と一致するスイングを拡大します。
  4. 平滑化SmoothLength期間の選択した移動平均(SMAEMASMMAWMA)をオシレーターと生ボリュームストリームの両方に適用します。両方の平滑化値が形成された後にのみインジケーターは準備完了とみなされます。
  5. 傾き検出は現在の平滑化オシレーター値と前の値を比較します:
    • より高い値 → 傾き色0(上昇)
    • より低い値 → 傾き色1(下降)
    • フラット → 前の色を維持

パラメーター

名前 デフォルト 説明
Candle Type H4 時間軸 ターゲットキャンドルサブスクリプション。
RSI Period 14 RSI計算のルックバック期間。
Smoothing Length 12 オシレーターとボリュームの両方に適用される移動平均の期間。
Smoothing Method SMA 移動平均タイプ(SMAEMASMMAWMA)。
Use Tick Volume true ティックカウント(true)または取引ボリューム(false)を使用。
Allow Buy Open true ロングポジションのオープンを有効にする。
Allow Sell Open true ショートポジションのオープンを有効にする。
Allow Buy Close true 反対シグナルでロングポジションのクローズを許可する。
Allow Sell Close true 反対シグナルでショートポジションのクローズを許可する。

注意: 元のMQLインジケーターとは異なり、JJMAやVIDYAのような高度なスムーザーはStockSharpフレームワークでは利用できません。そのため戦略は最も近い組み込みの代替を公開します。

取引ルール

  1. 両方の平滑化インジケーターが十分なデータを持つまで待つ。
  2. 最後の2つの完成したキャンドルの傾き色を決定する。
  3. 古い色が上昇(0)の場合:
    • 許可されていればオープンなショートポジションをクローズする。
    • 最新の色が下降(1)でロングエントリーが許可されている場合、ロングポジションを開く(EAのリバーサルロジックを反映)。
  4. 古い色が下降(1)の場合:
    • 許可されていればオープンなロングポジションをクローズする。
    • 最新の色が上昇(0)でショートエントリーが許可されている場合、ショートポジションを開く。

戦略はヒストグラムの傾きの「色フリップ」を効果的に取引し、最新の完成したキャンドルのクローズで実行します。

実用的なヒント

  • ロジックは選択した時間軸に対して感度があります。元のEAの動作に合わせるためにいくつかの間隔をテストしてください。
  • 傾き方向のみが使用されるため、StartProtectionを通じてストップロスまたはテイクプロフィットを追加するとライブ取引でのリスク制御が改善されます。
  • ポートを検証する際にStockSharpのオシレーター傾きを元のMT5インジケーターと比較するためにターミナルのチャートビジュアライゼーションを使用してください。

MQLバージョンとの違い

  • 資金管理ヘルパー(TradeAlgorithms.mqh)はポートされていません;StockSharp実装は基本戦略ボリュームに依存します。
  • StockSharpがサポートする平滑化メソッドのみが公開されています。非対応モードはSMAの動作にデフォルトします。
  • 完成したキャンドルで即座に注文が送られるため、明示的な時間シフト(SignalBar / TimeShiftSec)は不要です。
  • 保護ストップはハードコードされていません;ユーザーは必要に応じてStartProtectionを通じてそれらを追加できます。

制限

  • オシレーターの振幅を正しく再現するためにティックカウントまたはボリューム合計のいずれかを提供するキャンドルソースが必要です。
  • 戦略はカスタムヒストグラム自体を描画しません;取引ロジックとRSIのオプションのチャートオーバーレイに焦点を当てています。
using System;
using System.Collections.Generic;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// XRSI Histogram Vol Direct strategy. Uses RSI 50-line crossover.
/// </summary>
public class XrsiHistogramVolDirectStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiPeriod;
	private decimal? _prevRsi;

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

	public XrsiHistogramVolDirectStrategy()
	{
		_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");
	}

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

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

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

	private void ProcessCandle(ICandleMessage candle, decimal rsiVal)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!IsFormedAndOnlineAndAllowTrading()) { _prevRsi = rsiVal; return; }
		if (_prevRsi == null) { _prevRsi = rsiVal; return; }
		if (_prevRsi.Value < 45m && rsiVal >= 55m && Position <= 0) { if (Position < 0) BuyMarket(); BuyMarket(); }
		else if (_prevRsi.Value > 55m && rsiVal <= 45m && Position >= 0) { if (Position > 0) SellMarket(); SellMarket(); }
		_prevRsi = rsiVal;
	}
}