裁量トレードでチャートを見ながら売買していると、「今やっている判断をそのまま自動化できないか」と一度は考えると思います。MT4(MetaTrader4)のEA(エキスパートアドバイザー)を使えば、移動平均線やRSI、ボリンジャーバンドなどの基本インジケーターを組み合わせて、自分だけの自動売買ロジックを構築できます。
本記事では、「プログラミング未経験でも、自分でEAを組み立てていくイメージが掴める」ことをゴールに、MT4の自動売買の全体像と、代表的なインジケーターを使ったシンプルなEA設計の考え方を解説します。具体的なコード断片も示しながら、バックテストやリスク管理のポイントまで一気通貫で整理します。
MT4自動売買の全体像を把握する
まずは、「MT4のEAで何ができて、どこまで自動化されるのか」をざっくり押さえておきます。
EAで自動化できること
- 売買シグナルの検出(インジケーター条件の判定)
- エントリー注文の発注(成行・指値・逆指値など)
- 決済注文(利確・損切り)の自動発注
- トレーリングストップやブレークイーブン移動などのポジション管理
- ロット数の自動計算(口座残高の一定割合をリスクにする等)
一方で、ニュースなど非定量的な情報の解釈や、証券会社の約定品質の違いなど、完全には自動化できない部分もあります。そのため、EAは「すべて任せて放置するための魔法」ではなく、一定のルールを忠実に守らせるためのロボットと考えるとイメージしやすいです。
MT4におけるEAの基本構造
MQL4という言語でEAを作成すると、通常は次の3つの関数が中心になります。
OnInit():EAがチャートにセットされたときに一度だけ実行される初期化処理OnDeinit():EAがチャートから外されたときに実行される後片付けOnTick():価格が更新されるたびに実行されるメイン処理(売買ロジックの心臓部)
EAはこのOnTick()の中で、インジケーターの値を取得し、「買いか・売りか・何もしないか」を判断します。したがって、インジケーターEAを作るということは、OnTick内に判定ロジックを書くことだと理解しておけば十分です。
インジケーターEAを作る前に決めるべき5つの項目
いきなりコードを書き始めるのではなく、次の5項目を紙に書き出すと、ロジックが整理されて破綻しにくくなります。
- どの時間足で運用するか(例:EURUSDの15分足)
- どのインジケーターを使うか(移動平均線・RSI・ボリンジャーバンドなど)
- エントリー条件(どんな状態で買い/売りを行うか)
- 決済条件(損切り・利確・時間切れなど)
- ロット管理ルール(口座残高の何%をリスクにするか)
この「仕様書」を簡単でも良いので作ってからMQL4に落とし込むと、「書いているうちにやりたいことが変わる」「自分でも何を作っているのかわからなくなる」といった混乱を避けられます。
移動平均線クロスEAを設計する
最初の例として、もっとも基本的な「移動平均線のゴールデンクロス/デッドクロス」を使ったトレンドフォロー型EAを設計してみます。
戦略コンセプト
- 短期移動平均線(例:期間20)と長期移動平均線(例:期間80)を使用
- 短期線が長期線を下から上へ抜けたら買いエントリー(ゴールデンクロス)
- 短期線が長期線を上から下へ抜けたら売りエントリー(デッドクロス)
- 損切りは直近安値(買いの場合)/直近高値(売りの場合)か、一定pips
- 利確はリスクリワード比1:2程度で固定、もしくはトレーリングストップ
このように、まず日本語でロジックを分解しておくと、コードにする際も迷いません。
MQL4での移動平均線取得イメージ
移動平均線の値は、MQL4のiMA()関数で取得できます。概念的なコードは次のようになります。
// 短期と長期の移動平均線を取得(終値ベース、単純移動平均)
double maFast = iMA(NULL, PERIOD_CURRENT, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
double maFastPrev = iMA(NULL, PERIOD_CURRENT, 20, 0, MODE_SMA, PRICE_CLOSE, 2);
double maSlow = iMA(NULL, PERIOD_CURRENT, 80, 0, MODE_SMA, PRICE_CLOSE, 1);
double maSlowPrev = iMA(NULL, PERIOD_CURRENT, 80, 0, MODE_SMA, PRICE_CLOSE, 2);
// ゴールデンクロス判定(1本前までの確定足でクロスしたか)
bool isGoldenCross = (maFastPrev < maSlowPrev) && (maFast > maSlow);
// デッドクロス判定
bool isDeadCross = (maFastPrev > maSlowPrev) && (maFast < maSlow);
実際のEAでは、ここに「現在ポジションを持っていないか」「スプレッドが広すぎないか」などのチェックを加えてから、注文発注処理を行います。
初心者がつまずきやすいポイント
移動平均線EAでよくある失敗は、クロスが発生した瞬間の足でエントリーしてしまうことです。確定していない足の途中でクロスが発生しても、その足が確定するまでの間に再び元に戻ることがあります。これを避けるには、上記のように「1本前の足でクロスしたか」を条件にするのが定番です。
RSIを使った逆張りEAを設計する
次に、RSI(Relative Strength Index)を使ったシンプルな逆張りEAを考えます。トレンドフォロー型の移動平均線EAとは性格が異なるため、複数ストラテジーをポートフォリオ的に運用したいときにも役立ちます。
戦略コンセプト
- RSI期間14を使用
- RSIが30以下になったら「売られ過ぎ」とみなして買いを検討
- RSIが70以上になったら「買われ過ぎ」とみなして売りを検討
- ただし、長期移動平均線が上向きのときは買いシグナルのみ、下向きのときは売りシグナルのみ採用(トレンドフィルター)
こうすることで、「逆張りだけど、長期トレンドには逆らいすぎない」構造になります。
MQL4でのRSI取得イメージ
// RSIを取得(期間14、終値ベース)
double rsi = iRSI(NULL, PERIOD_CURRENT, 14, PRICE_CLOSE, 1);
// トレンド判定用の長期移動平均線(例:期間100)
double maTrend = iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_SMA, PRICE_CLOSE, 1);
double maTrendPrev = iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_SMA, PRICE_CLOSE, 2);
bool isUpTrend = (maTrend > maTrendPrev);
bool isDownTrend = (maTrend < maTrendPrev);
これを使って、例えば次のような条件にします。
- RSI <= 30 かつ 上昇トレンド(isUpTrend == true)なら買いエントリー
- RSI >= 70 かつ 下降トレンド(isDownTrend == true)なら売りエントリー
単純な逆張りよりも、トレンド方向を意識したフィルターを入れることで、極端なトレンド相場での連敗リスクを軽減できます。
ボリンジャーバンドを使ったレンジブレイク&逆張りEA
ボリンジャーバンドは、価格のばらつきを表すインジケーターで、「スクイーズ」と呼ばれるバンド幅が狭い状態からのブレイクや、「±2σにタッチしたら逆張り」など様々な使い方があります。ここでは、初心者でも理解しやすい2つのパターンを整理します。
パターン1:レンジブレイク型
- ボリンジャーバンド(期間20、偏差2)を使用
- バンド幅(上バンドと下バンドの差)が一定値以下の状態が続いているときはレンジ相場とみなす
- 終値が上バンドを上抜けしたら買い、下バンドを下抜けしたら売り
- 損切りはセンターバンド(20SMA)付近、利確はリスクリワード1:2など
このパターンは、「値動きが落ち着いたあとに大きく動き出す」場面を狙うイメージです。
パターン2:逆張り型
- 終値が上バンドにタッチしたら売り、下バンドにタッチしたら買い
- ただし、長期移動平均線の向きに逆らうエントリーは行わない
- トレンドが強く発生しているときの「バンドウォーク」では参戦しないようにフィルターを入れる
ボリンジャーバンド逆張りEAでは、「強いトレンドと単なる行き過ぎ」を見分ける工夫が非常に重要です。例えば、バンドタッチから一定本数の足が経過しても価格が戻らないときは損切りする、といった時間フィルターを追加する方法もあります。
EA共通のリスク管理とロット計算の基本
どれだけインジケーターを工夫しても、リスク管理が雑だと口座は簡単に破綻します。ここでは、シンプルかつ実用的なリスク管理の考え方を示します。
1トレードのリスクを口座残高の何%にするか
よく使われるのは、1トレードあたり口座残高の1〜2%をリスクにする方法です。例えば、口座残高が10万円でリスク2%なら、1トレードあたりの許容損失は2,000円です。
許容損失額からロット数を計算する
許容損失額(円)とストップ幅(pips)が決まれば、必要なロット数を逆算できます。概念的な計算式は次のとおりです。
ロット数 = 許容損失額 ÷ (1pipsあたり損益 × ストップ幅)
MQL4では、通貨ペアごとのポイント値や最小ロット、ティックバリューを使ってロットを自動計算することもできます。最初は固定ロットから始め、慣れてきたら「残高に応じてロットを自動調整する」仕組みを組み込むと、ロジックの安定性が高まります。
バックテストとフォワードテストでEAを検証する
EAは、「思いついたらすぐリアル口座で運用」ではなく、必ずバックテストとフォワードテストを経てから本格運用に移行するのが基本です。
バックテストのポイント
- 十分な期間のヒストリカルデータを使う(少なくとも数年分)
- スプレッドや手数料を現実的な値に設定する
- 「最適化」でパラメータを調整しすぎない(過剰最適化を避ける)
- 最大ドローダウンや連敗数など、リスクリターンのバランスを確認する
特に注意したいのが、「特定期間だけ異常に成績が良いパラメータ」です。そのような設定は、たまたまその期間の値動きに合っていただけの可能性が高く、将来の相場で再現性が低いことが多いです。
フォワードテストの重要性
バックテストで良好な成績が出たEAは、次にデモ口座や少額のリアル口座でフォワードテストを行います。実際の約定やスプレッドの変動を通して、バックテスト結果と大きな乖離がないかを確認します。
フォワードテストでの観察ポイントは例えば次のとおりです。
- バックテストと比べてトレード回数が極端に少ない/多くなっていないか
- スリッページや約定拒否が多く、理論値から大きくズレていないか
- 想定以上にドローダウンが発生していないか
この段階で違和感が大きいEAは、ロジックの前提を見直す余地があります。
実運用時の注意点:VPSと環境整備
EAを24時間稼働させるには、PCの電源を入れっぱなしにするか、VPS(仮想専用サーバー)を利用する必要があります。自宅PCは停電や回線トラブルのリスクがあるため、多くのトレーダーはVPSを利用しています。
実運用前に、次のようなチェックリストを作っておくと安心です。
- EAのバージョン管理(修正したらファイル名やコメントで区別)
- ブローカーごとの仕様差(最小ロット・最小ストップ距離など)の確認
- 想定外のエラーが発生したときにポジションがどう扱われるかの確認
- 運用ロットを徐々に増やしていく計画(いきなりフルロットで始めない)
よくある失敗パターンと改善のヒント
インジケーターEAを自作する過程で、多くの初心者が同じような壁にぶつかります。代表的な失敗パターンと、その改善のヒントをいくつか挙げます。
失敗1:インジケーターを増やしすぎてノートレードになる
「移動平均線+RSI+ボリンジャーバンド+MACD+ストキャスティクス…」と条件を盛り込みすぎると、ほとんどトレードが発生しなくなります。インジケーターは、役割の異なるものを2〜3個に絞るのが現実的です(トレンド系+オシレーター+ボラティリティ系など)。
失敗2:相場環境の変化を想定していない
ある期間では非常に良い成績でも、相場環境が変わると機能しなくなるストラテジーは少なくありません。
トレンド相場・レンジ相場・高ボラティリティ・低ボラティリティなど、複数の局面を含む期間でバックテストし、「どの環境で得意/苦手か」を把握しておくと、ロット調整や停止判断がしやすくなります。
失敗3:損切りが遠すぎて数回の負けで口座が大きく減る
インジケーター条件にばかり目が行き、ストップロスの位置やリスク許容度が後回しになりがちです。EA開発では、まず損切り幅とリスク%を決めてから、エントリー条件を詰める方が結果的に安定しやすくなります。
ステップ別ロードマップ:インジケーターEA自作への道筋
最後に、MT4で自動売買EAを自作し、実際に運用するまでのステップを整理します。
- MT4の基本操作を身につける(チャート設定・インジケーター挿入・ストラテジーテスターの使い方)
- 移動平均線・RSI・ボリンジャーバンドなど基本インジケーターの意味を理解する
- 紙に売買ルールを書き出して、エントリー・決済・ロット管理を明文化する
- シンプルなロジックからMQL4に落とし込み、バックテストを繰り返す
- 過剰最適化を避けながら、損切り幅やフィルター条件を微調整する
- デモ口座や少額リアル口座でフォワードテストを行い、バックテスト結果との整合性を確認する
- VPSや運用環境を整え、ロットを段階的に増やしながら本格運用に移行する
この流れを一つひとつ丁寧に踏んでいけば、「インジケーターEAを自分で組み立てて検証し、納得して運用する」というスタイルに近づいていきます。焦らずシンプルなロジックから始め、少しずつ改良を重ねていくことが、長く付き合えるEAを育てる近道です。


コメント