【MQL5】iRSI関数の使い方|RSIで買われすぎ・売られすぎを判定するサンプルコード

【MQL5】iRSI関数の使い方|RSIで買われすぎ・売られすぎを判定するサンプルコード MQL5リファレンス

iRSI関数は、RSI(相対力指数)の値をMQL5プログラムから取得する関数です。RSIは「買われすぎ・売られすぎ」を 0〜100 の数値で表す、逆張り系の定番指標。この記事では、iRSIの構文と「ハンドル+CopyBufferの2段階」の使い方、そしてコピーしてすぐ動く4つのサンプル(現在値の取得・売られすぎ/買われすぎ判定・30/70ライン抜けのシグナル・RSI逆張りの最小EA)を、丁寧に解説します。

iRSI(RSI)とは

RSIは、一定期間の値動きのうち「上昇分の割合」を 0〜100 で表した指標です。一般に 70以上で買われすぎ・30以下で売られすぎと判断し、行きすぎた価格の反発(逆張り)を狙うのに使われます。MQL5では iRSI() でこの値を取得し、EAの条件に組み込めます。

前提:値の取り出しは「2段階」
MQL5のインジケーターは「① OnInit() でハンドルを作る → ② OnTick()CopyBuffer() により値を取り出す」の2段階です(詳しくは iMAの記事 を参照)。iRSIも同じ作法で使います。
iRSI() の構文と引数

iRSI() の構文と引数

int  iRSI(
   string              symbol,          // 通貨ペア(_Symbol で現在のペア)
   ENUM_TIMEFRAMES     period,          // 時間足(PERIOD_CURRENT 等)
   int                 ma_period,       // 期間(一般的に 14)
   ENUM_APPLIED_PRICE  applied_price    // 適用価格(通常 PRICE_CLOSE)
);

戻り値はハンドル(整数のID)です。RSIの値そのものではなく、後で CopyBuffer() に渡すための「取っ手」だと考えてください。RSIのバッファ番号は 0 です。

サンプル①:現在のRSI値を取得して表示する

RSI(14) の現在値をチャート左上に表示する、最小のコードです。

コピペOK

int rsiHandle = INVALID_HANDLE;

int OnInit()
{
   // ① ハンドルを1回だけ作る(期間14・終値ベース)
   rsiHandle = iRSI(_Symbol, PERIOD_CURRENT, 14, PRICE_CLOSE);
   if(rsiHandle == INVALID_HANDLE)
   {
      Print("iRSIハンドルの作成に失敗: ", GetLastError());
      return(INIT_FAILED);
   }
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   double rsi[];
   ArraySetAsSeries(rsi, true);              // [0]を最新足にそろえる

   // ② 最新2本ぶんを取り出す。取得できなければ何もしない
   if(CopyBuffer(rsiHandle, 0, 0, 2, rsi) < 2) return;

   Comment("RSI(14) = ", DoubleToString(rsi[0], 1));   // 例:RSI(14) = 62.3
}

void OnDeinit(const int reason)
{
   IndicatorRelease(rsiHandle);              // 後始末
}

サンプル②:売られすぎ・買われすぎを判定する

確定した足のRSIで「売られすぎ(30以下)/買われすぎ(70以上)」を判定します。形成中の足ではなく確定足で、新しい足ができた時だけチェックします。

コピペOK

input double InpOver  = 70.0;   // 買われすぎ ライン
input double InpUnder = 30.0;   // 売られすぎ ライン
datetime lastBar = 0;

void OnTick()
{
   datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
   if(t == lastBar) return;                  // 新しい足の時だけ
   lastBar = t;

   double rsi[];
   ArraySetAsSeries(rsi, true);
   if(CopyBuffer(rsiHandle, 0, 0, 2, rsi) < 2) return;

   double v = rsi[1];                         // 直近の確定足のRSI
   if(v <= InpUnder)      Print("売られすぎ:", DoubleToString(v, 1));
   else if(v >= InpOver)  Print("買われすぎ:", DoubleToString(v, 1));
}

サンプル③:30 / 70 ラインの「抜け」でシグナルを出す

