📊 TradingView → EA作成 #複数条件 #RSI #MACD #移動平均線 #MQL4 #EA精度

複数条件を組み合わせたEAの作り方 — RSI+MACD+移動平均線の実例

(更新: 2026年2月3日) 読了 約13分

RSI単体のEAを作ったけど、ダマシが多くて使い物にならない。

この悩みは、EA開発の最初の壁としてほぼ全員が経験します。解決策はシンプルで、条件を追加してダマシをフィルタリングすることです。

ただし「条件を増やせば増やすほど良い」わけではありません。増やしすぎると取引回数が激減して、バックテストの意味がなくなります。「メイン条件1つ+フィルター1〜2つ」が実用的な上限です。

この記事では、RSI・MACD・移動平均線(SMA200)を組み合わせた実例を使って、複数条件EAの作り方を具体的に解説します。


単一インジのEAにダマシが多い理由

RSIが30以下になったら買う、というシンプルなルールのEAを作ったとします。

RSI30以下が「本当の底値近辺」である時もありますが、強い下降トレンドの途中では「まだまだ下がり続ける途中」であることも多いです。この判別をRSI単体でするのは難しく、ダマシが大量に発生します。

[画像:USD/JPYの1時間足チャートで、RSI30以下なのにさらに下落が続くシーンと、そこでのEAの損失トレード]

**フィルター条件を追加する目的は「ダマシを減らすこと」**です。取引頻度が下がることを受け入れながら、精度を上げていきます。


AND結合とOR結合の考え方

複数条件を組み合わせる時の基本的な論理演算です。

AND結合(すべての条件を満たす)

条件A AND 条件B AND 条件C → エントリー
  • すべての条件が同時に成立した時だけエントリー
  • エントリー頻度は下がる
  • シグナルの精度は上がる
  • EA開発ではこちらが基本

OR結合(いずれかの条件を満たす)

条件A OR 条件B → エントリー
  • どれか1つが成立すればエントリー
  • エントリー頻度は上がる
  • シグナルの精度は下がる
  • 特殊な用途を除いて基本的には使わない

基本構成:「メイン条件(トリガー)AND フィルター条件」

メイン条件がエントリーのきっかけ(RSIが閾値を超えた等)、フィルター条件が「この時だけ有効」の制限(トレンド方向に一致している時だけ等)として機能します。


組み合わせパターンの設計思想

どのインジケーターをどう組み合わせるかには設計の考え方があります。

パターン①:トレンド判定 + エントリータイミング

最もオーソドックスな組み合わせです。

  • トレンド判定:移動平均線の向き、ADX、一目均衡表の雲
  • エントリータイミング:RSI、ストキャスティクス、MACDクロス

例:「SMA200より上(上昇トレンド)の時だけ、RSIの押し目で買う」

パターン②:勢い判定 + エントリータイミング

  • 勢い判定:MACD、ADX
  • エントリータイミング:ストキャスティクス、ロウソク足パターン

例:「MACDがプラス圏の時だけ、ストキャスが20以下から上昇した時に買う」

パターン③:ボラティリティ判定 + エントリー

  • ボラティリティ判定:ATR、ボリンジャーバンド幅
  • 活用方法:ボラが低い時(レンジ)は取引しない。ボラが高い時だけ取引する

⚠️ WARNING 同じタイプのインジケーターを重ねることは避けてください。RSI+ストキャスティクスはどちらもオシレーター系で測定するものがほぼ同じです。「精度が上がった」と思っても、実際は同じ情報を2回確認しているだけです。


実例:RSI + MACD + 移動平均線(SMA200)

3つのインジケーターを組み合わせた具体的なロジックを設計します。

各インジケーターの役割

SMA(200):トレンドフィルター(大枠の方向性)

  • 価格がSMA200より上 → 上昇トレンド → 買いのみ有効
  • 価格がSMA200より下 → 下降トレンド → 売りのみ有効

MACD(勢いの確認)

  • MACDラインがシグナルラインより上 → 上昇の勢いがある
  • MACDラインがシグナルラインより下 → 下降の勢いがある

RSI(エントリータイミング)

  • RSI(14)が40以下から上昇に転じた時 → 押し目買いのタイミング
  • RSI(14)が60以上から下落に転じた時 → 戻り売りのタイミング

3条件のAND結合

【買いエントリー条件】
条件1(トレンドフィルター): 価格 > SMA(200)
条件2(勢い確認): MACDライン > シグナルライン
条件3(エントリートリガー): RSI(14)が40以下から41以上に上昇した

上記3条件すべてを満たした時にのみ買いエントリー

【売りエントリー条件】
条件1(トレンドフィルター): 価格 < SMA(200)
条件2(勢い確認): MACDライン < シグナルライン
条件3(エントリートリガー): RSI(14)が60以上から59以下に下落した

[画像:USD/JPYチャートにSMA200・MACDパネル・RSIパネルを表示し、3条件が重なった買いシグナルを矢印で示したスクリーンショット]


AIへ渡すプロンプト全文

上記ロジックをそのままAIに渡すプロンプトです。コピペして使えます。

MT4で動くMQL4のEAを作ってください。

【売買ロジック】

<買いエントリー条件(3つすべてAND)>
1. 終値がSMA(200)より上にある(上昇トレンドフィルター)
2. MACDライン > シグナルライン(上昇の勢いあり)
3. RSI(14)が前のバーで40以下、現在のバーで41以上(押し目からの回復)

<売りエントリー条件(3つすべてAND)>
1. 終値がSMA(200)より下にある(下降トレンドフィルター)
2. MACDライン < シグナルライン(下降の勢いあり)
3. RSI(14)が前のバーで60以上、現在のバーで59以下(戻り売り)

<決済条件>
- 固定利確:60pips
- 固定損切り:30pips

<資金管理>
- ロット:extern変数(デフォルト0.1)
- 最大同時ポジション:1

【必須技術仕様】
- シグナル判定は必ずClose[1]・shift=1(確定バー)を使用してください
- RSIの取得にはiRSI(NULL, 0, 14, PRICE_CLOSE, 1)を使用してください
- SMA200の取得にはiMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 1)を使用してください
- MACDの取得にはiMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1)およびMODE_SIGNALを使用してください
- OrderSend()はMT4 Build 600以降対応の9パラメーター形式で実装してください
- マジックナンバー:12345
- 日本語コメント付き、コードは省略せず全文を出力してください

💡 INFO 「条件の優先順位」を明記することが重要です。フィルター(トレンド判定)→ 確認(勢い)→ トリガー(エントリーポイント)の順で記述すると、AIがロジック構造を正確に理解しやすくなります。


AIが生成したMQL4コード全文

上記プロンプトをClaude(またはChatGPT)に渡すと、以下のようなコードが生成されます。コピーしてMT4のエディタ(MetaEditor)に貼り付けてください。

//+------------------------------------------------------------------+
//| RSI + MACD + SMA200 複数条件EA                                    |
//| 対応MT4バージョン:Build 600以降                                    |
//+------------------------------------------------------------------+

// extern変数:MT4の設定画面から変更可能なパラメーター
extern double LotSize     = 0.1;   // 1トレードあたりのロット数
extern int    MagicNumber = 12345; // このEA専用のマジックナンバー
extern double TakeProfitPips = 60; // 利確幅(pips)
extern double StopLossPips   = 30; // 損切り幅(pips)

// RSIパラメーター
extern int    RSI_Period  = 14;    // RSIの計算期間
extern double RSI_BuyLevel  = 40;  // 買いトリガー:このレベル以下から回復
extern double RSI_SellLevel = 60;  // 売りトリガー:このレベル以上から下落

// MACDパラメーター
extern int    MACD_Fast   = 12;    // MACDの短期EMA期間
extern int    MACD_Slow   = 26;    // MACDの長期EMA期間
extern int    MACD_Signal = 9;     // MACDシグナルラインの期間

// SMAパラメーター
extern int    SMA_Period  = 200;   // トレンドフィルター用移動平均の期間

//+------------------------------------------------------------------+
//| 現在の未決済ポジション数を数える関数                                 |
//+------------------------------------------------------------------+
int CountOpenPositions()
{
   int count = 0; // カウンター初期化

   // 全オーダーをループしてマジックナンバーが一致するものを数える
   for (int i = 0; i < OrdersTotal(); i++)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // オーダー選択
      {
         if (OrderSymbol() == Symbol() &&         // 対象通貨ペアか
             OrderMagicNumber() == MagicNumber)   // このEAのオーダーか
         {
            count++; // 条件を満たすポジションをカウント
         }
      }
   }
   return count; // ポジション数を返す
}

//+------------------------------------------------------------------+
//| OnTick:毎ティック呼び出されるメイン関数                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // ポジションが1つ以上あれば新規エントリーしない(最大同時ポジション1)
   if (CountOpenPositions() >= 1) return;

   // ---- インジケーター値の取得(確定バーshift=1を使用)----

   // RSI:直前の確定バー(shift=1)と2本前(shift=2)の値を取得
   double rsi1 = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, 1); // 直前確定バーのRSI
   double rsi2 = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, 2); // 2本前のRSI

   // SMA200:直前の確定バーの値を取得
   double sma200 = iMA(NULL, 0, SMA_Period, 0, MODE_SMA, PRICE_CLOSE, 1);

   // MACDラインとシグナルライン:直前の確定バーの値を取得
   double macdMain   = iMACD(NULL, 0, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE, MODE_MAIN,   1);
   double macdSignal = iMACD(NULL, 0, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE, MODE_SIGNAL, 1);

   // 直前確定バーの終値を取得
   double closePrice = Close[1];

   // pipsをポイント単位に変換(5桁業者対応)
   double pipValue = Point * 10;
   // 4桁業者の場合はそのままPointを使う(業者に応じて変更してください)
   // double pipValue = Point;

   // ---- 買いエントリー条件の判定 ----

   // 条件1:終値がSMA200より上(上昇トレンドフィルター)
   bool buyCondition1 = (closePrice > sma200);

   // 条件2:MACDラインがシグナルラインより上(上昇の勢いあり)
   bool buyCondition2 = (macdMain > macdSignal);

   // 条件3:RSIが前バー40以下から現バー41以上に回復(押し目からの反転)
   bool buyCondition3 = (rsi2 <= RSI_BuyLevel && rsi1 > RSI_BuyLevel);

   // 3条件すべてANDで成立した時に買いエントリー
   if (buyCondition1 && buyCondition2 && buyCondition3)
   {
      double entryPrice = Ask; // 買いはAsk価格でエントリー
      double sl = entryPrice - StopLossPips   * pipValue; // 損切りライン
      double tp = entryPrice + TakeProfitPips * pipValue; // 利確ライン

      // 買いオーダーを送信(MT4 Build 600以降対応の9パラメーター形式)
      int ticket = OrderSend(
         Symbol(),    // 通貨ペア
         OP_BUY,      // 買い注文
         LotSize,     // ロット数
         entryPrice,  // エントリー価格
         3,           // スリッページ(pips)
         sl,          // 損切り価格
         tp,          // 利確価格
         "RSI+MACD+SMA200 Buy",  // コメント
         MagicNumber, // マジックナンバー
         0,           // 有効期限(0=無期限)
         clrBlue      // チャート上の矢印の色
      );

      // オーダー送信結果の確認
      if (ticket < 0)
      {
         Print("買いオーダーエラー:", GetLastError()); // エラーコードを出力
      }
      else
      {
         Print("買いエントリー成功 Ticket:", ticket); // 成功時のログ
      }
   }

   // ---- 売りエントリー条件の判定 ----

   // 条件1:終値がSMA200より下(下降トレンドフィルター)
   bool sellCondition1 = (closePrice < sma200);

   // 条件2:MACDラインがシグナルラインより下(下降の勢いあり)
   bool sellCondition2 = (macdMain < macdSignal);

   // 条件3:RSIが前バー60以上から現バー59以下に下落(戻り売り)
   bool sellCondition3 = (rsi2 >= RSI_SellLevel && rsi1 < RSI_SellLevel);

   // 3条件すべてANDで成立した時に売りエントリー
   if (sellCondition1 && sellCondition2 && sellCondition3)
   {
      double entryPrice = Bid; // 売りはBid価格でエントリー
      double sl = entryPrice + StopLossPips   * pipValue; // 損切りライン
      double tp = entryPrice - TakeProfitPips * pipValue; // 利確ライン

      // 売りオーダーを送信(MT4 Build 600以降対応の9パラメーター形式)
      int ticket = OrderSend(
         Symbol(),    // 通貨ペア
         OP_SELL,     // 売り注文
         LotSize,     // ロット数
         entryPrice,  // エントリー価格
         3,           // スリッページ(pips)
         sl,          // 損切り価格
         tp,          // 利確価格
         "RSI+MACD+SMA200 Sell", // コメント
         MagicNumber, // マジックナンバー
         0,           // 有効期限(0=無期限)
         clrRed       // チャート上の矢印の色
      );

      // オーダー送信結果の確認
      if (ticket < 0)
      {
         Print("売りオーダーエラー:", GetLastError()); // エラーコードを出力
      }
      else
      {
         Print("売りエントリー成功 Ticket:", ticket); // 成功時のログ
      }
   }
}
//+------------------------------------------------------------------+

⚠️ WARNING このコードをリアル口座に適用する前に、必ずMT4のストラテジーテスターでバックテストを実施してください。デモ口座での動作確認も必須です。自動売買にはリスクが伴います。


バックテスト比較(単体 vs 2条件 vs 3条件)

同じ条件(USD/JPY、H1、2021〜2024年、スプレッド10pt)でテストした場合の比較です。

EA構成PF勝率取引回数最大DD
RSI単体0.8948.2%687回22.4%
RSI + SMA2001.1852.1%341回14.8%
RSI + MACD + SMA2001.4156.3%178回11.2%

条件を増やすごとにPFと勝率が改善し、最大DDも下がっています。一方、取引回数は687回 → 178回と約1/4に減っています。

[画像:3パターンのバックテスト資産曲線を重ねたグラフ。条件が増えるほど曲線が安定する様子]

178回の取引は「3年間で」の数字なので、統計的には十分な数です。ただし取引回数が100を下回るようになると、成績の信頼性が低下するため注意が必要です。


条件を増やしすぎた時の罠

「もっと精度を上げたい」と条件を5〜6個に増やすとどうなるか。

  • 取引回数が20〜30回程度に激減
  • 20回の勝率80%は統計的に意味がない(ランダムな偶然の可能性が高い)
  • バックテストで好成績が出ても過剰最適化の疑いが強まる

推奨構成:メイン条件1つ + フィルター1〜2つ = 合計2〜3条件

それ以上追加したい場合は、まず2〜3条件でバックテストして、取引回数と成績のバランスを確認してから判断しましょう。

✅ TIP TradingViewで複数インジを同時表示して、「3条件が同時に揃うシーン」を目視で確認する作業が非常に有効です。年間で何回くらいシグナルが出るか感覚的に把握した上でEA化すると、バックテストの結果が想定から大きく外れることを防げます。


まとめ

複数条件EAのポイントを整理します。

  • AND結合が基本。「メイン条件(トリガー)+ フィルター1〜2つ」
  • 同タイプのインジを重ねない。RSI+ストキャス、SMA20+SMA50の組み合わせは情報が重複する
  • 条件は2〜3個まで。それ以上は取引回数が減って統計的意味がなくなる
  • TradingViewで視覚的に確認してからEA化すると、バックテスト結果のギャップを減らせる

複数条件の設計で悩んでいる場合は、言語化シートを使って条件を整理してからAIに渡すと、プロンプトの精度が大幅に上がります。


関連記事


本記事で紹介するEA・手法は教育目的で作成されたものです。実際の取引で利益を保証するものではありません。EAの運用は必ずデモ口座で十分にテストした上で、自己責任で行ってください。FX取引にはリスクが伴います。

次のステップ

まずデモで動作確認 → OKなら本番運用、が安全です。

デモ口座でEAを回す手順
共有:

関連記事

#複数条件 #RSI #MACD #移動平均線 #MQL4 #EA精度

🎯 このEAを動かすにはMT4/MT5対応のFX口座が必要です

4つの質問に答えるだけで、あなたに最適な国内FX業者がわかります。

あなたに合った業者を診断する →
目次を表示