MQL講座(連載企画)の第2回目となります!
今回は、「RSI」を使用した勝率期待値が高いサインツールの作り方になります。
サインツールの作成が初めてという方は、以下の記事を読んでから見ていただけると更に分かり易いです。
目次
RSIとは
RSI(相対力指数、Relative Strength Index)は、株式やその他の金融商品の価格の動きを評価するために使用されるテクニカル分析の指標です。
1978年にJ. Welles Wilderによって開発されたRSIは、価格の上昇と下降の速度を比較することで、買われ過ぎや売られ過ぎの状態を示します。具体的には、RSIは一定期間(通常は14期間)の価格変動を基に計算され、0から100の範囲で示されます。
RSIの計算は、特定の期間内の平均的な上昇と平均的な下降の比率を用いて行われます。計算式は以下のようになります: RSI = 100 – (100 / (1 + RS)) ここで、RS(Relative Strength)は平均的な上昇値を平均的な下降値で割ったものです。この計算によって、RSIは上昇の強さと下降の強さを比較し、その結果を指数として表します。

RSIの値が70以上の場合、通常は「買われ過ぎ」と見なされ、この状態は価格が過剰に上昇している可能性を示唆します。一方、RSIが30以下の場合は「売られ過ぎ」と見なされ、価格が過剰に下降している可能性を示します。これらの閾値を用いることで、投資家は潜在的な反転ポイントを見つけることができます。
RSIは単独で使用されることもありますが、他のテクニカル指標と組み合わせて使用することで、より確実な取引シグナルを得ることができます。例えば、移動平均線やMACD(移動平均収束乖離)などと併用することで、RSIのシグナルの信頼性を高めることができます。
さらに、RSIはダイバージェンス(乖離)を検出するためにも使用されます。価格が新高値や新安値を更新しているにもかかわらず、RSIがそれに追従していない場合、これは価格の反転が近いことを示す可能性があります。このようなダイバージェンスは、特にトレンドの変化を予測する際に有用です。
RSIをサインツールに組み込む方法
RSIをサインツールに組み込む方法ですが、【iRSI】という関数を使用します。
【iRSI】の関数をMQLのソースプログラムから呼び出すことで、RSIの値を取得することができます。
iRSIの使い方
// iRSIの関数定義 double iRSI( string symbol, // 通貨ペア int timeframe, // 時間軸 int period, // 平均期間 int applied_price, // 適用価格 int shift // シフト );
使い方は、以下のような感じです。
double iResultRSI = iRSI(NULL,0,14,PRICE_CLOSE,0);
iResultRSI には、通貨ペア、時間軸は現在表示されているものを対象に、平均期間は一般的な14、適用価格は「PRICE_CLOSE」の設定で、最新のローソク足の情報が設定されます。

iRSIのパラメーターである「period」は、赤枠の期間を指定。「applied_price」は赤枠の適用価格の種類を指定するものです。
RSIを使用したサインツール
RSIを使用したサインツールの作り方を、2つのサンプルを使用して説明します。
- 単純なRSIの上限/下限でサイン表示
- 最新+1つ前のRSIの値でサイン表示
単純なRSIの上限/下限でサイン表示するもの
単純なRSIの上限/下限でサイン表示するサインツールのサンプルコードを記載します。
XXX.mq4(XXXの名前は何でも良い)を作成し、サンプルコードをコピーして貼り付けた後、コンパイルの実行をお願いします。
コンパイルの手順が分からいない方は、以下の記事を参照してください。
#property indicator_chart_window #property indicator_buffers 2 extern int RSI_Period= 14; extern double RSI_High = 70.0; extern double RSI_Low = 30.0; double DrawReverseLowBuffer[]; double DrawReverseHighBuffer[]; int init() { SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,clrMagenta); SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,clrRed); SetIndexArrow(0,234); SetIndexArrow(1,233); SetIndexBuffer(0,DrawReverseLowBuffer); SetIndexBuffer(1,DrawReverseHighBuffer); return(INIT_SUCCEEDED); } int start() { int counted_bars=IndicatorCounted(); int limit = Bars - counted_bars; double iResultRSI; for (int i=limit-1;i>=0;i--){ if(i == 0){ DrawReverseLowBuffer[i] = EMPTY_VALUE; DrawReverseHighBuffer[i] = EMPTY_VALUE; } iResultRSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i); if(iResultRSI >= RSI_High){ DrawReverseLowBuffer[i]=High[i]; } else if(iResultRSI <= RSI_Low){ DrawReverseHighBuffer[i]=Low[i]; } } return(0); }
実行結果のイメージ

比較的サイン数は多いですが、騙しも多いことが分かりますよね!
サンプルコードの解説
それでは、サンプルコードで重要な部分の解説をしていきますね。
#property indicator_chart_window #property indicator_buffers 2 extern int RSI_Period= 14; extern double RSI_High = 70.0; extern double RSI_Low = 30.0;
#property indicator_chart_window は、チャートウィンドウにサインを出すことを明示します。
#property indicator_buffers 2 は、使用するインジケーターの数で、HighのサインとLowのサインの2つであることを意味します。
”RSI_Period”は期間、RSI_HighはHighエントリーの値(70を超えたら)、RSI_LowはLowエントリーの値(30を下回ったら)を定義しています。
また、先頭に”extern”が記載されておりますが、これを付けると、以下の画像のように、ユーザーがMT4から値を変えられるようになります。ユーザーの利便性が向上しますので、適切に使い分けを行いたいですよね。逆に、ユーザーに変更して欲しくない値には、”extern”は使用しません。

int init() { SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,clrMagenta); SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,clrRed); SetIndexArrow(0,234); SetIndexArrow(1,233); SetIndexBuffer(0,DrawReverseLowBuffer); SetIndexBuffer(1,DrawReverseHighBuffer); return(INIT_SUCCEEDED); }
上記は、MT4起動時や呼ばれる特殊な関数(init)です。その関数の中に、サイン表示に必要なサインの太さ、アイコンの種類、そして、表示するサインの配列を設定します。これは、こういうものだと覚えておく程度で構いません。
for (int i=limit-1;i>=0;i--){ if(i == 0){ DrawReverseLowBuffer[i] = EMPTY_VALUE; DrawReverseHighBuffer[i] = EMPTY_VALUE; } iResultRSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i); if(iResultRSI >= RSI_High){ DrawReverseLowBuffer[i]=High[i]; } else if(iResultRSI <= RSI_Low){ DrawReverseHighBuffer[i]=Low[i]; } }
for文の中がロジックの処理となります。
ループ変数(i)の値が、limit-1から、0の間ループすることになり、初回は全てのローソク足、2回目以降は最新のローソク足が再計算されます。
次に、サイン表示配列に”EMPTY_VALUE”(空の値)を設定していますが、最新のローソク足はRSIの値が変動する可能性がありますので、一旦サイン表示なしに設定しています。
その後、RSIの値が70以上(RSI_Highで指定した値)、30以下(RSI_Lowで指定した値)になった場合に、HighまたはLowのサインを表示する処理となります。
最新+1つ前のローソク足でサイン表示するもの
次に、”最新+1つ前のローソク足でサイン表示するもの”について、サンプルコードを記載します。
なぜ、1つ前のローソク足を見るサインツールのサンプルをご紹介するか?ですが、より勝率が高いサインを出すためです。条件を複数指定することで、より勝率が期待できるエントリーポイントでサインを出すことが出来ます。
#property indicator_chart_window #property indicator_buffers 2 extern int RSI_Period= 5; extern double RSI_High = 60.0; extern double RSI_High_prev= 55.0; extern double RSI_Low = 35.0; extern double RSI_Low_prev= 40.0; double DrawReverseLowBuffer[]; double DrawReverseHighBuffer[]; int init() { SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,clrMagenta); SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,clrRed); SetIndexArrow(0,234); SetIndexArrow(1,233); SetIndexBuffer(0,DrawReverseLowBuffer); SetIndexBuffer(1,DrawReverseHighBuffer); return(INIT_SUCCEEDED); } int start() { int counted_bars=IndicatorCounted(); int limit = Bars - counted_bars; double iResultRSI,iResultRSI_prev; for (int i=limit-1;i>=0;i--){ if(i == 0){ DrawReverseLowBuffer[i] = EMPTY_VALUE; DrawReverseHighBuffer[i] = EMPTY_VALUE; } iResultRSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i); iResultRSI_prev = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i+1); if(iResultRSI_prev < RSI_High_prev && iResultRSI >= RSI_High){ DrawReverseLowBuffer[i]=High[i]; } else if(iResultRSI_prev > RSI_Low_prev && iResultRSI <= RSI_Low){ DrawReverseHighBuffer[i]=Low[i]; } } return(0); }
実行結果のイメージ

条件が増えましたので、サイン数は減りましたが、勝率は高くなってますよね。こうして、サインツールと呼ばれるものは、条件を組み合わせることで、サインを出しています。言い換えれば、この条件が【企業秘密】ってことですよね。
サンプルコードの解説
それでは、サンプルコードで重要な部分の解説をしていきますね。
”単純なRSIの上限/下限でサイン表示”のサインツールと重複する部分が多々ありますので、異なる部分のみ解説します。
extern double RSI_High = 60.0; extern double RSI_High_prev= 55.0; extern double RSI_Low = 35.0; extern double RSI_Low_prev= 40.0;
条件の変数が2つ増えています。これは判断する条件として1つ前のローソク足のRSIが加わったためです。
iResultRSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i); iResultRSI_prev = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i+1); if(iResultRSI_prev < RSI_High_prev && iResultRSI >= RSI_High){ DrawReverseLowBuffer[i]=High[i]; } else if(iResultRSI_prev > RSI_Low_prev && iResultRSI <= RSI_Low){ DrawReverseHighBuffer[i]=Low[i]; }
そして、判定ロジックの部分が変わっております。
一つ前のローソク足のRSIが、RSI_High_prevの値より小さいことに加え、最新のローソク足のRSIが、RSI_Highの値より大きい場合に、Lowエントリーのサイン。
一つ前のローソク足のRSIが、RSI_Low_prevの値より大きいことに加え、最新のローソク足のRSIが、RSI_Lowの値より小さい場合に、Highエントリーのサイン。
を出すサインツールとなります。
RSIを活用した期待値の高いロジック
RSIは多くのトレーダーが使用している指標値であり、特性を生かしたロジックをサインツールに組み込むことが出来れば、期待値の高いサイン表示が可能です。
RSIの活用方法について、ご紹介しますので参考にしていただければと思います。
RSIのオーバーボート/オーバーソールドレベルの活用
RSIの基本的なロジックとして、70以上を「買われ過ぎ(オーバーボート)」、30以下を「売られ過ぎ(オーバーソールド)」と判断する方法が一般的です。このロジックを用いたサインツールは、次のように動作します。サンプルで紹介したロジックと同じです。
買いサイン:RSIが30以下になったときに、売られ過ぎ状態として買いのサインを出します。
売りサイン:RSIが70以上になったときに、買われ過ぎ状態として売りのサインを出します。
ダイバージェンスの検出
RSI(Relative Strength Index)のダイバージェンスの検出は、テクニカル分析において非常に有用な手法です。ダイバージェンスとは、価格の動きとRSIの動きが一致しない状況を指し、特にトレンドの反転を予測する際に重要なシグナルとなります。ダイバージェンスには大きく分けて「強気のダイバージェンス」と「弱気のダイバージェンス」の2種類があります。
強気のダイバージェンスは、価格が新たな安値を更新しているにもかかわらず、RSIがそれに追従せず、前回の安値よりも高い位置にある状況を指します。具体的には、以下のようなステップで検出します。
- 価格の動きの確認: 価格が下降トレンドにあり、新しい安値を形成しているかどうかを確認
- RSIの動きの確認: RSIが前回の安値よりも高い位置にあり、上昇傾向にあるかどうかを確認
- ダイバージェンスの認定: 価格が新安値を形成している一方で、RSIがそれに追従せず上昇している場合、強気のダイバージェンスが発生していると認定
このような状況は、価格の下落圧力が弱まっており、買いの力が増していることを示唆します。そのため、強気のダイバージェンスは、価格が反転し上昇に転じる可能性が高いシグナルと見なされます。
弱気のダイバージェンスは、価格が新たな高値を更新しているにもかかわらず、RSIがそれに追従せず、前回の高値よりも低い位置にある状況を指します。具体的には、以下のようなステップで検出します。
- 価格の動きの確認: 価格が上昇トレンドにあり、新しい高値を形成しているかどうかを確認
- RSIの動きの確認: RSIが前回の高値よりも低い位置にあり、下降傾向にあるかどうかを確認
- ダイバージェンスの認定: 価格が新高値を形成している一方で、RSIがそれに追従せず下降している場合、弱気のダイバージェンスが発生していると認定
このような状況は、価格の上昇圧力が弱まっており、売りの力が増していることを示唆します。そのため、弱気のダイバージェンスは、価格が反転し下落に転じる可能性が高いシグナルと見なされます。
RSIのクロスオーバー戦略
RSIが特定の閾値をクロスする際に取引シグナルを生成する方法もあります。
買いサイン:RSIが30を下から上にクロスしたときに買いのシグナルを出します。
売りサイン:RSIが70を上から下にクロスしたときに売りのシグナルを出します。
コメントを残す