MQL4MQL5 EA(エキスパートアドバイザー) 売買サイン・相場の判定
RSI の買われすぎ・売られすぎでサインを出したい
結論:RSI を2本分取得し、30 を下から上に戻ったら買いサイン、70 を上から下に戻ったら売りサインと判定します。
考え方
RSI は 0〜100 の値で、一般に 70 以上を買われすぎ、30 以下を売られすぎの目安にします。「30 を下回った」だけでサインにすると下落中に何度も出るため、ここでは「30 を下回った状態から 30 を上に戻った」ときを買いサイン、「70 を上から下に戻った」ときを売りサインとしてアラートを出す EA を例にしています。
- RSI の値を、確定した1本前と2本前の2本分取得する
- 2本前が 30 以下で、1本前が 30 より上なら買いサイン
- 2本前が 70 以上で、1本前が 70 より下なら売りサイン
そのまま使えるコード
MetaEditor の「新規作成」で「エキスパートアドバイザ(テンプレート)」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Experts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4(MT4)
#property strict
// RSI が 30 を上抜け→買いサイン、70 を下抜け→売りサインのアラートを出す EA(MT4)
input int InpPeriod = 14; // RSI の期間
input double InpLow = 30; // 売られすぎの水準
input double InpHigh = 70; // 買われすぎの水準
datetime lastBar = 0;
int OnInit()
{
return INIT_SUCCEEDED;
}
void OnTick()
{
datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
if(t == lastBar) return;
lastBar = t;
double r1 = iRSI(_Symbol, 0, InpPeriod, PRICE_CLOSE, 1);
double r2 = iRSI(_Symbol, 0, InpPeriod, PRICE_CLOSE, 2);
if(r2 <= InpLow && r1 > InpLow)
Alert(_Symbol, " RSI 買いサイン(", DoubleToString(r1, 1), ")");
if(r2 >= InpHigh && r1 < InpHigh)
Alert(_Symbol, " RSI 売りサイン(", DoubleToString(r1, 1), ")");
}MQL5(MT5)
// RSI が 30 を上抜け→買いサイン、70 を下抜け→売りサインのアラートを出す EA(MT5)
input int InpPeriod = 14; // RSI の期間
input double InpLow = 30; // 売られすぎの水準
input double InpHigh = 70; // 買われすぎの水準
int hRsi = INVALID_HANDLE;
datetime lastBar = 0;
int OnInit()
{
hRsi = iRSI(_Symbol, PERIOD_CURRENT, InpPeriod, PRICE_CLOSE);
return hRsi == INVALID_HANDLE ? INIT_FAILED : INIT_SUCCEEDED;
}
void OnDeinit(const int reason)
{
IndicatorRelease(hRsi);
}
void OnTick()
{
datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
if(t == lastBar) return;
double r[];
ArraySetAsSeries(r, true); // r[0]=1本前、r[1]=2本前
if(CopyBuffer(hRsi, 0, 1, 2, r) < 2) return;
lastBar = t;
if(r[1] <= InpLow && r[0] > InpLow)
Alert(_Symbol, " RSI 買いサイン(", DoubleToString(r[0], 1), ")");
if(r[1] >= InpHigh && r[0] < InpHigh)
Alert(_Symbol, " RSI 売りサイン(", DoubleToString(r[0], 1), ")");
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- 水準を 20 / 80 などに変えたいときは、パラメーターの InpLow・InpHigh を変えます。
- アラートの代わりに注文したいときは、「ゴールデンクロス」レシピの注文部分を組み合わせます。
注意点
- 強いトレンドの中では、RSI が買われすぎ・売られすぎのまま張り付くことがあります。トレンドの判定と組み合わせるとだましを減らせます。
このコードで使っている関数
うまく動かないときに出やすいエラー
あわせて読みたいレシピ
- MACD とシグナルのクロスを判定したいMACD のメインライン(バッファ 0)とシグナルライン(バッファ 1)を2本分取得し、上下の入れ替わりを比べます。
- ゴールデンクロス・デッドクロスで売買したい短期 MA と長期 MA の値を「2本前」と「1本前」で比べ、上下が入れ替わったらクロスと判定します。
- 上位足のトレンド方向を判定したいiMA() などの時間足の引数に PERIOD_H4・PERIOD_D1 などを指定し、上位足の移動平均と価格を比べます。
- ボリンジャーバンドの ±2σ タッチを判定したいiBands() で上のバンド・下のバンドの値を取得し、確定足の高値・安値(または終値)と比べます。












