本記事では、FXトレーダーにとって定番のプラットフォームであるMT4(MetaTrader4)を使って、自分でEA(Expert Advisor)を組み、自動売買をスタートするまでの流れを丁寧に解説します。難しい数学や高度なプログラミング知識がなくても、「インジケーターの条件をコードに落とし込む」という考え方を押さえれば、シンプルな自動売買は十分に自作できます。
MT4とEA自動売買の全体像を理解する
まずは、MT4とEAの役割を整理しておきます。MT4はチャート表示や注文発注を行う取引プラットフォームであり、EAはその中で自動的に売買判断と注文処理を行うプログラムです。トレーダーが行っている「チャートを見る → 条件を判断する → エントリー/決済する」という作業を、EAが24時間ルール通りに淡々と実行してくれるイメージです。
EA自作の狙いは、「自分のルールを明文化し、機械にやらせること」です。裁量で何となく行っている判断を言語化できていない場合は、いきなりEAを組むのではなく、先にルールを文章やメモで整理するところから始めるとスムーズです。
EAを自作するために必要な環境と準備
1. MT4のインストールとデモ口座の準備
EAの開発とテストは、基本的にデモ口座で行うのが安全です。リアルマネーを動かす前に、動作確認とバックテストを十分に行う必要があります。
- FX会社のサイトからMT4をダウンロード・インストールする
- デモ口座を開設し、ログインしてチャートを表示できる状態にする
- 自動売買をオンにするための設定(ツール → オプション → 自動売買タブ)を確認する
2. MQL4エディタ(MetaEditor)を開く
EAのプログラムは、MQL4というMT4専用の言語で記述します。MT4から「MetaEditor」を起動すると、EAのテンプレート作成や編集、コンパイルが行えます。
- MT4上部メニューの「ツール」→「MetaQuotes Language Editor」から開く
- または、キーボードのF4キーでショートカット起動する
- MetaEditorで「新規作成」→「Expert Advisor (テンプレート)」を選び、EA名を付ける
最初のうちは、テンプレートからスタートし、不要な部分を消しながら「エントリー条件」「決済条件」「ロット数」など、最低限の要素だけに絞ったシンプルなEAを目指すと理解しやすくなります。
EAでよく使う基本インジケーター
EA自作の初心者がまず押さえておきたいインジケーターは、次のようなシンプルなものです。これらはMT4に標準搭載されており、MQL4からも簡単に呼び出せます。
- 移動平均線(MA):トレンドの方向や強さを把握
- RSI:買われ過ぎ・売られ過ぎのオシレーター
- MACD:トレンドと勢いを同時に見る複合指標
本記事では、「移動平均線+RSI」を組み合わせた、非常にシンプルなEAの考え方を例に解説します。この組み合わせは、トレンド方向を移動平均線で確認し、エントリーポイントをRSIで絞り込むという構造になっており、ロジックが直感的で初心者にも理解しやすいのが特徴です。
ロジック設計:移動平均線+RSIの基本戦略
EAをコードにする前に、「人間ならどう判断するか」を文章で明確にします。例えば、次のようなシンプルなロジックを設計できます。
- 時間足:1時間足
- 移動平均線:期間50の単純移動平均線(SMA)
- RSI:期間14、レベル30・70
売買ルールは以下のように定義します。
- 買いエントリー:終値が50SMAの上にあり、RSIが30から上に抜けたとき
- 売りエントリー:終値が50SMAの下にあり、RSIが70から下に抜けたとき
- 利確・損切り:固定pips(例:利確40pips、損切り20pips)
- ポジションは常に1つのみ保持し、新規エントリー時に既存ポジションがあれば決済してからエントリー
このように、数行の文章でロジックを説明できるようになるまで整理することが重要です。ここまでクリアになっていれば、MQL4でのコーディングは「この条件をそのまま書き下すだけ」になります。
MQL4でインジケーター値を取得する基本
MQL4では、各インジケーターの値を関数で取得します。例えば、移動平均線であればiMA()、RSIであればiRSI()を使います。終値や現在の価格も、Close[]やBid変数から取得できます。
移動平均線の値を取得する例
// 50期間のSMAを現在のバーで取得
double ma = iMA(NULL, PERIOD_H1, 50, 0, MODE_SMA, PRICE_CLOSE, 0);
RSIの値を取得する例
// 14期間RSIを現在のバーで取得
double rsi = iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE, 0);
ここで、引数NULLは「現在のチャート銘柄」、PERIOD_H1は「1時間足」を意味します。EAを特定の通貨ペアや時間足専用にしたい場合は、ここを固定値にせず、パラメータとして外部から変更できるようにする方法もあります。
シンプルなEAの骨組みを理解する
EAは通常、次の3つの主要な関数で構成されています。
- OnInit():EAがチャートにセットされたときに一度だけ実行される初期化処理
- OnDeinit():EAがチャートから外されるときに実行される終了処理
- OnTick():レートが更新されるたびに実行されるメイン処理
売買ロジックの多くはOnTick()の中に書きます。「現在ポジションがあるか」「エントリー条件を満たしているか」「利確・損切りに達しているか」などをここでチェックします。
具体例:移動平均線+RSIを使ったEAのイメージ
以下は、先ほどのロジックを簡略化したイメージコードです(実運用前には必ずデモ口座でテストし、ロジックや動作を確認してください)。
//+------------------------------------------------------------------+
//| Simple MA + RSI EA (イメージコード) |
//+------------------------------------------------------------------+
#property strict
input double Lots = 0.1;
input int TakeProfit = 40; // pips
input int StopLoss = 20; // pips
void OnTick()
{
// 1時間足のみで動かしたい場合
if(Period() != PERIOD_H1) return;
// 現在価格とインジケーター値を取得
double ma = iMA(NULL, PERIOD_H1, 50, 0, MODE_SMA, PRICE_CLOSE, 0);
double rsi = iRSI(NULL, PERIOD_H1, 14, PRICE_CLOSE, 0);
double price = Bid;
// 既存ポジション数を確認
int total = OrdersTotal();
// 買い条件:価格がMAの上、RSIが30を上抜け
bool buySignal = (Close[1] < ma && Close[0] > ma && rsi > 30);
// 売り条件:価格がMAの下、RSIが70を下抜け
bool sellSignal = (Close[1] > ma && Close[0] < ma && rsi < 70);
// シグナルが出たら、既存ポジションをクローズしてから新規エントリー
if(buySignal || sellSignal)
{
// 既存ポジションのクローズ
for(int i = total - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol())
{
if(OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 3);
else if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 3);
}
}
}
// 新規エントリー
double sl, tp;
if(buySignal)
{
sl = price - StopLoss * Point;
tp = price + TakeProfit * Point;
OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, sl, tp);
}
else if(sellSignal)
{
sl = price + StopLoss * Point;
tp = price - TakeProfit * Point;
OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, sl, tp);
}
}
}
上記はあくまで「ロジックをどう書き下すか」のイメージを示すためのサンプルです。実際に使う場合は、スプレッド・スリッページ・最小ロット制限・エラー処理など、多くの要素を追加で考慮する必要があります。
EA開発で初心者がつまずきやすいポイントと対処法
1. 条件が思ったタイミングで発動しない
インジケーター条件が頭の中のイメージと異なるタイミングで発動することはよくあります。例えば、「ローソク足が移動平均線を上抜け」と書いたつもりでも、実際には確定足ではなく、形成中の足で条件を見てしまい、ヒゲで一瞬抜けただけでエントリーしてしまう場合があります。
このようなズレを避けるには、一つ前の確定足の値を使うことが有効です。MQL4では、Close[0]が現在形成中の足、Close[1]が一つ前の確定足を意味します。トレンド判定やRSIのクロスを確認する際は、Close[1]側で条件を確認し、「確定したシグナル」のみを使うことでノイズを減らせます。
2. バックテスト結果が極端に良すぎる(過剰最適化)
パラメータを細かく調整しすぎると、過去データにだけ都合よく合わせたEAになりがちです。一見して非常に高い勝率や資産曲線を示していても、将来の相場では全く機能しないケースは少なくありません。
そのため、最初は「移動平均線:50」「RSI:14」など、一般的な設定のままにして、あえて細かい最適化は避ける方が、 過去にも未来にもそこそこ通用する可能性 のあるシンプルな戦略になりやすいです。あとから期間を変えてみる検証は有効ですが、「パラメータを動かすたびに期待値が大きく変わるEA」は注意が必要です。
3. リスク管理が曖昧なまま放置してしまう
EAは24時間自動で取引してくれる一方で、ロット設定や損切り幅を適切に決めておかないと、想定以上のドローダウンが発生する可能性があります。EA自作の段階で、次のようなルールもあわせて決めておきましょう。
- 1回のトレードで口座残高の何%までリスクを取るか(例:1%以内)
- 同時保有ポジション数の上限(例:1つのみ)
- 連敗が続いたときに一時停止するかどうか
これらをMQL4で自動化することも可能ですが、最初のうちはロットを小さく固定し、「EAの動き方を理解する期間」を十分に取ることが大切です。
インジケーター別EAアイデアの広げ方
基本パターンを一つ作れたら、「インジケーターだけ入れ替えたバリエーション」を試すことで、EAの理解も深まり、自分なりのロジックも増えていきます。例えば、次のような発展アイデアがあります。
- 移動平均線+MACD:トレンド方向をMA、エントリータイミングをMACDシグナルクロスで判断
- ボリンジャーバンド+RSI:レンジ局面でバンドタッチとRSIの反転を組み合わせる逆張りEA
- トレーリングストップ付きATR:ATRを使ってボラティリティに応じた損切り幅を自動調整
重要なのは、「インジケーターを増やすこと」ではなく、「役割を分担させること」です。例えば、トレンドの有無を見る指標+エントリータイミングを絞る指標+リスク管理を担う指標 というように、それぞれのインジケーターに役割を与えると、ロジック全体が整理されてきます。
EA開発の学習サイクル:作る → 試す → 振り返る
EA自作で上達するためには、次のサイクルを繰り返すことが非常に有効です。
- 紙やメモ帳に売買ルールを日本語で書き出す
- MQL4でロジックをコード化し、EAとしてコンパイルする
- ストラテジーテスターでバックテストし、トレード履歴とチャートを確認する
- 「なぜここでエントリーしたのか」「なぜここで損切りになったのか」を一つ一つ振り返る
- ルールそのものを見直すか、実装ミスを修正する
このプロセスを繰り返すことで、「インジケーターの意味」「相場環境による得意・不得意」「ロジックの弱点」が自分の言葉で説明できるようになっていきます。結果として、裁量トレードの質も向上し、「EAに任せる部分」と「自分で判断する部分」の切り分けも明確になります。
まとめ:まずはシンプルなEAから始めて理解を深める
MT4でEAを自作することは、一見するとハードルが高そうに感じられますが、実際には「売買ルールを言語化し、インジケーターの条件として書き下す」作業の積み重ねです。本記事で紹介したような、移動平均線とRSIを組み合わせたシンプルなEAからスタートすれば、プログラミング初心者でも「自分のルールを自動化する感覚」を掴みやすくなります。
最初から完璧なEAを目指す必要はありません。小さなロジックを一つずつ形にし、バックテストやデモ取引で挙動を確認しながら、少しずつ改善を重ねていくことが重要です。その過程で、相場の見方やリスク管理の考え方も自然と鍛えられていきます。
自分でEAを組めるようになると、「誰かが作ったEAを使う」という受け身のスタイルから、「相場に合わせて自分で戦略を組み立てる」という能動的なスタイルへとステップアップできます。MT4とMQL4を活用し、自分だけの自動売買戦略を少しずつ育てていきましょう。


コメント