【MQL5】iRVI関数の使い方と自動売買実装コード

1. iRVI関数の概要と実務での活用法

iRVI関数は、テクニカル指標であるRVI(Relative Vigor Index:相対活気指数)のハンドルを取得するための関数です。RVIは、現在の価格が「当日の値幅(高値-安値)に対してどの位置で引けたか」を平滑化して算出したオシレーターで、価格の上昇局面では終値が始値よりも高く、下落局面では低くなるという性質を利用しています。

実務での活用シーン

実務上、RVIは単体での過熱感(買われすぎ・売られすぎ)を測るよりも、「勢いの変化」を捉えるフィルターとして優秀です。
メイン線とシグナル線のゴールデンクロス・デッドクロスによるトレンド転換の判断。
– トレンド追随型ロジックにおいて、勢いが弱まったポイントでの早期エグジット判定。

開発者がつまずきやすい点

MQL5のiRVIは、MQL4のように「関数を呼べばその場の数値が返ってくる」ものではありません。「指標の計算設定(ハンドル)を作成するステップ」「計算された値を配列にコピーするステップ」の2段階が必要になる点が、初心者にとって最初の大きな壁となります。


2. 構文と戻り値

iRVI関数の構文は以下の通りです。

int iRVI(
   string           symbol,     // 通貨ペア名(NULLで現在のチャート)
   ENUM_TIMEFRAMES  period,     // 時間軸(0で現在の時間軸)
   int              ma_period   // 平均化の期間(一般的には10)
);

戻り値

  • 成功した場合:指標ハンドル(int型)を返します。
  • 失敗した場合:INVALID_HANDLEを返します。

インジケーターバッファの構成

CopyBuffer関数を使用して値を取得する際、以下のインジケーターバッファ番号を指定します。
0: RVI Main Line(メイン線)
1: RVI Signal Line(シグナル線)


3. 具体的な使い方・実践サンプルコード

以下は、iRVIを使って「メイン線がシグナル線を上抜けたら買い、下抜けたら売り」という簡易的な売買サインをログに出力するEAのサンプルです。

//+------------------------------------------------------------------+
//|                                              RVI_Sample_EA.mq5   |
//+------------------------------------------------------------------+
#property strict

// 入力パラメーター
input int InpRVI_Period = 10; // RVIの期間

// グローバル変数
int handleRVI; // RVIのハンドルを格納

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   // 1. RVI指標のハンドルを作成
   handleRVI = iRVI(_Symbol, _Period, InpRVI_Period);

   // ハンドルの取得に失敗した場合はエラー
   if(handleRVI == INVALID_HANDLE)
   {
      Print("RVIハンドルの作成に失敗しました。");
      return(INIT_FAILED);
   }

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double rviMain[], rviSignal[];

   // 時系列(最新がインデックス0)として扱う設定
   ArraySetAsSeries(rviMain, true);
   ArraySetAsSeries(rviSignal, true);

   // 2. 指標データを配列にコピー(最新2本分)
   if(CopyBuffer(handleRVI, 0, 0, 2, rviMain) < 2 || 
      CopyBuffer(handleRVI, 1, 0, 2, rviSignal) < 2)
   {
      Print("データのコピーに失敗しました。");
      return;
   }

   // 3. 売買ロジック(クロス確認)
   // 1本前(index:1)でクロスが発生したか判定
   bool isCrossUp = (rviMain[1] > rviSignal[1]) && (rviMain[2] < rviSignal[2]);
   bool isCrossDown = (rviMain[1] < rviSignal[1]) && (rviMain[2] > rviSignal[2]);

   if(isCrossUp)
   {
      Print("買いサイン:RVIメイン線がシグナル線を上抜けました。");
   }
   else if(isCrossDown)
   {
      Print("売りサイン:RVIメイン線がシグナル線を下抜けました。");
   }
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // 指標ハンドルの解放(メモリ管理)
   IndicatorRelease(handleRVI);
}

4. 使用上の注意点とよくあるエラー

  1. ハンドルの作成場所: iRVI関数は必ずOnInit内で1度だけ実行するようにしてください。OnTick内で毎回呼び出すと、新しいハンドルが無限に作成され、PCのメモリを急速に消費してMT5がフリーズする原因になります。
  2. 配列の時系列設定: CopyBufferで値を取得する前に、必ずArraySetAsSeriesを使って配列のインデックスをチャートと同じ(最新が0)にする必要があります。これを忘れると、過去のデータと最新のデータを取り違えて誤認トレードを引き起こします。
  3. 計算期間の不足: 稼働直後、ヒストリーデータが十分に読み込まれていない場合、CopyBufferがエラーを返すことがあります。戻り値を確認する処理(サンプルコード参照)を必ず含めましょう。

5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムトレードにおいて、ロジックの優位性と同じ、あるいはそれ以上に重要なのが「実行環境のレイテンシ(通信遅延)」です。自宅のPCや一般的なWi-Fi環境でEAを稼働させることは、プロのクオンツから見れば「目隠しをしてF1レースに参加する」ようなものです。

FX市場の価格はミリ秒単位で変動しており、証券会社のサーバーとの往復時間が数ミリ秒遅れるだけで、本来得られたはずの利益がスリッページによって削られ、トータル収支がマイナスに転落することは珍しくありません。特にRVIのようなオシレーターのクロスでエントリーする場合、一瞬の遅れが命取りになります。約定スピードを極限まで高め、物理的な距離による遅延を最小化するには、証券会社のデータセンターに近い場所に位置する自動売買専用のVPS(仮想専用サーバー)の利用が必須です。安定した電源、24時間の稼働保証、そして高速なバックボーンネットワーク。これらを備えた環境を構築して初めて、あなたのアルゴリズムは真のポテンシャルを発揮できるのです。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました