MT4で始める自動売買入門:基本インジケーターを使ったEAの作り方

自動売買・EA

本記事では、MetaTrader4(MT4)を使って自動売買(EA:Expert Advisor)を動かすための基本的な流れと、代表的なテクニカルインジケーターを組み合わせたシンプルなEAの作り方について、初めての方でも理解できるように丁寧に解説します。

「プログラムは難しそう」「EAは有料で買うもの」というイメージを持たれがちですが、MT4のEAはルールをきちんと分解していけば、比較的シンプルなロジックからでも十分に構築できます。まずはごく基本的な売買ルールを自分の手でコード化し、MT4上でテストしてみることから始めてみましょう。

スポンサーリンク
【DMM FX】入金

MT4自動売買の全体像を理解する

自動売買を始める前に、MT4でEAがどのように動いているのかをざっくりと押さえておくことが重要です。全体像が分かっていれば、コードを書く段階で迷いにくくなります。

MT4における自動売買の流れは、概ね次のように整理できます。

  1. トレードルールを言葉で明文化する(例:「移動平均線ゴールデンクロスで買い」など)。
  2. そのルールをMQL4という言語で記述したファイル(EA)に落とし込む。
  3. MT4にEAを設置し、チャートに適用する。
  4. ストラテジーテスターで過去データを用いてテストする。
  5. 必要に応じてパラメータやロジックを微調整する。

つまり、EA作りの本質は「自分のトレードルールを、機械が理解できる形で順序立てて書き下す作業」です。高度な数学や難解なアルゴリズムが必須というわけではなく、条件分岐と基本的な計算が分かれば、まずは十分です。

EA開発に必要な環境を整える

次に、EAを作成・テストするための環境を準備します。MT4は多くのFX業者が無償で提供しているので、まずはデモ口座で構いません。

基本的な準備手順は以下の通りです。

  • MT4を提供しているFX業者でデモ口座を開設し、MT4を入手してインストールする。
  • MT4を起動し、表示メニューから「ナビゲーター」「ターミナル」など必要なパネルを表示する。
  • ツールメニューから「MetaQuotes言語エディタ(MetaEditor)」を開く。
  • MetaEditor上で新しいEAファイルを作成し、MQL4コードを書き込む。
  • コンパイルしてエラーが出ていないことを確認した上で、MT4に戻りEAをチャートに適用する。

この流れが一度体に入ってしまえば、あとはロジックを変えたり、パラメータを調整したりすることで、さまざまなEAを量産できるようになります。

MQL4の基本構造を押さえる

EAはMQL4という専用言語で記述しますが、構造は決まっているので、ひな型さえ覚えてしまえば応用が利きます。典型的なEAは、次のような3つの関数を中心に構成されています。

  • OnInit():EAがチャートにセットされたとき一度だけ実行される初期化処理。
  • OnDeinit():EAがチャートから外されるときに実行される終了処理。
  • OnTick():新しいティック(価格更新)が来るたびに繰り返し実行されるメイン処理。

自動売買ロジックの大半は、OnTick()の中に記述します。ここで、その時点の価格やインジケーターの値を取得し、「買い条件に合致しているか」「ポジションはどのくらい保有しているか」といった状況を判断し、必要に応じて注文や決済を行います。

シンプルな移動平均線EAの設計例

ここからは、具体的な売買ロジックとして「短期移動平均線と長期移動平均線のクロス」を用いたEAを例に、どのようにロジックを分解し、MQL4に落とし込むかを見ていきます。

今回は、次のような非常にシンプルなルールを考えます。

  • 短期移動平均線(期間5)が長期移動平均線(期間20)を下から上に抜けたら買いエントリー。
  • 短期移動平均線が長期移動平均線を上から下に抜けたら買いポジションを決済し、条件が揃えば売りエントリー。
  • 損切りと利確は、あらかじめ固定pipsで設定する。
  • 同時に保有するポジションは1つまでとする。

一見シンプルですが、実際の市場でも一定のトレンド局面では機能することが多く、EAの入門ロジックとしては適しています。また、ここで使う移動平均線(Moving Average, MA)は、他の多くのインジケーターの基礎ともなるため、MQL4での呼び出し方に慣れておく価値があります。

インジケーターの値をMQL4で取得する

MT4に搭載されたインジケーターは、MQL4から関数を通じて簡単に呼び出せます。移動平均線の場合は、iMA()という関数を使います。典型的な書式は次の通りです。

double ma = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);

主な引数は、順に次の意味を持ちます。

  • 第1引数:通貨ペア(NULLとすると現在のチャートのシンボル)。
  • 第2引数:時間足(0とすると現在の時間足)。
  • 第3引数:期間(ここでは20)。
  • 第4引数:シフト(0は直近バー)。
  • 第5引数:平均の種類(単純移動平均ならMODE_SMA)。
  • 第6引数:価格の種類(終値ならPRICE_CLOSE)。
  • 第7引数:どのバーの値を取るか(0は現在のバー、1は1本前)。

EAでは、クロスを検出するために「今のバーの移動平均値」と「1本前のバーの移動平均値」の両方を取得して比較する、というパターンを頻繁に用います。

移動平均線クロスEAのサンプルコード

次に、上記のロジックを具体的なMQL4コードに落とし込んだ例を示します。あくまで学習用のシンプルなサンプルですが、エントリー条件、決済条件、リスク管理の基本的な考え方を掴むのに役立ちます。

#property strict

extern int FastMAPeriod = 5;
extern int SlowMAPeriod = 20;
extern double Lots       = 0.1;
extern int StopLoss      = 200;
extern int TakeProfit    = 400;

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
  }

void OnTick()
  {
   // 既にポジションを持っているか確認
   int total = OrdersTotal();
   bool hasPosition = false;
   int  ticket      = -1;

   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber()==12345)
           {
            hasPosition = true;
            ticket      = OrderTicket();
            break;
           }
        }
     }

   // 移動平均線の値を取得(現在バーと1本前)
   double fastNow  = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
   double fastPrev = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   double slowNow  = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
   double slowPrev = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);

   // ゴールデンクロス(買い条件)
   bool isGoldenCross = (fastPrev < slowPrev && fastNow > slowNow);
   // デッドクロス(売り条件)
   bool isDeadCross   = (fastPrev > slowPrev && fastNow < slowNow);

   // まだポジションがない場合のエントリー
   if(!hasPosition)
     {
      if(isGoldenCross)
        {
         double sl = Bid - StopLoss * Point;
         double tp = Bid + TakeProfit * Point;
         int buyTicket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, sl, tp, "MA Buy", 12345, 0, clrNONE);
        }
      else if(isDeadCross)
        {
         double sl = Ask + StopLoss * Point;
         double tp = Ask - TakeProfit * Point;
         int sellTicket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, sl, tp, "MA Sell", 12345, 0, clrNONE);
        }
     }
   else
     {
      // 既存ポジションがある場合の決済ロジック(例として反対シグナルでクローズ)
      if(OrderSelect(ticket, SELECT_BY_TICKET))
        {
         if(OrderType()==OP_BUY && isDeadCross)
           {
            OrderClose(ticket, OrderLots(), Bid, 3, clrNONE);
           }
         else if(OrderType()==OP_SELL && isGoldenCross)
           {
            OrderClose(ticket, OrderLots(), Ask, 3, clrNONE);
           }
        }
     }
  }

このコードはあくまでサンプルであり、実際の運用ではスプレッドやスリッページ、ボラティリティ、時間帯など、より多くの要素を考慮する必要があります。ただし、EAがどのような手順で条件判定〜注文〜決済へと進んでいくかを理解するには十分な例です。

他の基本インジケーターを使ったEAへの応用

移動平均線を使ったロジックに慣れてきたら、他の代表的なインジケーターを組み合わせることで、より自分の考えに近いEAを構築できます。ここでは、特に初学者でも理解しやすい以下のインジケーターについて、EAへの具体的な組み込み方のイメージを紹介します。

  • RSI(Relative Strength Index):買われ過ぎ・売られ過ぎの目安としてよく使われるオシレーター。
  • MACD:トレンドの強さや転換を把握するための指標。
  • ボリンジャーバンド:価格のバンド内での位置やバンド幅からボラティリティを把握する。

たとえば、RSIを組み合わせる場合は、「移動平均線のゴールデンクロスかつRSIが50より上」という条件を満たしたときだけ買いエントリーする、といったフィルターを設けることができます。MQL4では、RSIの値はiRSI()関数で取得できます。

RSIフィルター付きのエントリー条件例

RSIをフィルターとして組み込む簡単なコード例は次の通りです。

double rsi = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);

bool buyCondition  = isGoldenCross && (rsi > 50);
bool sellCondition = isDeadCross   && (rsi < 50);

このように、既存のゴールデンクロス/デッドクロス条件に対して追加の条件をANDでつなぐだけで、より自分の相場観に合ったエントリー条件を構築できます。ただし、条件を増やしすぎるとシグナルの頻度が極端に減り、テスト期間によっては十分なサンプル数が得られないこともあるため、バランスが重要です。

ボリンジャーバンドを使ったブレイクアウトEAのイメージ

ボリンジャーバンドは、価格がバンドの外に飛び出したときのブレイクアウトや、バンド幅が狭くなっているときの低ボラ状態を把握する用途でよく利用されます。MQL4では、iBands()関数で上バンド・ミドルバンド・下バンドの値を取得できます。

例えば、次のようなEAロジックが考えられます。

  • 価格が上バンドを明確に上抜けたら買いエントリー。
  • 価格が下バンドを明確に下抜けたら売りエントリー。
  • トレーリングストップやATRを利用して、ボラティリティに応じた損切り幅を調整する。

こうしたボリンジャーバンド系のEAは、レンジ相場やブレイクアウト局面など、対象とする相場環境を明確に意識することが重要です。テストの際には、トレンド相場とレンジ相場の両方を含む長期データで検証し、どのような局面で優位性が出るかを確認すると良いでしょう。

バックテストとパラメータチューニングの進め方

EAを作ったら必ず行うべきなのが、ストラテジーテスターを用いたバックテストです。MT4では、過去チャートを用いてEAの成績を検証し、エントリー回数、勝率、最大ドローダウン、プロフィットファクターなどを確認できます。

バックテストの際に意識したいポイントは以下の通りです。

  • 十分な期間のデータ(できれば複数年)を使う。
  • トレンド相場・レンジ相場・高ボラ期・低ボラ期が混在する期間を選ぶ。
  • スプレッドや手数料を現実的な値に設定する。
  • パラメータの最適化を行う場合は、過剰最適化(オーバーフィッティング)にならないよう注意する。

特に、移動平均線の期間やRSIの閾値などは、探そうと思えばいくらでも「見栄えの良い組み合わせ」が見つかります。しかし、その組み合わせが将来の相場でも通用するとは限りません。ある程度シンプルなパラメータにとどめ、異なる通貨ペアや期間でも大きく崩れないかをチェックすることが重要です。

小さなロットからリアルトレードへつなげる

バックテストやデモトレードでEAの動作に慣れてきたら、次はごく小さなロットでリアル口座に適用してみるステップです。いきなり大きなロットで動かすのではなく、まずは「想定通りのタイミングで注文・決済されているか」「スプレッド拡大時や重要指標発表時にどう動くか」を確認することが大切です。

リアル口座での運用では、次の点もあらためて意識しておきましょう。

  • 同時に複数のEAを動かす場合、マジックナンバーでポジションを区別する。
  • サーバーや回線の不具合に備えて、VPSなど安定した稼働環境を用意する。
  • 想定外の値動きが起こり得ることを前提に、リスクを限定したロットサイズに抑える。

EAはあくまで「自分で設計したルールを忠実に実行してくれるプログラム」に過ぎません。最終的なリスクコントロールの責任は常に自分にある、という意識を持つことが重要です。

自分なりのアイデアをEAに落とし込むためのステップ

最後に、読者の方が自分なりのトレードアイデアをEAに落とし込む際の具体的なステップを整理しておきます。

  1. まずは裁量トレードで使っているルールを、可能な限り定量的な条件に言語化する。
  2. その条件のうち、インジケーターで表現できるもの(トレンド判断・モメンタム・ボラティリティなど)を選び出す。
  3. MT4標準インジケーターで代替できるものから実装してみる。
  4. MQL4で値の取得方法を調べ、サンプルコードを参考にしながら条件分岐を組み立てる。
  5. 最初から完璧を目指さず、シンプルなロジックでまずは動くものを作る。
  6. バックテストで挙動を確認し、必要な項目だけ少しずつ改良する。

このプロセスを繰り返すことで、「自分専用のEAを組める」という大きな武器が手に入ります。裁量トレードと違い、EAは一度ロジックを定めてしまえば、24時間ぶれることなく同じルールでトレードを続けてくれます。その結果、検証もしやすく、改善のサイクルを回しやすいというメリットがあります。

まとめ:MT4自動売買は小さな一歩から

MT4による自動売買は、難しそうに見えますが、実際には「トレードルールの整理」と「インジケーターの値の取得」「条件分岐」という3つの要素の組み合わせに過ぎません。本記事では、移動平均線を中心に、RSIやボリンジャーバンドなどの基本的なインジケーターをEAに組み込むための考え方と、具体的なMQL4コードの例を紹介しました。

まずは、今回のサンプルコードをそのままコンパイルしてテストし、どのタイミングでシグナルが出るのか、どのような相場環境で成績が変化するのかを確認してみてください。その上で、自分の相場観に合わせてパラメータや条件を少しずつ調整していけば、やがて「自分の考えをコードに落とし込める」という感覚が身についてきます。

自動売買は、感情に左右されないルールベースのトレーディングを実現する強力な手段です。小さなロット・シンプルなロジックから少しずつ経験を積み重ね、自分なりのEA開発のスタイルを確立していきましょう。

p-nuts

お金稼ぎの現場で役立つ「投資の地図」を描くブログを運営しているサラリーマン兼業個人投資家の”p-nuts”と申します。株式・FX・暗号資産からデリバティブやオルタナティブ投資まで、複雑な理論をわかりやすく噛み砕き、再現性のある戦略と“なぜそうなるか”を丁寧に解説します。読んだらすぐ実践できること、そして迷った投資家が次の一歩を踏み出せることを大切にしています。

p-nutsをフォローする
自動売買・EA
スポンサーリンク
【DMM FX】入金
シェアする
p-nutsをフォローする

コメント

タイトルとURLをコピーしました