MT4(MetaTrader4)は、個人投資家でも本格的な自動売買ができるプラットフォームとして広く利用されています。本記事では、裁量トレードではなく「インジケーターを使ったEA(エキスパートアドバイザー)を自作する」という視点から、MT4での自動売買の全体像と具体的なステップを解説します。
難しい数式や高度なプログラミング知識がなくても、自分の頭の中にある「こう動いてほしい」という売買ルールを、インジケーターとシンプルなMQL4コードに落とし込むことは十分可能です。この記事を読み終えるころには、「どのようにルールを整理し、どのようにインジケーターを組み合わせてEAを作るか」という全体像がイメージできるようになることを目指します。
MT4自動売買の基本構造を理解する
まずは、MT4の自動売買がどのような仕組みで動いているのか、ざっくりと押さえておきます。細かいプログラム構文の前に「構造」を理解しておくと、インジケーターEA作りの全体像がつかみやすくなります。
EA(エキスパートアドバイザー)とは何か
EAは、MT4上でチャートにセットして稼働させる自動売買プログラムです。やっていることを分解すると、次の3つに過ぎません。
- ① チャートから価格やインジケーターの値を取得する
- ② 売買ルールに基づいて「エントリーするか・しないか」を判断する
- ③ 実際の売買注文や決済注文を発注・管理する
多くのEAは高度なことをしているように見えますが、結局はこの3ステップを高速に繰り返しているだけです。インジケーターEAを作るときも、この枠組みの中で「どのインジケーターを使って②の判断をするのか」を設計する作業になります。
EAが動くタイミング:OnTick と OnTimer
MQL4ではEAのメイン処理は通常 OnTick() という関数の中に書きます。これは価格が更新されるたび(ティックが到来するたび)に自動的に呼び出される関数で、ここでインジケーターの値を読んだり、エントリー条件をチェックしたりします。
一方、一定時間ごとに処理をしたい場合には OnTimer() を使う方法もありますが、インジケーターEAの入門段階では、まず OnTick() ベースで考えると理解しやすいです。
インジケーターEAの設計プロセス:頭の中のルールを言語化する
次に、インジケーターEAを設計するプロセスを、実務的な手順に分解していきます。プログラムを書く前に、このステップを丁寧にやるかどうかでEAの完成度が大きく変わります。
ステップ1:時間軸(タイムフレーム)を決める
まず最初に決めるべきは、「どの時間足でEAを動かすのか」です。たとえば次のような典型パターンがあります。
- M5やM15:短期のスキャル・デイトレ向き。シグナルは多いがノイズも多い。
- H1やH4:落ち着いたデイトレ・スイング。インジケーターのダマシが比較的少ない。
- D1:ゆったりしたスイング〜ポジショントレード。エントリーは少ないが、1回の値幅が大きくなりやすい。
時間足を決めずにインジケーターを選び始めると、ロジックが散漫になります。「H1のトレンドフォローEAを作る」「M15でレンジブレイクEAを作る」といった形で、ターゲットを最初に定義しておきましょう。
ステップ2:相場のタイプを決める(トレンド or レンジ)
多くの初心者EAが失敗する理由の1つは、「トレンドとレンジをごちゃ混ぜにしてしまうこと」です。
インジケーターEAを作るときは、次のどちらかにまずは絞ることをおすすめします。
- トレンド相場で利益を狙うトレンドフォロー型EA
- レンジ相場で逆張りを狙うレンジ逆張り型EA
トレンドフォロー型なら、移動平均線(MA)、MACD、ADXなど
レンジ逆張り型なら、RSI、ストキャスティクス、ボリンジャーバンドなど
といったように、「選ぶべきインジケーター」が明確になります。
ステップ3:メインインジケーターとフィルターインジケーターを分ける
インジケーターEAを作るときの基本構造は「メインシグナル + フィルター」です。
- メインインジケーター:エントリーのタイミングを直接決める指標
- フィルターインジケーター:ノイズの多いサインを間引くための補助指標
例えば、次のような組み合わせが考えられます。
- メイン:RSIの70超え/30割れで売買
- フィルター:H1の移動平均線の向きで「上昇トレンド中だけRSIの押し目買いを許可」
このようにメインとフィルターを明確に分けておくと、ロジックを整理しやすく、後から検証・改善もしやすくなります。
代表的なインジケーター別:EAへの組み込み方
ここからは、具体的なインジケーターごとに「EAでどう使うか」のイメージを解説します。すべてを一度に使う必要はなく、「1つのEAにつきメイン1〜2個 + フィルター1個」くらいが扱いやすいバランスです。
移動平均線(MA)を使ったトレンドフォローEA
もっともシンプルなトレンド系インジケーターが移動平均線(Moving Average)です。EAでの典型的な使い方は次の2つです。
- 短期MAと長期MAのクロスをトリガーにする(ゴールデンクロス・デッドクロス)
- 終値がMAの上か下かで上昇・下降トレンドを判定する
例えば、H1チャートで次のようなルールを設計できます。
- 短期MA:20、長期MA:80
- 20MAが80MAを上抜けたバーの終値で買いエントリー
- 20MAが80MAを下抜けたバーの終値で売りエントリー
- 逆クロスが出たら決済
実際のEAでは、「クロスしているかどうか」を iMA() 関数で取得した値の大小で判定します。クロスの検出を1本前のバーで確定させるか、現在のバーでリアルタイムに見るかによって、シグナルの数やダマシの頻度が変わります。
RSIを使った押し目買い・戻り売りEA
RSI(Relative Strength Index)は、一定期間内の上昇圧力と下落圧力のバランスを示すオシレーターです。EAでは次のように使うことができます。
- RSIが30以下:売られすぎ → 買いを検討
- RSIが70以上:買われすぎ → 売りを検討
しかし、RSIだけで逆張りすると、強いトレンド相場では逆行をつかまされやすくなります。そこで、次のようなフィルターを組み合わせると実用性が上がります。
- H1の200MAより価格が上にあるときだけ、RSI30以下を「押し目買い」として使う
- H1の200MAより価格が下にあるときだけ、RSI70以上を「戻り売り」として使う
このように「上位足のトレンド + 下位足のオシレーター」という組み合わせは、多くのインジケーターEAで有効なパターンです。
ボリンジャーバンドを使ったレンジ逆張りEA
ボリンジャーバンドは、価格の標準偏差を利用したインジケーターで、「バンドの外に飛び出したら戻りやすい」という性質を活かした逆張りロジックに向いています。
例えばM15のレンジ相場を想定すると、次のようなEAロジックが考えられます。
- 期間20・偏差2.0のボリンジャーバンドを使用
- 終値が上側バンドより上で確定したら売りエントリー
- 終値が下側バンドより下で確定したら買いエントリー
- TPはミドルバンド(中央線)付近、SLはバンドの外側に一定pips(例:1.5倍のバンド幅)
ただし、トレンド相場ではバンドをブレイクしてそのまま走るため、トレンド判定フィルター(例:ADXが一定以上ならトレンドとみなしてエントリーしない)を入れると、ドローダウンを抑えやすくなります。
MQL4でインジケーターを呼び出す基本
次に、実際にMQL4でインジケーターの値を取得する方法を、なるべくシンプルな形で確認します。ここではMT4の標準インジケーターを使う前提で話を進めます。
代表的なインジケーター呼び出し関数
MQL4では、インジケーターごとに専用の関数が用意されています。よく使う関数の例は次の通りです。
iMA():移動平均線(Moving Average)iRSI():RSIiBands():ボリンジャーバンドiMACD():MACDiStochastic():ストキャスティクス
例えば、現在の足(バー)のRSI(14)を取得するコードは次のようになります。
// 現在のシンボル・現在の時間足のRSI(14)を取得
double rsi = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);
NULL は「現在の通貨ペア」、0 は「現在の時間足」を意味します。最後の 0 は「何本目のバーか」という指定で、0が「最新の進行中バー」、1が「確定した1本前のバー」です。EAでは、シグナルの安定性を重視して、1本前の確定バー(shift = 1)で判定することも多いです。
クロス判定の基本ロジック
インジケーターEAでは、「クロス」を検出する場面が頻繁に登場します。例えば、短期MAと長期MAのゴールデンクロスを検出するには、次のようなロジックを使います。
// 1本前と2本前の短期・長期MAを取得
double maShortPrev = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
double maLongPrev = iMA(NULL, 0, 80, 0, MODE_SMA, PRICE_CLOSE, 1);
double maShortPrev2 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 2);
double maLongPrev2 = iMA(NULL, 0, 80, 0, MODE_SMA, PRICE_CLOSE, 2);
// ゴールデンクロス判定:前までは短期 < 長期、直近で短期 > 長期
bool isGoldenCross = (maShortPrev2 < maLongPrev2) && (maShortPrev > maLongPrev);
このように、「1本前」と「2本前」のインジケーター値を比較することで、クロスが発生した瞬間を検出することができます。RSIやMACD、ストキャスティクスでも同様の考え方でクロスを判定できます。
シンプルなインジケーターEAの全体構造例
ここでは、移動平均線とRSIを組み合わせたシンプルなEAの疑似コードを示します。実運用前には必ずテストと調整が必要ですが、「EAがどのような構造で動いているか」をイメージする助けになります。
ロジック概要:トレンドフォロー + 押し目買い
- 時間足:H1
- トレンド判定:200MA
- 押し目検出:RSI(14)
ルールは次のようにします。
- 価格が200MAより上にあるときだけ買いエントリーを検討
- RSIが30以下になったら「押し目シグナル」として、次のバーの始値で買いエントリー
- 利確:エントリー価格から+60pips
- 損切り:エントリー価格から-40pips
- ポジションは常に1つのみ(マーチンゲールやナンピンは使わない)
コード断片イメージ(MQL4)
int OnInit()
{
// 初期化処理(パラメータチェックなど)
return(INIT_SUCCEEDED);
}
void OnTick()
{
// 1. すでにポジションを持っているかチェック
if(PositionsTotal() > 0) return;
// 2. トレンド判定:200MA
double ma200 = iMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 1);
double close1 = iClose(NULL, 0, 1);
bool isUpTrend = (close1 > ma200);
if(!isUpTrend) return; // 上昇トレンド以外は何もしない
// 3. RSIで押し目判定
double rsi1 = iRSI(NULL, 0, 14, PRICE_CLOSE, 1);
if(rsi1 > 30) return; // 押し目条件を満たさない
// 4. ロット・SL・TPを設定して成行買い
double lot = 0.1;
double sl = NormalizeDouble(Ask - 40 * Point, Digits);
double tp = NormalizeDouble(Ask + 60 * Point, Digits);
OrderSend(Symbol(), OP_BUY, lot, Ask, 3, sl, tp, "MA+RSI EA", 0, 0, clrBlue);
}
実際にはエラー処理やスプレッドチェック、スリッページ対策なども必要ですが、「インジケーター値を取得し、条件を満たしたら発注する」という流れはこのようなシンプルな形です。
具体的な作成手順:ゼロからインジケーターEAを組む
ここまでの内容を踏まえ、実際にゼロからインジケーターEAを作る手順を時系列でまとめます。
手順1:アイデアを紙に書き出す
いきなりMetaEditorを開かず、まずは紙やメモアプリに次の項目を書き出します。
- どの時間足で動かすのか(例:H1)
- トレンド相場狙いかレンジ相場狙いか
- メインインジケーターは何か(例:RSI)
- フィルターインジケーターは何か(例:200MA)
- エントリー条件を「if文で書ける形」に分解できているか
- 利確と損切り、時間による手仕舞いルールはどうするか
この段階であいまいな部分が多いと、EAに落とし込んだ際にロジックがブレてしまいます。「誰が読んでも同じ解釈になる文言」になるまで、条件を具体化しておくことが大切です。
手順2:既存のサンプルEAをベースにする
MT4には標準でいくつかのサンプルEAが付属しています。まったくの白紙から書くよりも、サンプルEAの構造を参考にしながら、不要な部分を削り、自分のロジックに置き換えていくほうが理解も早く、安全です。
例えば、サンプルEAで「エントリー条件の部分」だけを書き換えて、自分のインジケーター条件に差し替えるというアプローチが有効です。
手順3:テスト用のミニマム版EAを作る
いきなり多機能なEAを作ろうとせず、「エントリー + 固定SL/TP + 1ポジションのみ」という最小構成で動くバージョンを先に完成させます。
例えば次のような制限をあえて設けます。
- ロット固定(例:0.1)
- 指値・逆指値は使わず成行のみ
- 損切り・利確はpips固定
- トレーリングストップ・分割決済などは搭載しない
この「ミニマム版」でインジケーターの条件が想定どおりに動いているかを確認したうえで、段階的に機能を追加していく方が、バグの原因を特定しやすくなります。
リスク管理と現実的な期待値設定
インジケーターEAを自作すると、「バックテストで非常にきれいな右肩上がりの曲線」を作りたくなります。しかし、過度にパラメータを最適化したEAは、実運用で性能が大きく劣化しやすいです。
過剰最適化(オーバーフィッティング)を避ける
インジケーターの期間やしきい値を細かくいじっていくと、特定の過去期間にだけ異常に強いEAを作ることができます。これは「その期間のノイズに合わせただけ」の可能性が高く、将来の相場では同じパフォーマンスを再現できないことが多いです。
過剰最適化を避けるためには、次のような工夫が有効です。
- パラメータは「直感的に意味のある値」だけを試す(例:RSI期間14、21など)
- バックテスト期間を長めに取り、相場環境の違う局面をまたぐ
- 異なる通貨ペア・時間足でも大きく崩れないかを確認する
損失を前提にした資金管理
どれだけロジックを工夫しても、負けトレードを完全にゼロにすることはできません。重要なのは、「連敗しても生き残れるロットサイズ」で運用することです。
一般的な目安として、1トレードあたりのリスク(損切りまでの金額)が、口座残高の1〜2%に収まるようにロットを調整する手法がよく使われます。EA内でロットを自動計算する場合も、このようなリスク許容度を基準に設計すると、口座破綻のリスクを抑えやすくなります。
実運用前に必ず行いたいチェック項目
インジケーターEAが一応完成し、バックテストでも問題なさそうに見えたとしても、そのまま高ロットで実運用を始めるのは危険です。少なくとも次のようなチェックを行っておくと、トラブルを避けやすくなります。
デモ口座でのフォワードテスト
バックテストではスリッページや約定拒否、サーバー負荷などの実運用ならではの要素が反映されません。そのため、まずはデモ口座で一定期間(例:数週間〜数か月)フォワードテストを行い、
- 想定どおりのタイミングでエントリー・決済されているか
- 異常な連続注文や、意図しない大量ポジションが発生していないか
- 経済指標発表時などのボラティリティ急増局面で挙動に問題がないか
といった点を確認します。デモの段階で明らかな不具合が見つかったら、ロジックやコードに立ち返って修正しましょう。
少額リアル口座での試験運用
デモで一定期間問題がなかったとしても、リアル口座ではスプレッドや約定品質が異なります。EAの挙動をより現実に近い条件で確認するために、少額のリアル口座で「テスト用ロット」で運用してみることも有効です。
この段階では、利益額よりも「EAが想定どおりに動いているか」「心理的にEA任せにできるか」に注目します。自分の許容リスクや生活スタイルに合わないEAは、たとえ期待値がプラスでも長く運用し続けるのが難しくなるためです。
まとめ:インジケーターEA作りは「ルールの言語化」と「シンプルさ」が鍵
本記事では、MT4でインジケーターを使ったEAを自作するための基本的な考え方と、具体的な設計・実装ステップを解説しました。内容を整理すると、次のポイントが重要になります。
- EAは「価格・インジケーターを読む → 条件判定 → 注文発注」というシンプルな構造で動いている
- インジケーターEAは「メインシグナル + フィルター」の構造で設計すると整理しやすい
- 時間足・相場タイプ(トレンド or レンジ)を最初に決めておくことで、インジケーター選択がブレにくくなる
- 移動平均線・RSI・ボリンジャーバンドなどの基本インジケーターだけでも、十分に実用的なEAを構築できる
- MQL4コードは、まず「ミニマム版EA」を完成させてから段階的に機能追加する
- 過剰最適化を避け、デモ → 少額リアルというステップを踏んで慎重に検証する
インジケーターEA作りは、一度流れをつかんでしまえば、ロジック違いのEAを量産し、ポートフォリオとして組み合わせていくことも可能です。最初の1本を完成させるまでが一番大変ですが、自分のアイデアがコードとなってチャート上で自動売買される体験は、裁量トレードとはまた違った大きな魅力があります。
まずは、本記事で紹介したようなシンプルなインジケーターEAから着手し、小さく試しながら、少しずつ自分なりのロジックと運用スタイルを磨いていくとよいでしょう。


コメント