MT4で始める自動売買EA入門:基本インジケーターで組み立てるシンプル戦略

FX自動売買

この記事では、MetaTrader4(MT4)を使って自動売買を始めたい方のために、EA(エキスパートアドバイザー)の仕組みから、基本的なインジケーターを使ったシンプルなEAの作り方までを丁寧に解説します。難しい数式や高度なプログラミング知識がなくても、自分でロジックを考え、MT4上で動く自動売買を構築できるところまでを目指します。

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

MT4自動売買とEAの基本を理解する

EAとは何か

EA(エキスパートアドバイザー)は、MT4上で動作する自動売買プログラムです。トレーダーがあらかじめ決めたルール(売買ロジック)をコードとして記述し、MT4チャートに適用することで、エントリーや決済、ロット管理などを自動化できます。裁量トレードと違い、感情に左右されず、決めたルールを忠実に実行できるのが大きな特徴です。

なぜEAを自作するのか

市販EAや有料シグナルに頼る方法もありますが、自作EAには次のメリットがあります。

第一に、ロジックを自分で把握しているため、どのような相場環境で強く、どのような場面で弱いかを理解しやすくなります。第二に、必要に応じてルールを微調整したり、相場環境の変化に合わせて改善したりすることができます。第三に、継続的なライセンス料などのコストを抑えられる点も見逃せません。

MT4自動売買の全体フロー

MT4で自動売買を行う流れは概ね以下の通りです。

(1)トレードアイデアやルールを文章で書き出す
(2)インジケーターや価格条件に落とし込む
(3)MQL4言語でEAとして実装する
(4)ストラテジーテスターでバックテストを行う
(5)パラメーター調整と最適化を行う
(6)デモ口座でフォワードテスト(試運用)を行う
(7)リスク管理ルールを定めたうえで本番口座で運用する

この記事では、この流れのうち「ルールをインジケーターに落とし込む」「基本的なMQL4によるEA実装」の部分にフォーカスして解説します。

自動売買ロジックを設計するステップ

ステップ1:市場と時間軸を決める

最初に決めるべきは「どの市場を」「どの時間軸で」取引するかです。例えば、FXなら主要通貨ペア(EURUSD、USDJPYなど)、暗号資産ならボラティリティの高いBTCUSDやETHUSDといった組み合わせが候補になります。

時間軸については、M5やM15などの短期足はチャンスが多い反面、スプレッドやノイズの影響が大きく、初心者には難しくなりがちです。まずはH1やH4といった中期足で、明確なトレンドを捉えるシステムから始める方が、検証しやすく再現性も高くなります。

ステップ2:どのインジケーターを使うか決める

次に、トレンド系・オシレーター系インジケーターを組み合わせて、売買ルールを設計します。代表的な選択肢としては以下が挙げられます。

・移動平均線(MA):トレンド方向の把握とゴールデンクロス/デッドクロスの判定
・RSI:買われ過ぎ・売られ過ぎの判定と押し目・戻りのタイミング検討
・MACD:トレンド転換のサインやダマシのフィルターとして活用
・ボリンジャーバンド:ボラティリティの拡大・収縮やレンジブレイクの検出

初心者が最初に取り組むなら、「移動平均線+RSI」や「移動平均線+MACD」といったシンプルな組み合わせがおすすめです。

ステップ3:具体的な売買ルールに落とし込む

インジケーターを決めたら、売買ルールを「誰が読んでも同じ解釈になるレベル」まで文章化します。例えば、以下のようなルールです。

・エントリー条件(買い)
(1)短期移動平均線(20期間)が長期移動平均線(50期間)を下から上に抜けた(ゴールデンクロス)。
(2)RSI(14)が30以上で、かつ50以下の範囲にある(売られ過ぎから回復しつつある局面)。

・決済条件(買いポジションのクローズ)
(1)短期移動平均線が長期移動平均線を上から下に抜けた(デッドクロス)。
(2)もしくは、RSIが70を上回ったタイミングで利確。

・損切り条件
エントリー価格から一定pips(例:30pips)逆行したら損切り。

