MetaTrader4(MT4)は、裁量トレードだけでなく、自動売買(EA:Expert Advisor)を動かせるのが大きな魅力です。しかし「EAを自分で作る」と聞くと、多くの初心者の方は難しそうだと感じてしまいます。実際には、いくつかの基本パターンさえ押さえれば、「移動平均線」「RSI」「MACD」などのインジケーターを使ったシンプルなEAを自作することは十分に可能です。
なぜインジケーターEAから始めるべきなのか
EA開発の入口として、まずは既にチャート上で見慣れている「基本インジケーター」を使うやり方から始めるのが現実的です。理由はシンプルで、インジケーターEAには次のようなメリットがあるからです。
第一に、裁量トレードとの橋渡しがしやすいことです。移動平均線のクロス、RSIの30・70ライン、MACDのシグナルクロスなど、普段からチャートで見ているサインを、そのままEAの条件に落とし込むだけで、自動売買ロジックを直感的に理解できます。
第二に、条件が明確でコードに落とし込みやすいことです。「ゴールデンクロスが出たら買い」「RSIが30を下から上に抜けたら買い」といった形で、売買ルールを if 文で素直に書けるため、プログラム初心者でも構造を追いやすくなります。
第三に、バックテストによる検証がしやすいことです。インジケーターの期間やレベルを少しずつ変えながら、ストラテジーテスターで結果を比較することで、「なんとなく良さそう」ではなく、数字に基づいて戦略を評価できます。
MT4とMQL4の基本構造をざっくり理解する
インジケーターEAを作る前に、MT4の自動売買がどう動いているかを簡単に押さえておきます。EAは「MQL4」という専用言語で書かれたプログラムファイルです。ファイルの拡張子は「.mq4」で、コンパイルすると「.ex4」という実行ファイルになります。
EAの中身は大きく次の3つの関数で構成されています。
・OnInit:EAがチャートにセットされたときに一度だけ実行される初期化処理
・OnDeinit:EAがチャートから外されるときに呼ばれる終了処理
・OnTick:新しいティック(価格更新)が入るたびに実行されるメイン処理
実際の売買ロジックはほとんど「OnTick」の中に書かれます。「新しいティックが来たら、今の価格やインジケーター値を読み取り、条件を満たしていれば新規注文や決済を行う」というイメージです。
開発環境の準備:MT4とMetaEditor
MT4でEAを自作するための準備はそれほど多くありません。基本的な流れは次の通りです。
1. MT4をブローカーからダウンロードしてインストールする。
2. MT4を起動し、「ツール」→「MQL4 MetaEditor」またはアイコンからMetaEditorを開く。
3. MetaEditorで「新規作成」→「Expert Advisor(テンプレート)」を選び、EA名を入力する。
4. 自動生成されたテンプレートの中に、売買ロジックを追加していく。
最初は自分でゼロから書こうとせず、MT4が自動生成してくれるテンプレートをベースに少しずつ追記する方が挫折しにくいです。また、インジケーターを利用するためには「iMA」「iRSI」「iMACD」などの組み込み関数を使いますが、これもテンプレートの中にコメント付きでヒントが書かれていることがあります。
最初の一歩:移動平均線クロスEAを作ってみる
まずは最もシンプルな教材として、「短期移動平均線と長期移動平均線のクロスで売買するEA」を例に考えてみます。考え方は次のようになります。
・短期MA(例:20期間)が長期MA(例:50期間)を下から上へ抜けたら買いエントリー
・短期MAが長期MAを上から下へ抜けたら売りエントリー
・すでにポジションを持っている場合は、新しいシグナルが出たときに反対売買でドテンするか、一旦クローズのみ行うかを決める
MQL4では、移動平均線の値は「iMA」関数で取得します。疑似コードのイメージは次のようになります。
// 現在足と1本前の足の短期・長期MAを取得
double fastMA_now = iMA(NULL, 0, FastPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);
double fastMA_prev = iMA(NULL, 0, FastPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
double slowMA_now = iMA(NULL, 0, SlowPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);
double slowMA_prev = iMA(NULL, 0, SlowPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
// ゴールデンクロス判定(前の足では fast < slow、今の足で fast > slow)
bool isGC = (fastMA_prev < slowMA_prev) && (fastMA_now > slowMA_now);
bool isDC = (fastMA_prev > slowMA_prev) && (fastMA_now < slowMA_now);
このように、「一つ前の足」と「今の足」のインジケーター値を比較することで、クロスが発生したタイミングだけを検出できます。これをOnTickの中でチェックし、条件が真になったときに「OrderSend」でエントリーします。
インジケーターEAで必ず押さえるべき3つのポイント
移動平均線EAに限らず、インジケーターを使ったEAで共通して重要になるポイントが3つあります。
1つ目は、「確定足で判断する」ことです。まだ進行中の足(0番足)の値は価格の変動に応じて常に変わります。その値でシグナル判定をしてしまうと、ヒゲだけで条件を満たしてすぐに戻る、といったダマシを大量に拾うことになります。多くの場合、「1番足(確定済みの足)」のインジケーター値を使う方が安定します。
2つ目は、「ポジション管理を明確にする」ことです。すでに買いポジションを持っているのに、再度買いシグナルが出たからといって何度も追加ポジションを重ねてしまうと、意図せず大きなポジションサイズになってしまいます。「常に1ポジションだけ持つ」のか、「最大ポジション数を決める」のかをあらかじめ設計しておきます。
3つ目は、「エントリー条件と決済条件を分けて考える」ことです。多くの初心者EAでは、「逆シグナルが出たら決済」という形だけで終わってしまいます。しかし、トレンドフォロー系ならトレーリングストップ、逆張り系なら固定幅の利益確定・損切りなど、「インジケーターとは別の出口ロジック」を組み合わせることで、戦略としての一貫性が高まります。
RSIを使ったシンプルな逆張りEA
次に、オシレーター系インジケーターの代表であるRSIを使ったEAの考え方を見ていきます。RSIは「売られ過ぎ」「買われ過ぎ」を測る指標として有名で、初心者にもイメージしやすいインジケーターです。
代表的な逆張りロジックは次のようになります。
・RSIが30を下から上に抜けたら買い(売られ過ぎからの戻り狙い)
・RSIが70を上から下に抜けたら売り(買われ過ぎからの反転狙い)
MQL4では「iRSI」関数でRSI値を取得します。移動平均線と同じく、「1本前」と「今」の値を比較してクロスを検出します。
double rsi_now = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, 0);
double rsi_prev = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, 1);
bool buySignal = (rsi_prev < 30.0) && (rsi_now >= 30.0);
bool sellSignal = (rsi_prev > 70.0) && (rsi_now <= 70.0);
RSI逆張りEAで特に注意したいのは、トレンドの強い局面では「売られ過ぎのまま下げ続ける」「買われ過ぎのまま上げ続ける」ことが珍しくないという点です。そのため、トレンドフィルターを併用するのがおすすめです。
例えば、「日足の200SMAより上にあるときは買いシグナルだけを有効にする」「200SMAより下では売りシグナルだけを使う」といった形で、大きな流れと逆向きの逆張りエントリーを減らせます。
MACDを使ったトレンドフォローEA
MACDはトレンドとモメンタムの両方を捉えられるインジケーターで、トレンドフォロー型EAのメインロジックとしてもよく使われます。典型的なシグナルは、MACDラインとシグナルラインのクロスです。
たとえば次のようなロジックが考えられます。
・MACDラインがシグナルラインを下から上に抜けたら買い
・MACDラインがシグナルラインを上から下に抜けたら売り
MQL4では「iMACD」関数でMACDとシグナルの値を同時に取得します。
double macd_now, signal_now, macd_prev, signal_prev;
// 今の足のMACDとシグナル
macd_now = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, 0);
signal_now = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_SIGNAL, 0);
// 1本前の足
macd_prev = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, 1);
signal_prev = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_SIGNAL, 1);
bool buySignal = (macd_prev < signal_prev) && (macd_now > signal_now);
bool sellSignal = (macd_prev > signal_prev) && (macd_now < signal_now);
MACD EAでは、トレンドの強い方向に乗ることを優先するため、トレーリングストップや分割決済と相性が良いです。例えば、「一定の利益が乗ったらストップを建値に移動し、その後はトレーリングで追いかける」といった形です。これにより、小さな負けは一定に抑えつつ、大きなトレンドをとらえたときに利益を伸ばしやすくなります。
複数インジケーターの組み合わせでダマシを減らす
単一インジケーターだけでエントリーしていると、どうしてもダマシが多くなります。そこで、インジケーターEAの次のステップとして「複数インジケーターの組み合わせ」を考えてみます。
典型的な組み合わせの例は次のようなものです。
・トレンド判定:移動平均線(200SMAなど)
・エントリータイミング:RSI、MACD、ストキャスティクスなど
具体的には、「価格が200SMAより上にあるときだけMACDの買いシグナルを有効にする」「200SMAより下ではMACDの売りシグナルだけ使う」といった形で、「どちらの方向なら攻めてもよいか」をトレンド系インジケーターで決め、その中でオシレーターでタイミングを測る、という発想です。
MQL4コード上では、単純にif文の条件をANDでつなげるイメージです。
bool isUpTrend = (Close[1] > iMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 1));
bool isDownTrend = (Close[1] < iMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 1));
if(isUpTrend && buySignalMACD) {
// 買いエントリー
}
if(isDownTrend && sellSignalMACD) {
// 売りエントリー
}
このように条件を掛け合わせることで、トレンドと逆方向のエントリーを減らし、勝率やリスクリワードのバランスを改善しやすくなります。ただし、条件を増やしすぎると機会損失が増え、バックテスト上はきれいでも実運用ではほとんどエントリーしないEAになりがちです。条件追加は「1つずつ」「理由を持って」行うことが大切です。
外部入力パラメータで調整しやすいEAにする
インジケーターEAを作る際のもう一つの重要なポイントは、「パラメータを外部入力にする」ことです。移動平均線の期間やRSIの閾値などをコード内部に固定してしまうと、後から調整したいときに毎回ソースを編集してコンパイルし直さなければなりません。
MQL4では、「input」キーワードを使うことで、EAのプロパティ画面から変更可能な設定項目を簡単に用意できます。
input int FastMAPeriod = 20;
input int SlowMAPeriod = 50;
input int RSIPeriod = 14;
input double Lots = 0.1;
input int StopLossPips = 30;
input int TakeProfitPips = 60;
このようにしておくと、同じEAファイルを使いまわしながら、通貨ペアや時間足ごとに最適なパラメータを調整できます。さらに、ストラテジーテスターのパラメータ最適化機能を使えば、バックテストを通じて一定のルールのもとでパラメータ候補を探ることも可能です。
リスク管理とロット計算の基本
どれだけインジケーターやエントリーロジックを工夫しても、リスク管理が甘いとEAは簡単に破綻します。インジケーターEAを自作する初心者こそ、「1トレードでどれだけの損失を許容するか」を明確に決めておくことが重要です。
よく使われる考え方の一つが、「1回の損切りで口座残高の何%までなら許容するか」を先に決めてしまう方法です。たとえば「1トレードのリスクは口座の1%まで」と決めたら、その範囲に収まるようにロットサイズを逆算します。
MQL4上では、ロット数を固定にするのではなく、「口座残高」「許容リスク」「損切り幅」を使って算出する関数を用意すると管理しやすくなります。完全に正確な値を出すには通貨ペアごとのポイント値やティックバリューを考慮する必要がありますが、最初はシンプルな近似式からでも構いません。
ストラテジーテスターでEAの動きを確認する
インジケーターEAが完成したら、いきなりリアル口座で動かすのではなく、まずはMT4のストラテジーテスターで動作を確認します。テスターでは、「過去データを使ってEAを再生し、どのタイミングでエントリー・決済したか」をチェックできます。
初心者が特に確認しておきたいポイントは次の通りです。
・ロジックどおりのタイミングでエントリー・決済しているか
・連続エントリーや意図しないナンピンが起きていないか
・スプレッドやスリッページをある程度現実的に設定しても、極端に成績が悪化しないか
テスターのレポートに表示される総取引数や最大ドローダウン、勝率、プロフィットファクターなどの指標も参考になりますが、最初は数字よりも「ロジックどおりに動いているか」を目視で確認する方が重要です。見た目で納得できないEAは、いくらバックテストの数字が良くても、実運用で想定外の挙動をしやすいからです。
デモ口座でのフォワードテスト
ストラテジーテスターで大きな問題がなさそうであれば、次のステップは「デモ口座でのフォワードテスト」です。過去データではなく、リアルタイムのレートを使って数週間〜数か月動かしてみることで、「スプレッドの変動」「ニュース時の荒い値動き」「約定の遅延」など、実際の環境に近い条件でEAの挙動をチェックできます。
この段階でも、いきなり大きなロットを使う必要はありません。むしろ、できるだけ小さなロット(あるいはデモ専用口座)で、「どの相場環境で得意・不得意が現れるのか」「含み損をどの程度まで許容するロジックになっているのか」を観察することが大切です。
ありがちな失敗パターンと回避の考え方
インジケーターEAを自作し始めた初心者が陥りやすい失敗パターンをいくつか挙げ、その対策を整理します。
1つ目は、「条件を増やしすぎて過剰最適化になる」ことです。バックテストの成績を良くしようとするあまり、「このパターンではエントリーしない」「この形では即決済する」といった細かい条件を積み上げていくと、過去の一部の値動きにだけフィットしたEAになってしまいます。条件を追加するときは、「その条件が将来も合理的に機能しそうか」という視点を忘れないようにします。
2つ目は、「エントリーにばかりこだわって出口が曖昧になる」ことです。インジケーターEAでは、どうしてもエントリー条件の工夫ばかりに目が行きがちですが、損切りと利確の設計が曖昧だと、少数の大きな損失ですべての利益を吐き出してしまうことがあります。固定幅の損切り・利確でも構いませんし、トレーリングストップでも構いませんが、「どの程度のリスクを取って、どの程度のリターンを狙うのか」をあらかじめ数字で決めておくことが重要です。
3つ目は、「ロジックを理解しないまま他人のEAを改造する」ことです。インターネット上には無料のサンプルEAや有志のコードが多数公開されています。それ自体は学習の教材として非常に役立ちますが、中身を理解せずに条件だけをいじってしまうと、意図しないナンピンやマーチンゲールが組み込まれていることに気づかず、大きなドローダウンを被るリスクがあります。
インジケーターEA自作の現実的なステップ
最後に、「インジケーターを使ったEA作り」をどのようなステップで進めると現実的かを整理します。
1. 裁量トレードで「自分がよく見るインジケーター」を1〜2個決める(移動平均線、RSI、MACDなど)。
2. そのインジケーターを使ったシンプルな売買ルールを紙に書き出す(例:ゴールデンクロスで買い、デッドクロスで売り)。
3. ルールを「確定足の値」「1ポジションのみ」など、プログラムに落とし込みやすい形に整理する。
4. MT4のテンプレートEAに、インジケーター取得とシグナル判定のコードを追加する。
5. ストラテジーテスターでロジックどおりに動いているかを確認し、問題があれば修正する。
6. 外部入力パラメータとして期間・レベル・ロットなどを設定し、調整しやすくする。
7. デモ口座でフォワードテストを行い、得意・不得意な相場環境を観察する。
このように、インジケーターEA作りは「高度な数学」や「複雑なアルゴリズム」から始める必要はありません。むしろ、基本的なインジケーターを使ったシンプルな戦略を、自分の手でコード化して動かしてみることが、MT4自動売買を理解する最短ルートになります。
最初のEAは完璧である必要はありません。移動平均線、RSI、MACDといった基本インジケーターEAを自作し、バックテストとフォワードテストを通じて「どんなときに勝ち、どんなときに負けるのか」を体感することで、次第に自分なりの売買ルールや改良のアイデアが増えていきます。その積み重ねが、安定して運用できる自動売買システムを形にしていく土台になります。


コメント