複数条件を組み合わせたEAの作り方 — RSI+MACD+移動平均線の実例
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.89 | 48.2% | 687回 | 22.4% |
| RSI + SMA200 | 1.18 | 52.1% | 341回 | 14.8% |
| RSI + MACD + SMA200 | 1.41 | 56.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に渡すと、プロンプトの精度が大幅に上がります。
関連記事
- AIに1回頼むだけでEAが作れる
- インジケーターをAIに伝わる売買条件に変換する技術
- 裁量手法をAIに伝えるための「言語化シート」
- TradingViewのストラテジーテスター完全ガイド
- AIが作ったEA、バックテストでは勝つのにリアルで負ける理由
- AIが出したコードにエラーが出た時のデバッグプロンプト集
本記事で紹介するEA・手法は教育目的で作成されたものです。実際の取引で利益を保証するものではありません。EAの運用は必ずデモ口座で十分にテストした上で、自己責任で行ってください。FX取引にはリスクが伴います。
次のステップ
まずデモで動作確認 → OKなら本番運用、が安全です。
デモ口座でEAを回す手順関連記事
TradingViewストラテジーテスターの使い方 — AI活用バックテスト
MT4より手軽にバックテストできるTradingViewのストラテジーテスターの使い方を解説。AIにPine Scriptを書かせて結果を確認するまでの手順を紹介。
TradingViewのアラート機能をEAの代わりに使う方法
EAを作らなくてもTradingViewのアラート+Webhookで半自動売買が実現できます。設定手順とEAとの使い分けを具体的に解説。
TradingViewの無料 vs 有料、EA開発に必要なプランはどれ?
EA開発のワークフロー別に、TradingViewの各プランで何ができるかを具体的に解説。アイデア出し・バックテスト・アラート連携など段階ごとに必要なプランを明確化。
Squeeze MomentumでPine Script→EA変換を実践する
中級編で学んだPine Script丸投げの手法を、Squeeze Momentumインジケーターで実践。プロンプトの書き方の重要ポイントとリペイント問題のチェック方法も解説。
