【コピペOK】RSI逆張りEAの作り方|売られすぎ・買われすぎで自動売買
前回は移動平均線クロス(順張り)を作りました。今回はRSI(相対力指数)を使った逆張りEAに挑戦します。
「みんなが売ってる時に買い、みんなが買ってる時に売る」
逆張りの基本をEAで自動化しましょう。
RSIって何?
RSI(Relative Strength Index)は、相場の過熱感を数値化したものです。
- 0〜100の範囲で動く
- 30以下 = 売られすぎ(そろそろ反転して上がるかも?)
- 70以上 = 買われすぎ(そろそろ反転して下がるかも?)
つまり:
- RSI 30以下 → 買いのチャンス
- RSI 70以上 → 売りのチャンス
順張りと逆張りの違い
| 順張り(MA Cross) | 逆張り(RSI) | |
|---|---|---|
| 考え方 | トレンドに乗る | 反転を狙う |
| 買うタイミング | 上がり始めたら | 下がりすぎたら |
| 売るタイミング | 下がり始めたら | 上がりすぎたら |
| 得意な相場 | トレンド相場 | レンジ相場 |
| 苦手な相場 | レンジ相場 | トレンド相場 |
両方のEAを持っておくと、相場に応じて使い分けができます。
完成コード(コピペOK)
//+------------------------------------------------------------------+//| RSI Reversal EA - RSI逆張りで自動売買 |//+------------------------------------------------------------------+#property copyright "Your Name"#property version "1.00"#property strict
//--- 入力パラメータinput int RSI_Period = 14; // RSI期間input int RSI_Oversold = 30; // 売られすぎラインinput int RSI_Overbought = 70; // 買われすぎラインinput double LotSize = 0.01; // ロット数input int StopLoss = 30; // 損切り(pips)input int TakeProfit = 60; // 利確(pips)input int MagicNumber = 54321; // マジックナンバー
//--- グローバル変数bool canBuy = true; // 買いエントリー可能フラグbool canSell = true; // 売りエントリー可能フラグ
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit() { Print("RSI Reversal EA 起動!"); Print("RSI期間: ", RSI_Period, " / 売られすぎ: ", RSI_Oversold, " / 買われすぎ: ", RSI_Overbought); return(INIT_SUCCEEDED); }
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick() { // 既存ポジションがあれば何もしない if(CountMyPositions() > 0) { canBuy = true; canSell = true; return; }
// RSI値を取得 double rsi_current = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, 0); double rsi_prev = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, 1);
// 売られすぎゾーンから抜け出した → 買いエントリー if(rsi_prev < RSI_Oversold && rsi_current >= RSI_Oversold && canBuy) { Print("★RSI売られすぎゾーンから反転!買いエントリー"); Print("RSI: ", rsi_prev, " → ", rsi_current); OpenBuy(); canBuy = false; // 連続エントリー防止 }
// 買われすぎゾーンから抜け出した → 売りエントリー if(rsi_prev > RSI_Overbought && rsi_current <= RSI_Overbought && canSell) { Print("★RSI買われすぎゾーンから反転!売りエントリー"); Print("RSI: ", rsi_prev, " → ", rsi_current); OpenSell(); canSell = false; // 連続エントリー防止 }
// ゾーンに入ったらフラグをリセット if(rsi_current < RSI_Oversold) canBuy = true; if(rsi_current > RSI_Overbought) canSell = true; }
//+------------------------------------------------------------------+//| 買い注文を出す |//+------------------------------------------------------------------+void OpenBuy() { double sl = Ask - StopLoss * Point * 10; double tp = Ask + TakeProfit * Point * 10;
int ticket = OrderSend( Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp, "RSI Buy", MagicNumber, 0, clrGreen );
if(ticket < 0) Print("買い注文エラー: ", GetLastError()); else Print("買い注文成功!チケット: ", ticket); }
//+------------------------------------------------------------------+//| 売り注文を出す |//+------------------------------------------------------------------+void OpenSell() { double sl = Bid + StopLoss * Point * 10; double tp = Bid - TakeProfit * Point * 10;
int ticket = OrderSend( Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp, "RSI Sell", MagicNumber, 0, clrRed );
if(ticket < 0) Print("売り注文エラー: ", GetLastError()); else Print("売り注文成功!チケット: ", ticket); }
//+------------------------------------------------------------------+//| このEAのポジション数を数える |//+------------------------------------------------------------------+int CountMyPositions() { int count = 0; for(int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) count++; } } return count; }//+------------------------------------------------------------------+動かし方
前回の移動平均線EAと同じです。
- MetaEditorで新規EA作成
- コードを貼り付け
- F7でコンパイル
- チャートにセット
- 自動売買ON
コードのポイント解説
RSI値の取得
double rsi_current = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, 0);double rsi_prev = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, 1);iRSI()関数でRSI値を取得します。
NULL= 現在のチャートの通貨ペア0= 現在のチャートの時間足RSI_Period= RSIの計算期間(デフォルト14)PRICE_CLOSE= 終値を使って計算- 最後の数字 = 何本前のローソク足か(0=現在、1=1本前)
エントリー条件(重要!)
単純に「RSIが30以下なら買い」とすると、ずっと30以下の間、毎ティック買い注文を出してしまいます。
なので、**「30以下から30以上に戻った瞬間」**をトリガーにしています。
// 1本前は30以下だった かつ 現在は30以上if(rsi_prev < RSI_Oversold && rsi_current >= RSI_Oversold)これで「売られすぎゾーンから抜け出した」=「反転の兆し」を検出します。
連続エントリー防止
bool canBuy = true;bool canSell = true;フラグを使って、同じシグナルで何度もエントリーしないようにしています。
- エントリーしたら
canBuy = false - 再度ゾーンに入ったら
canBuy = trueにリセット - 次にゾーンから抜けた時にエントリー可能
カスタマイズしてみよう
RSIレベルを変更
デフォルトは30/70ですが、より極端な値にすると:
RSI_Oversold = 20 // より売られすぎを狙うRSI_Overbought = 80 // より買われすぎを狙うシグナルは減るけど、精度は上がる可能性があります。
移動平均線フィルターを追加
「大きなトレンドに逆らわない」ようにフィルター追加:
void OnTick() { // 200MAを取得 double ma200 = iMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 0);
// 200MAより上にいる時は買いのみ if(Bid > ma200) { // 買いエントリーロジック }
// 200MAより下にいる時は売りのみ if(Bid < ma200) { // 売りエントリーロジック } }RSIダイバージェンス検出(上級)
価格は下がってるのにRSIは上がってる → 反転サインのダイバージェンス。これは少し複雑なので、基本が理解できてから挑戦しましょう。
RSI EA vs MA Cross EA
| RSI EA | MA Cross EA | |
|---|---|---|
| 戦略タイプ | 逆張り | 順張り |
| エントリー回数 | 多め | 少なめ |
| 勝率 | 高め | 低め |
| リスクリワード | 1:2くらい | 1:2以上狙える |
| 得意な相場 | レンジ | トレンド |
両方を持って、相場を見て使い分けるのがベストです。
逆張りEAの注意点
⚠️ トレンド相場では負けやすい
RSI30で買っても、そのまま20、10と下がり続けることがあります。これが「落ちるナイフを掴む」状態。
対策:
- 損切りは必ず設定する
- トレンドフィルター(MAなど)を追加
- レンジ相場でのみ使う
- ロットを控えめにする
次のステップ
これで順張り(MA Cross)と逆張り(RSI)、2つのEAが作れるようになりました!
次は、作ったEAを過去データで検証する方法を学びましょう。バックテストをしないと、そのEAが本当に勝てるのかわかりません。
📚 次に読む記事: MT4バックテスト完全ガイド
「このEA、本当に勝てるの?」を自分で検証できるようになれば、詐欺EAに騙されることもなくなります。データで判断する習慣をつけましょう! 📊
🎁おすすめツール・サービス
※上記リンクにはプロモーション(広告)が含まれています
量子相場謀略|ホソノP
ブログでは書けない本音のトレード戦略とEA開発の裏側を公開。 データに基づいた検証で、再現性のある手法だけをお届けします。