RSIの水準だけで入ると、強いトレンドで張り付いたときに連敗します。そこで「RSIが30を下から上に抜けた=売られすぎからの反発」のように、ラインをまたいだ瞬間をシグナルにします。確定足の [1] と [2] を比較します。

コピペOK

double rsi[];
ArraySetAsSeries(rsi, true);
if(CopyBuffer(rsiHandle, 0, 0, 3, rsi) < 3) return;  // [1]=直近確定足, [2]=その1本前

// 30を下から上へ抜けた=買いシグナル(売られすぎからの反発)
bool buySignal  = (rsi[2] <= 30.0 && rsi[1] > 30.0);

// 70を上から下へ抜けた=売りシグナル(買われすぎからの反落)
bool sellSignal = (rsi[2] >= 70.0 && rsi[1] < 70.0);

if(buySignal)  Print("買いシグナル(RSIが30を上抜け)");
if(sellSignal) Print("売りシグナル(RSIが70を下抜け)");

サンプル④:RSI逆張りで売買する最小EA

サンプル③の買いシグナルでエントリーし、RSIが50に戻ったら決済する、動く最小EAです。CTrade を使います。

コピペOK(デモ口座で動作確認用)

#include <Trade\Trade.mqh>
CTrade   trade;
int      rsiHandle;
datetime lastBar = 0;
input double InpLot = 0.10;

int OnInit()
{
   rsiHandle = iRSI(_Symbol, PERIOD_CURRENT, 14, PRICE_CLOSE);
   if(rsiHandle == INVALID_HANDLE) return(INIT_FAILED);
   trade.SetExpertMagicNumber(20260618);
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
   if(t == lastBar) return;
   lastBar = t;

   double rsi[];
   ArraySetAsSeries(rsi, true);
   if(CopyBuffer(rsiHandle, 0, 0, 3, rsi) < 3) return;

   bool buySignal = (rsi[2] <= 30.0 && rsi[1] > 30.0); // 売られすぎからの反発
   bool exitLong  = (rsi[1] >= 50.0);                  // 50まで戻ったら利確(簡易)

   if(buySignal && PositionsTotal() == 0)
      trade.Buy(InpLot, _Symbol);

   if(exitLong)
   {
      for(int i = PositionsTotal() - 1; i >= 0; i--)
      {
         ulong ticket = PositionGetTicket(i);
         if(PositionSelectByTicket(ticket) &&
            PositionGetString(POSITION_SYMBOL) == _Symbol)
            trade.PositionClose(ticket);
      }
   }
}

void OnDeinit(const int reason)
{
   IndicatorRelease(rsiHandle);
}
これは学習用の最小サンプルです
損切り(SL)・利確(TP)・スプレッド確認・資金管理は入っていません。実運用にはこれらの安全装置が必須です。まずはデモ口座で動きを確認してください。

RSIを使うときの注意・落とし穴

① 強いトレンドでは逆張りが効かない
上昇が強いと、RSIは70以上に張り付いたまま価格が伸び続けます。「買われすぎ=即売り」は危険。上位足のトレンドiMA 等)と組み合わせ、流れに逆らわない使い方が無難です。
② 水準だけでなく「抜け」で見る
「30以下だから買い」ではなく「30を上抜けたら買い」のように、反発を確認してから動くとダマシを減らせます(サンプル③)。
③ お決まりの3点
ハンドルは OnInit() で1回だけ/CopyBuffer() の戻り値を必ずチェック/ArraySetAsSeries(配列, true) を忘れない。これはどのインジでも共通です。

まとめ

  • iRSI() はRSIのハンドルを返す。値は CopyBuffer() で取り出す(バッファ番号0)
  • 一般に 70以上=買われすぎ/30以下=売られすぎ。確定足で・新バー時のみ判定する
  • 水準より「ラインを抜けた瞬間」をシグナルにするとダマシが減る
  • 強いトレンドでは逆張りが連敗しやすい。上位足フィルターと併用する
  • ハンドルはOnInitで1回・戻り値チェック・ArraySetAsSeries を忘れない
タイトルとURLをコピーしました