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のインジケーターは「①
MQL5のインジケーターは「①
OnInit() でハンドルを作る → ② OnTick() で CopyBuffer() により値を取り出す」の2段階です(詳しくは iMAの記事 を参照)。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)・スプレッド確認・資金管理は入っていません。実運用にはこれらの安全装置が必須です。まずはデモ口座で動きを確認してください。
損切り(SL)・利確(TP)・スプレッド確認・資金管理は入っていません。実運用にはこれらの安全装置が必須です。まずはデモ口座で動きを確認してください。
RSIを使うときの注意・落とし穴
① 強いトレンドでは逆張りが効かない
上昇が強いと、RSIは70以上に張り付いたまま価格が伸び続けます。「買われすぎ=即売り」は危険。上位足のトレンド(iMA 等)と組み合わせ、流れに逆らわない使い方が無難です。
上昇が強いと、RSIは70以上に張り付いたまま価格が伸び続けます。「買われすぎ=即売り」は危険。上位足のトレンド(iMA 等)と組み合わせ、流れに逆らわない使い方が無難です。
② 水準だけでなく「抜け」で見る
「30以下だから買い」ではなく「30を上抜けたら買い」のように、反発を確認してから動くとダマシを減らせます(サンプル③)。
「30以下だから買い」ではなく「30を上抜けたら買い」のように、反発を確認してから動くとダマシを減らせます(サンプル③)。
③ お決まりの3点
ハンドルは
ハンドルは
OnInit() で1回だけ/CopyBuffer() の戻り値を必ずチェック/ArraySetAsSeries(配列, true) を忘れない。これはどのインジでも共通です。まとめ
iRSI()はRSIのハンドルを返す。値はCopyBuffer()で取り出す(バッファ番号0)- 一般に 70以上=買われすぎ/30以下=売られすぎ。確定足で・新バー時のみ判定する
- 水準より「ラインを抜けた瞬間」をシグナルにするとダマシが減る
- 強いトレンドでは逆張りが連敗しやすい。上位足フィルターと併用する
- ハンドルはOnInitで1回・戻り値チェック・ArraySetAsSeries を忘れない

