FXやCFDの取引で「感情に左右されず、決めたルール通りに売買したい」と考える投資家にとって、MQL4でEAを作ることは非常に実用的な選択肢です。EAとはExpert Advisorの略で、MetaTrader4上で動く自動売買プログラムを指します。チャートを監視し、条件がそろえば注文を出し、保有ポジションを管理し、必要に応じて決済まで行う仕組みです。
ただし、EAは「作れば勝てる魔法の道具」ではありません。むしろ、裁量トレードで曖昧にしていた売買判断を数値化し、検証し、欠点を可視化するための道具です。優位性のないロジックをEAにしても、損失の発生速度が上がるだけです。一方で、ルール設計、資金管理、バックテスト、フォワードテスト、運用改善を正しい順番で進めれば、個人投資家でも再現性のある取引環境を作ることができます。
この記事では、MQL4でEAを作る流れを、初歩から実践レベルまで一気通貫で解説します。単なるプログラミング手順ではなく、「どのような売買ルールをEA化すべきか」「バックテストで何を見ればよいか」「最適化でやってはいけないこと」「実運用前に何を確認すべきか」まで、投資家が実際に使える視点で整理します。
- MQL4のEA作成で最初に理解すべきこと
- EA作成の全体像:いきなりコードを書かない
- 題材にするEA:移動平均線とATRを使ったトレンドフォロー
- EA化する前に売買ルールを文章で固定する
- MQL4コードの基本構造
- 実用的なMQL4コード例
- ロット設定は固定ロットから始める
- バックテストで見るべき指標
- スプレッドとスリッページを過小評価しない
- 時間帯フィルターを追加する考え方
- 最適化は「良い数字探し」ではなく耐久性確認
- フォワードテストなしで実資金投入しない
- EA運用で必須のリスク管理
- 初心者がやりがちな失敗
- EA改善の実践手順
- EAをポートフォリオとして考える
- 実運用前チェックリスト
- 投資家目線でのMQL4学習ロードマップ
- まとめ:EA作成は投資ルールを数値化する訓練である
MQL4のEA作成で最初に理解すべきこと
MQL4はMetaTrader4専用のプログラミング言語です。C言語に近い構文を持ち、価格データ、インジケーター、注文、ポジション情報にアクセスできます。EAを作る目的は、チャート上で発生する条件を機械的に判定し、売買を自動化することです。
初心者が最初に勘違いしやすいのは、「EA作成=複雑なロジックを組むこと」だと思い込む点です。実際には、最初に作るべきEAはできるだけ単純で構いません。移動平均線のクロス、RSIの一定水準、時間帯フィルター、固定損切り、固定利確など、理解しやすいルールから始めるべきです。複雑なEAほど強そうに見えますが、検証や改善が難しく、なぜ勝ったのか、なぜ負けたのかが見えにくくなります。
投資家目線で重要なのは、プログラムの美しさよりも、ルールの検証可能性です。たとえば「上がりそうだから買う」という判断はEAにできません。一方で、「20期間移動平均線が75期間移動平均線を上抜き、かつ直近のATRが一定以上なら買う」という条件ならEA化できます。EA化できるということは、過去データで検証できるということでもあります。
EA作成の全体像:いきなりコードを書かない
MQL4でEAを作るとき、最初にコードを書き始めるのは非効率です。まずは取引ルールを文章と数値で整理し、その後に疑似コードへ落とし込み、最後にMQL4へ変換する流れが安全です。
基本的な作成フローは、次のように考えると分かりやすくなります。第一に、売買対象を決めます。通貨ペア、時間足、取引時間、スプレッド許容範囲を決めます。第二に、エントリー条件を決めます。何が起きたら買うのか、何が起きたら売るのかを数値化します。第三に、決済条件を決めます。利確、損切り、反対シグナル、時間決済などを定義します。第四に、資金管理を決めます。固定ロットなのか、証拠金に対する一定割合なのか、連敗時にロットを下げるのかを明確にします。第五に、バックテストとフォワードテストで実用性を確認します。
この順番を守る理由は、EAの品質がコードよりも設計で決まるからです。どれほど正確にプログラムを書いても、売買ルールそのものに優位性がなければ長期的な成果は期待できません。反対に、単純なロジックでも相場の構造に合っていれば、実用的なEAになる可能性があります。
題材にするEA:移動平均線とATRを使ったトレンドフォロー
ここでは、具体例としてシンプルなトレンドフォロー型EAを考えます。条件は、短期移動平均線が長期移動平均線を上抜いたら買い、下抜いたら売りです。ただし、相場が動いていないレンジで頻繁にだましに遭うことを避けるため、ATRを使ってボラティリティが一定以上あるときだけエントリーする設計にします。
このEAの狙いは、強いトレンド初動に乗ることです。移動平均クロスだけでは遅れが出やすく、レンジ相場では損切りが連続しやすい欠点があります。そこでATRを加え、一定の値幅が発生している局面に限定します。これにより、すべての相場で勝とうとするのではなく、「動いている相場だけを取りに行く」という思想になります。
具体的な初期条件は、短期移動平均線を20期間、長期移動平均線を75期間、ATRを14期間、ATRの最低値を通貨ペアに応じて設定します。損切りはATRの1.5倍、利確はATRの3倍とし、リスクリワード比率はおおむね1対2を目安にします。固定pipsではなくATRを使うことで、相場の値動きに応じて損切り幅と利確幅が変化します。
EA化する前に売買ルールを文章で固定する
EA開発で最も危険なのは、バックテスト結果を見ながらルールを何度も都合よく変えることです。過去データに合わせて条件を微調整し続けると、見かけ上は非常に高い成績になります。しかし、将来の相場では機能しにくくなります。これはカーブフィッティングと呼ばれ、個人投資家がEA開発で失敗する典型例です。
そのため、最初に売買ルールを文章で固定します。たとえば、買い条件は「前の足で短期移動平均線が長期移動平均線以下、現在の確定足で短期移動平均線が長期移動平均線を上回り、ATRが指定値以上の場合に買い」とします。売り条件はその逆です。決済条件は「損切りまたは利確に到達した場合、または反対方向のクロスが発生した場合」とします。
ここで重要なのは、現在進行中の未確定足ではなく、確定足を使うことです。未確定足のインジケーター値は価格変動により変わるため、バックテストと実運用の結果がズレやすくなります。初心者が作るEAでは、まず確定足ベースで判定する方が堅実です。
MQL4コードの基本構造
MQL4のEAは、主に初期化処理、終了処理、ティックごとの処理で構成されます。代表的なのがOnInit、OnDeinit、OnTickです。OnInitはEA起動時に一度だけ実行されます。OnTickは価格が更新されるたびに実行されます。実際の売買判定はOnTick内に書くことが多いですが、毎ティック注文判定をすると重複注文が発生しやすいため、新しい足が確定したタイミングだけ処理する設計が有効です。
初心者向けEAでは、まず「新しい足ができたか」を判定し、足が更新されたときだけ売買条件を確認します。これにより、同じ足の中で何度も注文する事故を防げます。さらに、すでにポジションを持っている場合は新規注文を出さない、あるいは同一方向の追加注文を制限するなど、基本的な安全装置を入れます。
EAの基本パーツは、パラメータ、シグナル判定、注文処理、ポジション確認、決済処理、エラー処理です。これらを分けて考えると、コード全体の見通しが良くなります。最初から完璧な設計を目指す必要はありませんが、売買条件と注文処理を混ぜすぎると後から修正しにくくなります。
実用的なMQL4コード例
以下は、移動平均線クロスとATRフィルターを使ったEAの基本例です。実運用前提の完成品ではなく、学習と検証の土台として見るべきコードです。実際に使う場合は、ブローカーの桁数、スプレッド、約定条件、VPS環境などに合わせて確認が必要です。
#property strict
input double Lots = 0.10;
input int FastMAPeriod = 20;
input int SlowMAPeriod = 75;
input int ATRPeriod = 14;
input double MinATR = 0.0010;
input double StopATR = 1.5;
input double TakeATR = 3.0;
input int Slippage = 3;
input int MagicNumber = 153001;
static datetime lastBarTime = 0;
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnTick()
{
if(Time[0] == lastBarTime) return;
lastBarTime = Time[0];
if(OrdersTotalByMagic(MagicNumber) > 0) return;
double fastPrev = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
double fastNow = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double slowPrev = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
double slowNow = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double atr = iATR(NULL, 0, ATRPeriod, 1);
if(atr < MinATR) return;
if(fastPrev <= slowPrev && fastNow > slowNow)
{
OpenBuy(atr);
}
else if(fastPrev >= slowPrev && fastNow < slowNow)
{
OpenSell(atr);
}
}
int OrdersTotalByMagic(int magic)
{
int count = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderMagicNumber() == magic && OrderSymbol() == Symbol())
{
count++;
}
}
}
return count;
}
void OpenBuy(double atr)
{
double price = Ask;
double sl = NormalizeDouble(price - atr * StopATR, Digits);
double tp = NormalizeDouble(price + atr * TakeATR, Digits);
int ticket = OrderSend(Symbol(), OP_BUY, Lots, price, Slippage, sl, tp, "MA ATR Buy", MagicNumber, 0, clrBlue);
if(ticket < 0)
{
Print("Buy order failed. Error: ", GetLastError());
}
}
void OpenSell(double atr)
{
double price = Bid;
double sl = NormalizeDouble(price + atr * StopATR, Digits);
double tp = NormalizeDouble(price - atr * TakeATR, Digits);
int ticket = OrderSend(Symbol(), OP_SELL, Lots, price, Slippage, sl, tp, "MA ATR Sell", MagicNumber, 0, clrRed);
if(ticket < 0)
{
Print("Sell order failed. Error: ", GetLastError());
}
}
このコードのポイントは、確定足を使って移動平均線クロスを判定していることです。インデックス1は直近の確定足、インデックス2はその1本前の確定足です。これにより、現在形成中の足で一時的にクロスしただけのシグナルを避けられます。
また、OrdersTotalByMagicという関数で、同じマジックナンバーかつ同じ通貨ペアのポジションがあるかを確認しています。マジックナンバーとは、EAごとに注文を識別するための番号です。複数のEAを同時に動かす場合、これを適切に分けないと、別のEAのポジションを誤って管理するリスクがあります。
ロット設定は固定ロットから始める
EAを作るとき、最初から複雑な複利ロットやマーチンゲールを入れる必要はありません。むしろ、検証初期は固定ロットが適しています。理由は、ロジックそのものの優位性を確認しやすいからです。ロットが変動すると、損益曲線が資金管理の影響を強く受け、売買ロジックの実力が分かりにくくなります。
固定ロットでバックテストし、取引回数、勝率、平均利益、平均損失、最大ドローダウン、プロフィットファクターを確認します。その後、実運用を想定してリスク率ベースのロット計算に進むのが自然です。たとえば、1回の損失を口座残高の1%以内に抑える設計にすれば、連敗時でも資金の減少を制御しやすくなります。
初心者にとって特に危険なのは、負けた後にロットを上げて取り返そうとする設計です。これは短期的に成績を良く見せることがありますが、一定回数の連敗で急激に破綻します。EAは感情を排除できる反面、危険な資金管理も忠実に実行してしまいます。だからこそ、最初はシンプルな固定ロットでロジックを評価することが重要です。
バックテストで見るべき指標
MetaTrader4にはストラテジーテスターがあり、過去データを使ってEAの成績を確認できます。ただし、バックテスト結果の純利益だけを見て判断するのは危険です。純利益はロット設定や期間選択で大きく変わります。投資家として見るべきなのは、利益の出方が安定しているか、ドローダウンが許容範囲か、取引回数が十分か、特定期間だけに利益が偏っていないかです。
まず確認すべき指標は最大ドローダウンです。最大ドローダウンが大きすぎるEAは、利益が出ていても実運用で継続しにくくなります。たとえば、年利30%を狙えるEAでも、途中で50%の資金減少があるなら、多くの投資家は運用を止めてしまいます。机上の期待値よりも、継続できるリスク水準が重要です。
次にプロフィットファクターを見ます。これは総利益を総損失で割った値です。1.0を下回れば損失超過、1.0を上回れば利益超過です。ただし、プロフィットファクターが高すぎる場合も注意が必要です。取引回数が少ない、過剰最適化されている、たまたま強いトレンド期間だけを拾っている可能性があります。
さらに、月別損益を確認します。総合成績が良くても、利益のほとんどが一部の月に集中しているEAは不安定です。理想は、勝つ月と負ける月がありながらも、長期で右肩上がりになる形です。全期間で完璧に勝つEAを探すのではなく、負ける局面を理解できるEAを選ぶ方が実運用に向いています。
スプレッドとスリッページを過小評価しない
バックテストで良い結果が出ても、実運用で成績が悪化する大きな原因がスプレッドとスリッページです。特に短期売買EAでは、1回あたりの平均利益が小さいため、取引コストの影響が非常に大きくなります。たとえば平均利益が3pipsのEAでは、スプレッドが1pips広がるだけで期待値が大幅に悪化します。
このため、EA設計時には、取引頻度と平均利益幅を確認する必要があります。スキャルピング型EAは魅力的に見えますが、約定環境への依存度が高く、個人投資家が安定運用するには難易度が上がります。最初に作るEAでは、1回の利幅をある程度確保する設計の方が扱いやすいです。
また、経済指標発表時や早朝など、スプレッドが広がりやすい時間帯を避けるフィルターも有効です。たとえば、取引時間を日本時間の夕方から深夜に限定する、あるいはサーバー時間で特定時間だけ稼働する設計にします。時間帯フィルターはシンプルですが、EAの安定性を高めるうえで非常に実用的です。
時間帯フィルターを追加する考え方
同じ売買ロジックでも、時間帯によって成績が大きく変わることがあります。東京時間は値動きが限定的になりやすく、ロンドン時間からニューヨーク時間にかけてボラティリティが高まりやすい傾向があります。もちろん通貨ペアによって違いますが、EA開発では時間帯別の成績を必ず確認すべきです。
たとえば、移動平均クロス型EAがレンジ相場で弱いなら、値動きが出やすい時間帯に限定することで改善する可能性があります。逆に、逆張り型EAなら、急激なトレンドが出やすい時間帯を避ける方が安定する場合があります。
MQL4ではTimeHour(TimeCurrent())などを使ってサーバー時間を取得し、指定した時間帯だけ取引する条件を入れられます。ただし、サーバー時間はブローカーによって異なるため、日本時間と一致するとは限りません。バックテストと実運用で時間のズレが出ないよう、ブローカーのサーバー時間を確認しておく必要があります。
最適化は「良い数字探し」ではなく耐久性確認
MetaTrader4の最適化機能を使えば、移動平均線の期間、ATR倍率、損切り幅、利確幅などを大量に組み合わせてテストできます。しかし、最適化は非常に危険な工程でもあります。過去データで最も利益が出たパラメータをそのまま採用すると、将来の相場で機能しない可能性が高くなります。
実用的な最適化では、最高成績の一点を探すのではなく、近いパラメータ群でも成績が大きく崩れないかを確認します。たとえば、短期移動平均線が18、20、22のいずれでも大きく崩れず、長期移動平均線が70から80の範囲で安定しているなら、そのロジックは比較的頑健と考えられます。反対に、20と75の組み合わせだけが突出して良く、少しズレると成績が悪化するなら、過去データへの適合が疑われます。
最適化の目的は、未来を当てることではありません。ロジックが多少の環境変化に耐えられるかを確認することです。個人投資家がEAを長く使うには、最高利益よりも安定性を優先すべきです。
フォワードテストなしで実資金投入しない
バックテストで良い結果が出ても、すぐに実資金で動かすべきではありません。必ずデモ口座または小ロットでフォワードテストを行います。フォワードテストとは、過去データではなく、現在進行中の相場でEAを動かし、想定通りに注文・決済されるかを確認する作業です。
フォワードテストで見るべき点は、利益が出るかどうかだけではありません。注文が重複していないか、損切りと利確が正しく入っているか、スプレッド拡大時に不自然な約定がないか、VPSやPCの再起動後も問題なく動くか、ログにエラーが出ていないかを確認します。
特に初心者は、バックテスト結果だけで安心しがちです。しかし、実運用では通信遅延、約定拒否、スリッページ、サーバー停止、証拠金不足など、バックテストでは見えにくい問題が発生します。EA開発の実力は、コードを書いた時点ではなく、想定外の挙動を潰していく段階で身につきます。
EA運用で必須のリスク管理
EAは24時間動かせるため、裁量トレードよりも取引回数が増えやすくなります。その分、リスク管理を甘くすると資金減少も速くなります。最初に決めるべきなのは、1回のトレードで許容する損失額、1日あたりの最大損失、1週間あたりの最大損失です。
たとえば、口座残高100万円で1回の損失を1%に抑えるなら、1回あたりの許容損失は1万円です。損切り幅が50pipsなら、1pipsあたり200円になるようロットを調整します。こうした計算をせずにロットだけ決めると、通貨ペアや損切り幅によって実質的なリスクが大きく変わります。
また、EAが一定の連敗に入った場合に停止するルールも有効です。たとえば、1日3連敗で停止、1週間の損失が口座残高の5%に達したら停止、重要指標発表日は稼働しないなどです。EAを止めるルールは、利益を伸ばすルールと同じくらい重要です。
初心者がやりがちな失敗
MQL4でEAを作り始めた投資家がよく失敗するのは、まず複雑なインジケーターを大量に入れてしまうことです。移動平均線、RSI、MACD、ボリンジャーバンド、一目均衡表を同時に使えば強くなるように見えますが、実際には条件が複雑になり、取引回数が減り、検証しにくくなります。優位性の源泉が分からないEAは改善できません。
次に多い失敗は、バックテスト期間を都合よく選ぶことです。上昇トレンドだけ、ボラティリティが高い時期だけ、特定の通貨ペアだけで好成績になるEAは、相場環境が変わると崩れます。最低でも複数年、複数局面で確認し、トレンド相場、レンジ相場、急変相場のそれぞれでどのような負け方をするかを見るべきです。
もう一つの失敗は、損切りを広げすぎることです。損切りを広げれば勝率は上がりやすくなります。しかし、たまに発生する大損でそれまでの利益を失う可能性があります。EA評価では勝率だけでなく、平均利益と平均損失、最大連敗、最大ドローダウンを必ずセットで見ます。
EA改善の実践手順
EAを改善するときは、一度に多くの変更を加えないことが重要です。エントリー条件、決済条件、時間帯、ロット管理を同時に変えると、何が改善要因だったのか分からなくなります。改善は一つずつ行い、変更前後の成績を比較します。
たとえば、移動平均クロスEAの成績がレンジ相場で悪い場合、最初にATRフィルターを追加します。それでも改善しなければ、時間帯フィルターを追加します。次に、反対シグナル決済を入れるかどうかを検証します。さらに、利確幅を固定ではなくトレーリングストップに変えるかを検討します。このように段階的に変更すれば、どの要素が成績に効いているかを把握できます。
改善のゴールは、完璧なEAを作ることではありません。自分が理解でき、負け方を許容でき、継続的に監視できるEAを作ることです。負ける理由が説明できないEAは、たとえ過去成績が良くても実運用では不安が残ります。
EAをポートフォリオとして考える
一つのEAだけで常に利益を出そうとすると、相場環境の変化に弱くなります。実践的には、複数のEAを組み合わせてポートフォリオ化する考え方が有効です。トレンドフォロー型、逆張り型、時間帯限定型、通貨ペア分散型など、異なる特性を持つEAを組み合わせることで、単一ロジックへの依存を下げられます。
ただし、EAを増やせば安全になるわけではありません。同じようなロジックを複数動かしても、相場が逆行したときに同時に負ける可能性があります。重要なのは、損益の相関を確認することです。あるEAが負ける局面で別のEAが耐える、あるいは違うタイミングで取引する組み合わせが望ましいです。
個人投資家の場合、最初は一つのEAを深く理解し、その後に別タイプのEAを追加する方が現実的です。運用するEAが増えるほど、ログ確認、稼働管理、証拠金管理、バージョン管理が必要になります。EA開発は作って終わりではなく、運用管理まで含めて一つの投資プロセスです。
実運用前チェックリスト
EAを実口座で動かす前には、最低限のチェックリストを用意します。まず、バックテストの期間と条件を記録します。次に、フォワードテストで注文と決済が想定通りだったかを確認します。さらに、スプレッドが広い時間帯での挙動、通信停止時のリスク、VPS再起動後の復帰、マジックナンバーの重複、ロット計算、最大損失ルールを確認します。
特に、同じ口座で複数EAを動かす場合は、マジックナンバーと通貨ペアの管理が重要です。誤って別EAのポジションを決済してしまうと、検証結果も運用結果も崩れます。また、EA名、バージョン、設定値、稼働開始日を記録しておくと、後から成績を分析しやすくなります。
EAの設定ファイルを保存しておくことも重要です。バックテストで使った設定、デモ運用で使った設定、実運用で使った設定が混在すると、どの条件で成績が出たのか分からなくなります。小さな管理ミスが、長期的には大きな判断ミスにつながります。
投資家目線でのMQL4学習ロードマップ
MQL4を学ぶ順番は、一般的なプログラミング学習とは少し異なります。投資家に必要なのは、すべての文法を完璧に覚えることではなく、売買ロジックを正しく実装し、検証し、改善できる力です。そのため、まず変数、if文、関数、ループ、配列の基本を学びます。次に、iMA、iRSI、iATRなどのインジケーター関数を使えるようにします。その後、OrderSend、OrderClose、OrderModifyなどの注文関連関数を理解します。
次の段階では、ポジション管理を学びます。すでにポジションがあるか、買いか売りか、含み益はいくらか、損切りと利確は設定されているかを確認する処理です。EAの事故は、エントリー条件よりもポジション管理で起きることが多いため、この部分は慎重に学ぶ必要があります。
最後に、バックテストとログ確認に慣れます。EAが思った通りに動かないときは、Print関数で値を出力し、どの条件で注文が出たのか、なぜ注文されなかったのかを確認します。プログラミング力とは、複雑なコードを書く力ではなく、問題の原因を切り分ける力です。
まとめ:EA作成は投資ルールを数値化する訓練である
MQL4でEAを作る最大の価値は、自動売買そのものだけではありません。自分の売買ルールを数値化し、過去データで検証し、欠点を見える化できる点にあります。裁量トレードでは曖昧に済ませていた判断も、EAでは条件として明確に書かなければなりません。この作業を通じて、投資家は自分の戦略をより客観的に評価できるようになります。
実践の流れは、まず単純な売買ルールを文章で定義し、MQL4で小さく実装し、固定ロットでバックテストし、スプレッドや時間帯を考慮し、最適化ではなく耐久性を確認し、フォワードテストで実際の挙動を検証することです。そのうえで、リスク管理と運用停止ルールを決め、必要に応じて改善します。
EA開発で狙うべきなのは、過去最高益を出す派手なロジックではなく、負け方を理解できる堅実な仕組みです。相場には必ず合わない時期があります。そのときにロジックの弱点を把握していれば、停止、調整、分散といった判断ができます。MQL4は、個人投資家が自分の戦略を検証可能な形に変えるための強力な道具です。まずはシンプルなEAを一つ作り、動かし、検証し、改善するところから始めるのが最も実践的な第一歩です。


コメント