このように文字でルールを書き出しておくと、MQL4で実装する際に条件式に変換しやすくなります。

ステップ4:リスク管理ルールを同時に設計する

EAがどれだけ優れていても、リスク管理が甘ければ資金が一気に減る可能性があります。ロットの決め方、同時保有ポジション数の上限、連敗時にロットを落とすかどうか、といった点も最初からルール化しておくことが重要です。

初心者であれば、1トレードあたりの想定損失を口座残高の1〜2%以内に抑える設計を意識することで、連敗が続いても致命的な損失を避けやすくなります。

基本インジケーターを使ったEAロジックの具体例

例1:移動平均線クロス+RSIフィルターEA

ここでは、移動平均線クロスをベースに、RSIでダマシを減らすシンプルなEAロジックを紹介します。

・使用インジケーター
短期移動平均線:期間20(SMA)
長期移動平均線:期間50(SMA)
RSI:期間14

・買いエントリー条件
(1)直近の確定足で、短期移動平均線が長期移動平均線を下から上にクロスした。
(2)同じ足のRSIが30〜60の範囲にある。

・売りエントリー条件
(1)直近の確定足で、短期移動平均線が長期移動平均線を上から下にクロスした。
(2)同じ足のRSIが40〜70の範囲にある。

・決済ルール
(1)移動平均線のクロスが逆方向に発生したら決済。
(2)もしくは、エントリーから一定pipsの利確・損切り幅に到達したら自動決済。

このようなロジックは、トレンドフォロー型の基本形として扱いやすく、初心者でもバックテストと調整を繰り返すことで、相場に合ったパラメーターを探しやすい構造になっています。

例2:ボリンジャーバンドブレイクEA

レンジ相場からトレンド相場への移行を狙う戦略として、ボリンジャーバンドのブレイクを利用するEAも人気です。

・使用インジケーター
ボリンジャーバンド:期間20、偏差2.0

・買いエントリー条件
(1)前の足の終値がボリンジャーバンドの+2σラインを上抜けた。
(2)その一つ前の足までは、終値がバンド内に収まっていた。

・売りエントリー条件
(1)前の足の終値がボリンジャーバンドの−2σラインを下抜けた。
(2)その一つ前の足までは、終値がバンド内に収まっていた。

・決済ルール
(1)一定pipsの利確・損切り。
(2)もしくは、終値がミドルバンド(20期間移動平均線)に戻ったタイミングでクローズ。

このロジックは、ボラティリティ拡大時のトレンド発生を狙う一方で、バンドに張り付いたままのトレンド継続局面では含み益を伸ばしやすいという特徴があります。

MT4上でEAを自作するための基本的なMQL4の考え方

MQL4のEAの骨組み

MT4のEAは、基本的に以下のような構造で動作します。

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

売買ロジックの多くはOnTick()の中に記述しますが、「新しい足が確定したタイミングのみで判定する」ようにしないと、1本の足の中で何度も条件を満たしてしまい、過剰なエントリーが発生することがあります。そのため、足確定の判定や、直近足のインジケーター値を取得する方法を押さえることが重要です。

インジケーター値を取得する基本

代表的なインジケーターの値は、MQL4の組み込み関数で取得できます。

・移動平均線:iMA()
・RSI:iRSI()
・MACD:iMACD()
・ボリンジャーバンド:iBands()

例えば、直近の確定足(1本前のバー)における20期間の単純移動平均(SMA)を取得するには、次のようなコードになります。

// 直近確定足の20SMA(終値ベース)を取得
double ma20_prev = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);

同様に、RSIの値を取得するには以下のように記述します。

// 直近確定足のRSI(期間14)
double rsi_prev = iRSI(NULL, 0, 14, PRICE_CLOSE, 1);

シンプルな移動平均クロスEAのサンプル

ここでは、「短期MAが長期MAをゴールデンクロスしたら買い」「デッドクロスしたら売り」というシンプルな例をもとに、EAの構造イメージを示します。

//+------------------------------------------------------------------+
//| 簡単な移動平均クロスEAの例                                      |
//+------------------------------------------------------------------+
input int FastMAPeriod = 20;
input int SlowMAPeriod = 50;
input double Lots       = 0.1;
input int StopLossPips  = 30;
input int TakeProfitPips= 60;

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
  }

void OnTick()
  {
   // 新しい足が確定したタイミングのみ処理する例(簡易版)
   static datetime lastTime = 0;
   datetime currentTime = iTime(NULL, 0, 0);
   if(currentTime == lastTime) return;
   lastTime = currentTime;

   // 直近2本の足における短期・長期MAを取得
   double fast_prev2 = iMA(NULL,0,FastMAPeriod,0,MODE_SMA,PRICE_CLOSE,2);
   double fast_prev1 = iMA(NULL,0,FastMAPeriod,0,MODE_SMA,PRICE_CLOSE,1);
   double slow_prev2 = iMA(NULL,0,SlowMAPeriod,0,MODE_SMA,PRICE_CLOSE,2);
   double slow_prev1 = iMA(NULL,0,SlowMAPeriod,0,MODE_SMA,PRICE_CLOSE,1);

   // ゴールデンクロス/デッドクロス判定
   bool goldenCross = (fast_prev2 < slow_prev2) && (fast_prev1 > slow_prev1);
   bool deadCross   = (fast_prev2 > slow_prev2) && (fast_prev1 < slow_prev1);

   // ポジション保有状況を確認
   int total = OrdersTotal();
   bool hasBuy  = false;
   bool hasSell = false;
   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol())
           {
            if(OrderType() == OP_BUY)  hasBuy  = true;
            if(OrderType() == OP_SELL) hasSell = true;
           }
        }
     }

   // 売買ロジック
   if(goldenCross && !hasBuy)
     {
      // 既存のSellポジションがあればクローズ
      CloseAll(OP_SELL);
      OpenOrder(OP_BUY);
     }
   else if(deadCross && !hasSell)
     {
      // 既存のBuyポジションがあればクローズ
      CloseAll(OP_BUY);
      OpenOrder(OP_SELL);
     }
  }

void OpenOrder(int type)
  {
   double sl = 0;
   double tp = 0;
   double price = (type == OP_BUY) ? Ask : Bid;
   double point = MarketInfo(Symbol(), MODE_POINT);

   if(type == OP_BUY)
     {
      sl = price - StopLossPips * point * 10;
      tp = price + TakeProfitPips * point * 10;
     }
   else if(type == OP_SELL)
     {
      sl = price + StopLossPips * point * 10;
      tp = price - TakeProfitPips * point * 10;
     }

   OrderSend(Symbol(), type, Lots, price, 3, sl, tp, "MA Cross EA", 0, 0, clrNONE);
  }

void CloseAll(int type)
  {
   int total = OrdersTotal();
   for(int i=total-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderType() == type)
           {
            if(type == OP_BUY)  OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrNONE);
            if(type == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrNONE);
           }
        }
     }
  }

上記はあくまで構造理解のための例です。実運用に使う場合は、スプレッドや約定スリッページの考慮、エラー処理、時間帯フィルターなど、さらに多くの要素を加える必要があります。

バックテストと最適化のポイント

ストラテジーテスターの使い方の基本

MT4のストラテジーテスターを使うと、過去の価格データを用いてEAを検証できます。テストの際は以下の点に注意するとよいでしょう。

・取引する通貨ペアと時間軸を実運用と同じに設定する。
・スプレッドは現実に近い値に設定する。
・テスト期間は、トレンド・レンジ・急変動が含まれるように、できるだけ長い期間を選ぶ。

バックテストの結果は、収益曲線だけでなく、最大ドローダウン、勝率、PF(プロフィットファクター)、平均損益pipsなども併せて確認します。一時的な成績の良さだけでなく、「資金曲線が安定して右肩上がりになっているか」を重視することが大切です。

パラメーター最適化の注意点

移動平均線の期間やRSIのしきい値などは、ストラテジーテスターの最適化機能を使って調整できます。ただし、過度な最適化を行うと、過去データにだけ都合よくフィットした「過剰最適化(オーバーフィッティング)」になり、将来の相場では通用しない可能性が高くなります。

パラメーター最適化を行う際は、以下のような方針を意識するとよいでしょう。

・少数のパラメーターだけを調整し、複雑にしすぎない。
・パラメーターの「山」が広い領域で成績が良好な組み合わせを選ぶ。
・最適化に使用した期間と異なる期間で再度テストし、一貫性を確認する。

フォワードテストと運用開始までのステップ

デモ口座でのフォワードテスト

バックテストである程度納得できる結果が得られたら、次はデモ口座でフォワードテストを行います。実際のリアルタイムの価格配信環境でEAを動かすことで、バックテストでは見えなかった挙動や、スプレッド・約定状況の影響を確認できます。

フォワードテスト期間中は、取引履歴を定期的に見直し、期待していた動きをしているか、想定外のタイミングでエントリーや決済をしていないかをチェックします。必要に応じて、ロジックの微修正やパラメーターの見直しを行いましょう。

本番運用時のリスク管理

本番口座でEAを稼働させる段階では、リスク管理がさらに重要になります。口座全体のレバレッジ、同時稼働するEAの数、相関性の高い通貨ペアを複数扱っていないかなどを確認し、最悪のケースでも致命的な損失にならないよう設計することが大切です。

また、EAに任せきりにするのではなく、経済指標発表や流動性が低下する時間帯など、特定のイベントに対する運用方針(EAを一時停止するかどうかなど)もあらかじめ決めておくと、予想外の相場急変に対応しやすくなります。

初心者がMT4自動売買EA作りでつまずきやすいポイント

ありがちな誤解と注意点

EAを作り始めたばかりの初心者が陥りがちな誤解として、「過去10年で右肩上がりのバックテスト結果が出たEAは、今後も同じように稼ぎ続ける」という考え方があります。実際には、市場環境は常に変化しており、どんなロジックでも得意な局面・苦手な局面が存在します。

そのため、「どの期間で成績が良かったか」だけでなく、「どのような相場状況では成績が悪化しやすいか」を把握し、苦手な局面をフィルターで回避するのか、それともドローダウンを許容するのか、といった方針を決めておくことが重要です。

ロジックを複雑にしすぎない

インジケーターを増やしすぎると、一見すると勝率が高いバックテスト結果が得られる場合がありますが、その多くは過去データに過剰適合した状態です。インジケーターの数は必要最低限に絞り、「なぜその指標を使うのか」「それがマーケットのどのような特徴を捉えているのか」を説明できる状態にしておくことが、長期的な運用には有利に働きます。

小さく始めて、少しずつ改善する

完璧なEAを一度で完成させようとするのではなく、まずはシンプルなロジックで小さく始め、バックテストとフォワードテストを通じて、少しずつ改善していく姿勢が重要です。運用しながら「どの局面でうまく機能しなかったか」を記録し、それに対する改善案を一つずつ実装していくことで、EAは徐々に洗練されていきます。

まとめ:MT4自動売買EA作りは「ロジックの言語化」から始まる

MT4で自動売買を行うには、単にプログラムを書くのではなく、まず「どのような相場の動きを捉えたいのか」を明確にし、それを移動平均線やRSIといったインジケーターに落とし込むことが出発点です。そのうえで、MQL4による実装、バックテスト、フォワードテスト、リスク管理といったプロセスを通じて、自分の資金と性格に合ったEAへと育てていきます。

最初の一歩として、ここで紹介したような移動平均線クロス+RSIフィルター、ボリンジャーバンドブレイクといったシンプルなロジックから始めてみると、EAの動きが直感的に理解しやすく、改善ポイントも見つけやすくなります。小さなロジックを一つずつ検証し、自分なりの自動売買システムを構築していくことで、裁量トレードとは異なる収益の柱を育てていくことができるでしょう。

p-nuts

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

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

コメント

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