MT4でMACD EAを作成|無料MQL4サンプルコード解説

MACD1
EAサンプル・ノウハウ
記事内に商品プロモーションを含む場合があります
スポンサーリンク

はじめに

「MACDを使ったクロスロジックを、FX自動売買EAとして自動化したい!」という方向けに、この記事では MT4(MQL4)で動作する無料MACD EAサンプルコード を紹介します。
初心者でもコピペで動かせるので、学習用や実験用に最適です。

MACDはトレンドの強弱や方向性を把握するための代表的なインジケーターで、裁量トレードでも広く使われています。この記事では、MACDとシグナル線のクロスを使って、自動でエントリー・決済する方法を解説します。


📈 MACDとは?

MACD(Moving Average Convergence Divergence)は、短期EMAと中期EMAの差をベースに、シグナル線とのクロスで売買判断を行うテクニカル指標です。

一般的なサインは次の通り:

  • ゴールデンクロス(買いサイン):MACDがシグナルを下から上に抜ける
  • デッドクロス(売りサイン):MACDがシグナルを上から下に抜ける

👉 裁量でも人気の手法を、そのままEAに組み込みました。


EAの概要とポイント

  • MT4標準インジケータの iMACD() を使って自動判定
  • MACDとシグナル線のクロスで売買エントリー
  • 利確・損切はTP/SLのパラメータ設定でシンプルに制御
  • MACDパラメータ(12,26,9など)、SL幅などをパラメータでカスタマイズ可能

MACD決済処理を追加した利益追求型の記事はこちら


エントリーロジック解説

  • 買いエントリー(ロング):
    MACDがシグナルを下から上にクロスした時
  • 売りエントリー(ショート):
    MACDがシグナルを上から下にクロスした時

さらに「プラス圏/マイナス圏」の条件を加えることで、精度を調整できるようにしています。


⚠️ 注意点

  • MACDはトレンド方向を見やすいが、レンジ相場ではダマシも多い
  • RSIや移動平均線と組み合わせると精度アップ
  • 新しいローソク足確定時に1回だけ判定
  • マジックナンバー非対応(このEA単独で運用推奨)

ダウンロード

EAファイルのダウンロードはこちら👇

📥 MACDのEA をダウンロード

📜 MACD EAのサンプルコード解説

以下にMQL4サンプルコードを掲載します。
そのままコピーしてMT4(MetaEditor)に貼り付ければコンパイル可能で、動作確認も済んでいます。

//+------------------------------------------------------------------+
//|                                                      07_MACD.mq4 |
//|                                Copyright © 2020-2025 ぷろぐらむFX |
//|                                             https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020-2025 ぷろぐらむFX"
#property link      "https://fx-prog.com/"
#property version   "1.00"
#property strict


input double Lots = 0.01;              //ロット
input int TP = 100;                    //利確(pips)
input int SL = 100;                    //損切り(pips)
//***【パラメータ設定↓】MACD***//
input int MACD_FE_PERIOD = 12;         //MACDファストEMA期間
input int MACD_SE_PERIOD = 26;         //MACDスローEMA期間
input int MACD_SS_PERIOD = 9;          //MACDシグナル期間
//***【パラメータ設定↑】MACD***//

string Ea_Name = WindowExpertName();   //チャート上のEA名称を取得(オーダーコメントに使用)

double PipValue;                       //ブローカー桁数に対応した Point 補正
datetime prevtime;                     //ローソク足時間保持用
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(){

   //デジットチェック
   if (Digits == 3 || Digits == 5){
      PipValue = Point * 10;   // 例: EURUSD 1.23456 → 1pip = 0.00010
   }else{
      PipValue = Point;        // 例: USDJPY 123.45 → 1pip = 0.01
   }

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(){

   int total = OrdersTotal();    //ポジショントータル数をセット  
   int ea_order_Type = -1; //0:OP_BUY  1:OP_SELL
   double ea_order_stop_price = 0; //ストップロスレート
   double ea_order_good_price = 0; //利確レート

   //新しい足ができた時だけやる
   if(Time[0] != prevtime){
      prevtime = Time[0];
   }else{
      return;
   }

   //ポジションがない場合はエントリー判定
   if(total == 0){

      bool openBuy  = false;    //買い新規注文判断
      bool openSell = false;    //売り新規注文判断
      
//***【新規注文判断↓】***//
      bool isBullMACD_S = false;
      bool isBearMACD_S = false;

      // MACDシグナル取得(3=下から上クロス(マイナス圏)、4=上から下クロス(プラス圏))
      // 直近の確定バーでクロス判定
      if(getMACDSign(3, 2, 1)){   // マイナス圏で下から上
         isBullMACD_S = true;
      }
      else if(getMACDSign(4, 2, 1)){ // プラス圏で上から下
         isBearMACD_S = true;
      }
            
//***【新規注文判断↑】***//

      //参照するサンプルEAの買いエントリーフラグをセットしてください
      if(isBullMACD_S){
         openBuy =true;
         ea_order_Type = OP_BUY;
      //参照するサンプルEAの売りエントリーフラグをセットしてください      
      }else if(isBearMACD_S){
         openSell =true;
         ea_order_Type = OP_SELL;
      }

//***【TP/SL判断↓】***//
      if(openBuy){
         ea_order_stop_price = Ask - SL * PipValue;
         ea_order_good_price = Ask + TP * PipValue;
      }else if(openSell){
         ea_order_stop_price = Bid + SL * PipValue;  
         ea_order_good_price = Bid - TP * PipValue;   
      }
//***【TP/SL判断↑】***//

      if(ea_order_Type > -1){
         funcOrder_Send(ea_order_Type,ea_order_stop_price,ea_order_good_price,Lots,Ea_Name,777,0);
      }
   }
   
   return;
}

//***【関数(MACD用)↓】***//
bool getMACDSign(int type, int limit, int i)
{
   bool sign = false;
   double MACD_1, Signal_1, MACD_2, Signal_2;

   int start = i + 1;
   int end   = i + limit;

   for(int n = start; n < end; n++) // n+1があるので "< end"
   {
      // iMACDは戻り値がMACD - Signal(ヒストグラム値)
      // mode=MODE_MAIN → ヒストグラム, mode=MODE_SIGNAL → シグナル線
      MACD_1   = iMACD(NULL, 0, MACD_FE_PERIOD, MACD_SE_PERIOD, MACD_SS_PERIOD, PRICE_CLOSE, MODE_MAIN,   n);
      Signal_1 = iMACD(NULL, 0, MACD_FE_PERIOD, MACD_SE_PERIOD, MACD_SS_PERIOD, PRICE_CLOSE, MODE_SIGNAL, n);

      MACD_2   = iMACD(NULL, 0, MACD_FE_PERIOD, MACD_SE_PERIOD, MACD_SS_PERIOD, PRICE_CLOSE, MODE_MAIN,   n+1);
      Signal_2 = iMACD(NULL, 0, MACD_FE_PERIOD, MACD_SE_PERIOD, MACD_SS_PERIOD, PRICE_CLOSE, MODE_SIGNAL, n+1);

      // 誤差許容
      double eps = Point * 0.1;

      if(type==1 || type==3){ // 下から上
         if(MACD_2 < Signal_2 - eps && MACD_1 >= Signal_1 - eps){
            if(type==3 && MACD_1 > -eps) continue; // マイナス域限定
            sign = true;
            break;
         }
      }
      else if(type==2 || type==4){ // 上から下
         if(MACD_2 > Signal_2 + eps && MACD_1 <= Signal_1 + eps){
            if(type==4 && MACD_1 < eps) continue; // プラス域限定
            sign = true;
            break;
         }
      }
   }

   return sign;
}
//***【関数(MACD用)↑】***//

//★★★★★★★★★★★★★★★★★★★★ ここから下は共通関数 ★★★★★★★★★★★★★★★★★★★★
//+------------------------------------------------------------------+
//|【関数】新規注文関数
//|
//|【引数】 orderType:売買(0=BUY, 1=SELL)
//|【引数】 sl:損切り価格  tp:利確価格
//|【引数】 lots:取引ロット数
//|【引数】 orderComment:オーダーコメント
//|【引数】 magic:マジックNo
//|【引数】 maxSpreadPips: 許容スプレッド[Point] (0=制限なし)
//|
//|【戻値】true=成功 false=失敗
//+------------------------------------------------------------------+
bool funcOrder_Send(int orderType, double sl, double tp, double lots,
                    string orderComment, int magic, int maxSpreadPoints){
   int    ticket = -1;
   double price  = 0;
   color  clr    = clrNONE;
   double spread = 0;

   // 最大10回リトライ
   for(int retry=0; retry<10; retry++)
   {
      RefreshRates();
      
      // スプレッド取得(MT4表示と同じポイント単位)
      spread = MarketInfo(Symbol(), MODE_SPREAD);

      // スプレッドチェック(maxSpreadPoints=0 の場合はスキップ)
      if(maxSpreadPoints > 0 && spread > maxSpreadPoints){
         Print("スプレッド拡大中(", spread,
               "ポイント) → 待機中 (リトライ=", retry+1, ")");
         Sleep(2000);
         continue;
      }

      // エントリー価格と色を決定
      if(orderType == OP_BUY){
         price = Ask;
         clr   = clrBlue;
      }else if(orderType == OP_SELL){
         price = Bid;
         clr   = clrRed;
      }

      ticket = OrderSend(Symbol(), orderType, lots, price,
                         20, sl, tp, orderComment, magic, 0, clr);

      if(ticket > 0){
         Print("新規注文成功! チケットNo=", ticket,
               " レート=", price, " Lots=", lots,
               " スプレッド=", spread, "ポイント");
         return true;
      }else{
         int err = GetLastError();
         Print("新規注文失敗 エラーNo=", err,
               " リトライ回数=", retry+1);
         Sleep(2000);
      }
   }

   return false;
}
 
スポンサーリンク

iMACD() 関数の解説

MACDの値やシグナル線を取得するために iMACD() を使用します。

【使用例】

double macd   = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN,   1);
double signal = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 1);

引数の意味

  • 引数1 … 通貨ペア
    NULL で現在のチャートを対象
  • 引数2 … 時間軸
    0 で現在の時間足を対象
  • 引数3 … 短期EMA
    短期EMAの値を設定
  • 引数4 … 長期EMA
    長期EMAの値を設定
  • 引数5 … シグナル
    シグナル線の値を設定
  • 引数6 … 適用価格
    Close(終値ベース)や Open(始値ベース)などを選択
  • 引数8 … 取得モード
    MODE_MAIN … MACD本体(ヒストグラム値)
    MODE_SIGNAL … シグナル線の値
  • 引数9 … バーシフト
    0 で最新足、1 で1本前、2 で2本前の値を取得

MACD利用箇所

  • 新規注文処理(68〜79行目) … MACD判定関数を元にクロスをチェック
  • 決済処理は無し(本EAは「TP/SLで管理」)
  • MACD判定処理(111〜150行目) … getMACDSign() で売買判定

自作関数 getMACDSign() について

サンプルコードでは、MACDのクロス判定を行うために getMACDSign() 関数を作っています。
この関数だけをコピペすれば、MACDとシグナル線のクロスを簡単に判定できます。

処理内容

  • iMACD() で MACD値とシグナル値を取得
  • 大小を比較してクロスを判定
  • クロスしていれば true、していなければ false を返す

👉 例えば、デッドクロス後は「MACD値(水色)がシグナル値(赤)より小さい」状態が続くので、その比較結果を利用しています。

MACDEAのエントリーポイント解説

引数について

getMACDSign( type , limit , shift )

  1. type(引数1)
    • クロス判定の種類(ゴールデンクロス/デッドクロスなど)
    • 例)3 → MACDが0ラインより上でゴールデンクロスした時のみロング
    • 例)1 にすると「0ラインに関係なくクロス」でエントリー可能
  2. limit(引数2)
    • クロス判定を維持するバー数
    • 例)1 → 最新バーのみ判定
    • 例)5 → クロス後5本のバーまで true を返す
    👉 RSIなど他の指標と組み合わせたい場合に便利です。
  3. shift(引数3)
    • 判定タイミングを何本ずらすか
    • 例)0 → 現在バーで判定
    • 例)1 → 1本前のバーで確定したクロスを判定

使い方例

// 0ライン考慮あり(推奨設定)
if(getMACDSign(3,1,0)) OrderSend(...);   // ロング条件
if(getMACDSign(4,1,0)) OrderSend(...);   // ショート条件

// 0ライン無視でクロス判定
if(getMACDSign(1,1,0)) OrderSend(...);   // ロング
if(getMACDSign(2,1,0)) OrderSend(...);   // ショート

👉 初心者はまず (3,1,0)(4,1,0) を使うのが無難です。

MACDの売買判定について

MACDEAのトレードイメージ画像

MACDがシグナルを下から上に抜けると買い、MACDがシグナルを上から下に抜けると売りとなります。
【MT4カスタマイズ】MACDをヒストグラムからライン表示に変更する方法

新規注文について

本記事のMACD EAで使用している「新規注文処理」は、当サイト共通のベースソースに含まれています。
EAを効率的に自作したい方は、以下の記事もあわせて参考にしてください。
👉 MT4 EAベースソースコード(無料配布・カスタマイズ容易)
👉 新規・変更・決済注文関数の詳しい解説はこちら


パラメータとカスタマイズ

今回のパラメータ設定は以下の通り:

  • 取引ロット数(0.01で1000通貨)
  • 利確(pips)
  • 損切り(pips)
  • MACDファストEMA期間(例:12)
  • MACDスローEMA期間(例:26)
  • MACDシグナル期間(例:9)

👉 値を調整することで、短期トレード〜長期トレードまで幅広く対応可能です。

MT4でMACD EAを作成|無料MQL4サンプルコード解説
スポンサーリンク

EAバックテストレポート

USDJPY(H1, 2024/08〜2025/08, 初期証拠金100万円, FXTFヒストリカル)での結果:

通貨ペア・時間足PF勝率最大DD取引回数備考
USDJPY H11.3373%1.09%114回トレード回数は少ないがしっかりと勝っている
MACDEAのバックテストレポート

まとめ

MACD EAは裁量でも人気のインジケーターを自動化したシンプルなEAです。

  • ゴールデンクロス/デッドクロスで順張りエントリー
  • プラス圏/マイナス圏のフィルタ条件付き
  • シンプルなので初心者にも分かりやすい

まずはサンプルコードを試してみて、自分の環境でバックテストを行ってみましょう。調整や改良次第で実用的なEAへと発展できます。

🛠️ EAを効率的にカスタマイズしたい方へ
【MT4 EAベースソース】を無料公開中!初心者でもすぐに使えます。

MACD決済処理を追加した利益追求型の記事はこちら👇


✅ 他にも多数のEAサンプルを公開中!

今回紹介した内容以外にも、当サイトではさまざまな
FX自動売買EAのサンプルコードを提供しています。

自分に合った戦略のEAを見つけたい方は、ぜひチェックしてみてください。


📊 【2025年最新】FX自動売買EAランキングも公開中!

当サイトの「どのEA(インジ)が実際に勝っているのか?」を知りたい方はこちら👇
PF(プロフィットファクター)や勝率で徹底比較した最新ランキングから、あなたに最適なEA(インジ)を見つけましょう。


EA開発初心者向けに、今後も実践的なMQL4関数を紹介していきます。
気になる機能やロジックがあれば、ぜひ他の記事もあわせてご覧ください!

コメント

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