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. 使用上の注意点とよくあるエラー
- ハンドルの作成場所:
iRVI関数は必ずOnInit内で1度だけ実行するようにしてください。OnTick内で毎回呼び出すと、新しいハンドルが無限に作成され、PCのメモリを急速に消費してMT5がフリーズする原因になります。 - 配列の時系列設定:
CopyBufferで値を取得する前に、必ずArraySetAsSeriesを使って配列のインデックスをチャートと同じ(最新が0)にする必要があります。これを忘れると、過去のデータと最新のデータを取り違えて誤認トレードを引き起こします。 - 計算期間の不足: 稼働直後、ヒストリーデータが十分に読み込まれていない場合、
CopyBufferがエラーを返すことがあります。戻り値を確認する処理(サンプルコード参照)を必ず含めましょう。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックの優位性と同じ、あるいはそれ以上に重要なのが「実行環境のレイテンシ(通信遅延)」です。自宅のPCや一般的なWi-Fi環境でEAを稼働させることは、プロのクオンツから見れば「目隠しをしてF1レースに参加する」ようなものです。
FX市場の価格はミリ秒単位で変動しており、証券会社のサーバーとの往復時間が数ミリ秒遅れるだけで、本来得られたはずの利益がスリッページによって削られ、トータル収支がマイナスに転落することは珍しくありません。特にRVIのようなオシレーターのクロスでエントリーする場合、一瞬の遅れが命取りになります。約定スピードを極限まで高め、物理的な距離による遅延を最小化するには、証券会社のデータセンターに近い場所に位置する自動売買専用のVPS(仮想専用サーバー)の利用が必須です。安定した電源、24時間の稼働保証、そして高速なバックボーンネットワーク。これらを備えた環境を構築して初めて、あなたのアルゴリズムは真のポテンシャルを発揮できるのです。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント