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

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. 使用上の注意点とよくあるエラー

  1. ハンドルの作成場所: iRSIは必ずOnInit内で呼び出すようにしてください。OnTick内で毎回呼び出すと、新しい計算オブジェクトがティックのたびに生成され、メモリを食いつぶしてPCやサーバーがフリーズする原因になります。
  2. 時系列の設定: CopyBufferで取得した配列は、デフォルトでは「古い順」に並んでいることがあります。ArraySetAsSeries(array, true)を忘れると、最新の値(インデックス0)を取得したつもりが、最も古い値を見ていたというバグが発生します。
  3. データ不足の確認: MT5を起動した直後などは、ヒストリカルデータが準備できておらずCopyBufferが失敗することがあります。戻り値をチェックし、エラー処理を記述することが安定稼働への近道です。

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

アルゴリズムトレードにおいて、ロジック以上に収益を左右するのが「実行環境」です。どれほど精緻なRSIロジックを組み上げたとしても、自宅のPCや一般的な光回線で運用している場合、物理的な距離に起因するネットワーク遅延(レイテンシ)は避けられません。FXの価格はミリ秒単位で変動しており、あなたのPCが「今だ!」と判断して注文を出してから、証券会社のサーバーに届くまでの間に価格が滑ってしまう(スリッページが発生する)ことは日常茶飯事です。

このわずかな遅延が、スキャルピングやデイトレードにおいては致命的な損失、あるいは利益の圧迫を招きます。プロのクオンツエンジニアが、証券会社のサーバーに近いデータセンターに設置された「専用VPS」を利用するのは、もはやマナーと言っても過言ではありません。24時間365日の安定稼働はもちろん、約定スピードを極限まで高めてスリッページを最小限に抑えることが、シストレで生き残るための最低条件です。本気で利益を追求するのであれば、トレード専用に最適化されたVPS環境への投資を惜しまないでください。

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

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

コメント

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