1. iRSI関数の概要と実務での活用法
RSI(相対力指数)は、相場の「買われすぎ」「売られすぎ」を判断するテクニカル指標として、世界中のトレーダーに愛用されています。MQL5のiRSI関数は、このRSIの値を計算するための「インジケーターハンドル」を作成する非常に重要な関数です。
実務開発において、初心者が最もつまずきやすいポイントは、「iRSI関数を呼んだだけではRSIの値は取得できない」という点です。MQL4では関数を呼べば即座に数値が返ってきましたが、MQL5では「計算の予約票(ハンドル)」を受け取り、その後CopyBuffer関数を使って実際の数値を取り出すという2段階の手順が必要になります。
クオンツ開発の現場では、単なる逆張り指標としてだけでなく、RSIの「ダイバージェンス(逆行現象)」の検知や、複数時間足(マルチタイムフレーム)でのトレンドフィルターとして多用されます。計算負荷が比較的軽いため、大量の通貨ペアを監視するスキャルピングEAなどにも適しています。
2. 構文と戻り値
iRSI関数の基本的な構文は以下の通りです。
int iRSI(
string symbol, // 通貨ペア(NULLで現在のペア)
ENUM_TIMEFRAMES period, // 時間足(0またはPERIOD_CURRENTで現在の足)
int ma_period, // RSIの計算期間(一般的には14)
ENUM_APPLIED_PRICE applied_price // 適用価格(一般的にはPRICE_CLOSE)
);
戻り値
- 成功した場合:作成されたインジケーターのハンドル(整数値)を返します。
- 失敗した場合:
INVALID_HANDLEを返します。
このハンドルは、EAが稼働している間、特定のRSI計算設定を識別するための「IDカード」のような役割を果たします。
3. 具体的な使い方・実践サンプルコード
以下に、iRSIを使用して「70以上で売り、30以下で買い」というロジックの基礎となるEAコードを示します。
//+------------------------------------------------------------------+
//| RSI_Sample_EA.mq5 |
//+------------------------------------------------------------------+
#property strict
// 入力パラメーター
input int RSI_Period = 14; // RSIの期間
input double RSI_Upper = 70.0; // 売り基準
input double RSI_Lower = 30.0; // 買い基準
// グローバル変数
int rsiHandle; // RSIのハンドルを格納する変数
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1. RSIハンドルの作成(初期化時に一度だけ行う)
rsiHandle = iRSI(_Symbol, _Period, RSI_Period, PRICE_CLOSE);
if(rsiHandle == INVALID_HANDLE)
{
Print("RSIハンドルの作成に失敗しました。");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// ハンドルの解放(メモリのクリーンアップ)
IndicatorRelease(rsiHandle);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double rsiValues[]; // 値を格納する動的配列
ArraySetAsSeries(rsiValues, true); // 配列を時系列順(インデックス0が最新)に設定
// 2. ハンドルを使って最新のRSI値を配列にコピーする
// 第2引数の0はバッファ番号(RSIは0のみ)、第3引数は開始位置、第4引数は個数
if(CopyBuffer(rsiHandle, 0, 0, 2, rsiValues) < 0)
{
Print("RSIデータのコピーに失敗しました。");
return;
}
double currentRsi = rsiValues[0]; // 最新のRSI値
// 3. ロジック判定
if(currentRsi >= RSI_Upper)
{
Comment("RSI: ", currentRsi, " [買われすぎ] - 売り検討");
}
else if(currentRsi <= RSI_Lower)
{
Comment("RSI: ", currentRsi, " [売られすぎ] - 買い検討");
}
else
{
Comment("RSI: ", currentRsi);
}
}
4. 使用上の注意点とよくあるエラー
- ハンドルの作成場所:
iRSIは必ずOnInit内で呼び出すようにしてください。OnTick内で毎回呼び出すと、新しい計算オブジェクトがティックのたびに生成され、メモリを食いつぶしてPCやサーバーがフリーズする原因になります。 - 時系列の設定:
CopyBufferで取得した配列は、デフォルトでは「古い順」に並んでいることがあります。ArraySetAsSeries(array, true)を忘れると、最新の値(インデックス0)を取得したつもりが、最も古い値を見ていたというバグが発生します。 - データ不足の確認: MT5を起動した直後などは、ヒストリカルデータが準備できておらず
CopyBufferが失敗することがあります。戻り値をチェックし、エラー処理を記述することが安定稼働への近道です。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジック以上に収益を左右するのが「実行環境」です。どれほど精緻なRSIロジックを組み上げたとしても、自宅のPCや一般的な光回線で運用している場合、物理的な距離に起因するネットワーク遅延(レイテンシ)は避けられません。FXの価格はミリ秒単位で変動しており、あなたのPCが「今だ!」と判断して注文を出してから、証券会社のサーバーに届くまでの間に価格が滑ってしまう(スリッページが発生する)ことは日常茶飯事です。
このわずかな遅延が、スキャルピングやデイトレードにおいては致命的な損失、あるいは利益の圧迫を招きます。プロのクオンツエンジニアが、証券会社のサーバーに近いデータセンターに設置された「専用VPS」を利用するのは、もはやマナーと言っても過言ではありません。24時間365日の安定稼働はもちろん、約定スピードを極限まで高めてスリッページを最小限に抑えることが、シストレで生き残るための最低条件です。本気で利益を追求するのであれば、トレード専用に最適化されたVPS環境への投資を惜しまないでください。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント