MT4インジケーター別EA作成入門:移動平均線・RSI・MACDで自動売買ロジックを組む
FXの自動売買に興味はあるものの、「プログラミングは難しそう」「EAは買うものだ」と考えている方は多いです。
しかし、MT4のEAは考え方さえつかめば、基本インジケーターだけでも比較的シンプルなロジックで動かすことができます。
本記事では、移動平均線・RSI・MACDといった代表的なテクニカル指標を使い、
「自分でロジックを組む」ことをゴールに、EA作成の全体像を丁寧に解説します。
MT4でEAを動かすための全体像
まずは、MT4でEAを動かすための全体の流れを整理します。
大まかには次のようなステップになります。
- MT4とデモ口座の準備
- MQL4エディタ(MetaEditor)でEAファイルを作成
- インジケーターの値を取得するコードを書く
- 売買条件(エントリー・決済)のロジックを書く
- ロット・損切り・利確などリスク管理を組み込む
- ストラテジーテスターでバックテスト・最適化を行う
- デモ口座でフォワードテストを行う
この記事では、特に③〜⑤の「ロジック部分」に焦点を当てます。
プログラムの文法を完璧に覚える必要はなく、最初は「この書き方を真似する」という意識で十分です。
大切なのは、売買ルールを論理的な条件に落とし込む思考プロセスです。
EAの基本構造を理解する:MQL4の最低限の骨組み
インジケーターを使う前に、EAの「骨組み」がどうなっているかを把握しておきます。
EA(エキスパートアドバイザー)は、MQL4という専用言語で書かれたスクリプトで、
主な構造は次の3つです。
OnInit():EAがチャートにセットされたときに一度だけ実行される初期化処理OnDeinit():EAがチャートから外されるときの後処理OnTick():新しいティック(価格更新)が来るたびに実行されるメイン処理
最もシンプルなEAのひな形は以下のようになります。
#property strict
int OnInit()
{
// 初期化処理
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
// 終了処理
}
void OnTick()
{
// メインロジック(売買条件の判定など)
}
このOnTick()の中で、インジケーターの値を取得し、売買条件を判定し、注文を出す処理を組み込んでいきます。
次の章からは、具体的なインジケーターを使ったEA作りの手順を見ていきます。
移動平均線(MA)を使ったシンプルなトレンドフォローEA
最初の例として、最も基本的なインジケーターである移動平均線(Moving Average)を使ったEAを作ります。
コンセプトは「短期線が長期線を上抜けしたら買い、下抜けしたら売り」という王道のクロス戦略です。
ロジック設計:どの条件ならエントリーするか
具体的には、以下のようなルールにします。
- 短期MA:期間10、長期MA:期間30(終値ベース)
- 短期MAが長期MAを上抜けしたタイミングで買いエントリー
- 短期MAが長期MAを下抜けしたタイミングで売りエントリー
- 既にポジションを持っている場合は新規エントリーを行わない(両建てしない)
- 損切り・利確は固定pips(例:損切り30pips、利確60pips)
このロジック自体はよくあるものですが、重要なのは「条件を明文化する」ことです。
人間がチャートを見て感覚的に判断していることを、ひとつひとつ「もし〜なら」の形に落とし込むと、
EAにしやすくなります。
MQL4で移動平均線を取得する方法
MQL4では、iMA()という関数で移動平均線の値を取得できます。
double maFast = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1);
double maSlow = iMA(NULL, 0, 30, 0, MODE_SMA, PRICE_CLOSE, 1);
NULL:現在のチャートのシンボル0:現在の時間足10 / 30:期間0:シフト(0だと最新足、1だと1本前の足)MODE_SMA:単純移動平均PRICE_CLOSE:終値を使用- 最後の引数
1は「1本前の足」の値を参照しています
クロス判定では「直近足」と「1本前の足」の関係を見る必要があるため、
通常は2本分のMA値を取得します。
double maFastPrev = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 2);
double maSlowPrev = iMA(NULL, 0, 30, 0, MODE_SMA, PRICE_CLOSE, 2);
移動平均線クロスEAのシンプルな例
上記を踏まえて、最もシンプルな形のEA例は以下のようになります。
#property strict
extern double Lots = 0.1;
extern int StopLoss = 30;
extern int TakeProfit= 60;
void OnTick()
{
// 既にポジションがある場合は新規エントリーしない
if(PositionsTotal() > 0) return;
// 移動平均線の値を取得
double maFast = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1);
double maSlow = iMA(NULL, 0, 30, 0, MODE_SMA, PRICE_CLOSE, 1);
double maFastPrev = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 2);
double maSlowPrev = iMA(NULL, 0, 30, 0, MODE_SMA, PRICE_CLOSE, 2);
// 買いシグナル:短期が長期を上抜け
bool buySignal = (maFastPrev < maSlowPrev) && (maFast > maSlow);
// 売りシグナル:短期が長期を下抜け
bool sellSignal = (maFastPrev > maSlowPrev) && (maFast < maSlow);
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double sl, tp;
if(buySignal)
{
sl = bid - StopLoss * _Point;
tp = bid + TakeProfit* _Point;
trade.Buy(Lots, _Symbol, ask, sl, tp);
}
else if(sellSignal)
{
sl = ask + StopLoss * _Point;
tp = ask - TakeProfit* _Point;
trade.Sell(Lots, _Symbol, bid, sl, tp);
}
}
実際にはエラー処理やスプレッドチェック、時間帯フィルターなどを加える必要がありますが、
「インジケーターの値をとって条件判定を行い、注文を出す」という一連の流れが見えてくるはずです。
RSIを使った押し目買い・戻り売りEA
次に、オシレーター系インジケーターの代表格であるRSI(Relative Strength Index)を使ったEAです。
RSIは「買われすぎ」「売られすぎ」を数値化した指標で、レンジ相場で威力を発揮しやすい特徴があります。
RSIを使ったロジックの考え方
初心者にも分かりやすく、かつ自動化しやすいルールの例として、次のようなものが考えられます。
- RSI期間:14
- RSIが30以下になった後、30を上抜けたら「売られすぎからの反発」とみて買いエントリー
- RSIが70以上になった後、70を下抜けたら「買われすぎからの反落」とみて売りエントリー
- トレンド方向を移動平均線でフィルターし、「上昇トレンド中は買いのみ」などに制限することも有効
ここでは、トレンドフィルターとして200期間の移動平均線を使い、
「価格が200MAより上なら買いシグナルだけ採用、下なら売りシグナルだけ採用」という形にします。
MQL4でRSIを取得する
RSIはiRSI()で取得できます。
double rsiCurrent = iRSI(NULL, 0, 14, PRICE_CLOSE, 1);
double rsiPrev = iRSI(NULL, 0, 14, PRICE_CLOSE, 2);
RSIの30ラインを上抜けしたかどうかは、
「1本前が30未満で、現在が30以上」という条件で判定できます。
bool rsiBuySignal = (rsiPrev < 30) && (rsiCurrent >= 30);
bool rsiSellSignal = (rsiPrev > 70) && (rsiCurrent <= 70);
RSI+トレンドフィルターEAのイメージ
概念的なコードイメージは以下の通りです。
void OnTick()
{
if(PositionsTotal() > 0) return;
double rsiCurrent = iRSI(NULL, 0, 14, PRICE_CLOSE, 1);
double rsiPrev = iRSI(NULL, 0, 14, PRICE_CLOSE, 2);
double ma200 = iMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 1);
double price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
bool rsiBuySignal = (rsiPrev < 30) && (rsiCurrent >= 30);
bool rsiSellSignal = (rsiPrev > 70) && (rsiCurrent <= 70);
bool upTrend = (price > ma200);
bool downTrend = (price < ma200);
if(rsiBuySignal && upTrend)
{
// 買いエントリー処理
}
else if(rsiSellSignal && downTrend)
{
// 売りエントリー処理
}
}
RSI単体ではダマシが多くなるケースもありますが、
トレンド方向に沿ってエントリーを絞り込むことで、精度を高める狙いがあります。
こうした「インジケーター同士の組み合わせ」がEA設計の大きなポイントです。
MACDを使ったトレンド転換・継続のEA
最後に、トレンドの強さと転換を捉える指標としてよく使われるMACDを取り上げます。
MACDは「短期EMAと長期EMAの差」をベースにしており、シグナル線とのクロスやゼロラインとの位置関係で判断します。
MACDの基本構造とシグナル
一般的な設定は以下の通りです。
- 短期EMA:12
- 長期EMA:26
- シグナル:9
EAロジックの例としては、
- MACDラインがシグナルラインを下から上に抜けたら買いエントリー
- MACDラインがシグナルラインを上から下に抜けたら売りエントリー
- ゼロラインより上なら買い方向を重視、下なら売り方向を重視するなどのフィルターを追加
MQL4でMACDを取得する
MQL4ではiMACD()でMACDとシグナルを取得できます。
double macdCurrent, signalCurrent;
macdCurrent = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1);
signalCurrent = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 1);
double macdPrev, signalPrev;
macdPrev = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2);
signalPrev = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 2);
クロス判定は次のように行えます。
bool macdBuy = (macdPrev < signalPrev) && (macdCurrent > signalCurrent);
bool macdSell = (macdPrev > signalPrev) && (macdCurrent < signalCurrent);
MACDはトレンドの勢いを示す指標なので、
移動平均線やRSIと組み合わせて「トレンド方向の押し目を狙う」ようなロジックに発展させることもできます。
複数インジケーターを組み合わせたEA設計の考え方
ここまで見てきたように、MT4ではインジケーターごとに専用の関数が用意されています。
EAでは、これらを自由に組み合わせてオリジナルのロジックを組み立てることができます。
組み合わせ方の代表例をいくつか挙げます。
- トレンド系(移動平均線、MACD)で方向性を決める
- オシレーター系(RSI、ストキャスティクス)でタイミングを測る
- ボラティリティ系(ATR、ボリンジャーバンド)で損切り幅や利確幅を調整する
例えば、以下のようなロジックは初心者にも扱いやすく、EA化しやすい組み合わせです。
- 200MAより価格が上(上昇トレンド)
- MACDがシグナルを上抜けして上昇方向の勢いが出ている
- RSIが一度30近くまで低下してから、30を上抜けして反発している(押し目)
このように、トレンド・モメンタム・押し目の3つの観点を組み合わせると、
感覚的に「良さそう」だと感じていたポイントを、論理条件としてEAに落とし込むことができます。
リスク管理とロット設計:ロジックより重要な部分
どんなに優れたインジケーターの組み合わせでも、
リスク管理が甘いEAは長期的には破綻しやすくなります。
特に初心者が見落としやすいポイントとして、次のようなものがあります。
- 1トレードあたりのリスク(損失許容額)を決めていない
- 証拠金に対してロットが大きすぎる
- 連敗時のドローダウンを想定していない
- スプレッドやスリッページの影響を無視している
EAでは、損失許容額を基準にロットを計算する方法が有効です。
例えば、口座残高の2%を1トレードの最大損失にする場合、
損切り幅と通貨ペアのポイント値からロットを計算します。
double AccountRiskPercent = 2.0;
double StopLossPips = 30.0;
double riskMoney = AccountBalance() * AccountRiskPercent / 100.0;
double pipValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double lot = riskMoney / (StopLossPips * pipValue);
実運用では、ブローカーの最小ロット・ステップに合わせて丸める処理が必要ですが、
「口座残高×リスク%」を出発点とする考え方を身につけておくと、
ロジックが多少ブレても口座の生存率を高めることができます。
バックテストと最適化:インジケーターEAを検証する手順
EAを作ったら、必ず過去のデータで検証します。
MT4のストラテジーテスターを使えば、
自分が組んだインジケーター組み合わせが過去相場でどのような成績だったかを確認できます。
初心者が抑えておきたいポイントは以下の通りです。
- 最初は期間を絞り、動作確認を優先する(例:直近1年)
- レポートの「最大ドローダウン」と「PF(プロフィットファクター)」に注目する
- 良さそうなら、期間を伸ばして複数の相場局面で検証する
- パラメータ最適化は「やりすぎない」(過剰最適化に注意)
インジケーターEAは、パラメータを変えるだけで見かけ上の成績が大きく変わってしまいます。
しかし、過去データに合わせすぎると、将来の相場で通用しない「カーブフィッティング」になりがちです。
おすすめは、シンプルなルール+少数のパラメータにとどめ、
「過去10年のうち、多くの期間でそこそこ安定しているか」を見ることです。
一部分だけ極端に成績が良いEAよりも、
どの年でも大負けしにくいEAの方が実運用向きです。
よくある失敗と改善のヒント
最後に、インジケーターEAを作る初心者が陥りやすい失敗パターンと、その改善ヒントをまとめます。
失敗1:インジケーターを増やしすぎる
「この条件も、あの条件も」と加えていくと、
いつの間にかエントリー回数が極端に減り、
バックテスト上は勝率が高く見えても、実運用ではほとんど取引しないEAになってしまうことがあります。
改善ヒント:
最初は「方向を決める指標+タイミングを測る指標」の2つ程度に絞り、
条件を足したときと引いたときの結果を比較しながら調整していきましょう。
失敗2:損切りが広すぎる/利確が近すぎる
バックテストの成績を良く見せるために、損切りを極端に広く、利確を非常に近く設定すると、
勝率だけが高い「一見優秀なEA」が出来上がります。
しかし、連敗が続くと一気に口座が危険になるリスクがあります。
改善ヒント:
インジケーターだけでなく、ATRなどのボラティリティ指標を参考にして、
その通貨ペアの値動きに見合った損切り幅を設定することをおすすめします。
失敗3:実際の約定条件を考慮していない
ストラテジーテスターでは、スプレッド・スリッページ・約定拒否などが現実より甘く見積もられる場合があります。
特に短期足でのスキャルピング系EAでは、
これらの影響が成績に大きく響きます。
改善ヒント:
バックテストだけで判断せず、必ずデモ口座でフォワードテストを行いましょう。
また、スプレッドが一定以上のときは取引を控えるなど、
現実の取引コストを考慮した条件を追加することも有効です。
まとめ:インジケーターEA作りは「シンプル+検証」が鍵
MT4を使ったEA作成は、一見ハードルが高く感じられますが、
実際には「インジケーターの値を取得し、論理条件で売買を判断する」だけのシンプルな仕組みです。
本記事で紹介したように、移動平均線・RSI・MACDといった基本インジケーターだけでも、
- トレンド方向を決める(移動平均線、MACD)
- 押し目・戻りを捉える(RSI)
- エントリーポイントを絞り込む(インジケーター組み合わせ)
といった形で、十分に実用的なロジックを組むことができます。
最初から完璧なEAを目指す必要はありません。
まずはシンプルなインジケーターEAを一つ完成させ、
バックテストやデモ運用を通じて「どこを改善すべきか」を体感することが、
長期的に自分のスタイルに合った自動売買ロジックを育てる近道になります。
少しずつ条件を変えたり、別のインジケーターを試したりしながら、
ご自身の相場観と数字の裏付けが一致するロジックを作り上げていきましょう。


コメント