【MQL5】iMACD関数の使い方|MACDのクロスとゼロラインをEAで使うサンプルコード

【MQL5】iMACD関数の使い方|MACDのクロスとゼロラインをEAで使うサンプルコード MQL5リファレンス

iMACD関数は、MACD(移動平均収束拡散)の値をMQL5から取得する関数です。MACDは2本のEMAの差で「トレンドの向きと勢い」を見る指標で、MACD線とシグナル線のクロスゼロラインとの位置関係が売買の合図になります。この記事では、構文と「ハンドル+CopyBufferの2段階」、そしてコピーしてすぐ動く4つのサンプル(現在値の取得・クロス検出・ゼロラインでのトレンド判定・売買する最小EA)を解説します。

iMACD(MACD)とは

MACDは 「短期EMA − 長期EMA」を表す MACD線と、それをさらに平滑化した シグナル線の2本で構成されます。一般的な見方は次の2つです。

  • クロス:MACD線がシグナル線を上抜け=買い、下抜け=売り
  • ゼロライン:MACD線が0より上=上昇優勢、0より下=下降優勢(トレンドの土台判定)
前提:値の取り出しは「2段階」
「① OnInit() でハンドルを作る → ② OnTick()CopyBuffer() により取り出す」。詳しくは iMAの記事 を参照してください。iMACDはバッファが2本(0=MACD線/1=シグナル線)ある点がポイントです。

iMACD() の構文と引数

int  iMACD(
   string              symbol,            // 通貨ペア(_Symbol)
   ENUM_TIMEFRAMES     period,            // 時間足(PERIOD_CURRENT 等)
   int                 fast_ema_period,   // 短期EMA(一般的に 12)
   int                 slow_ema_period,   // 長期EMA(一般的に 26)
   int                 signal_period,     // シグナル(一般的に 9)
   ENUM_APPLIED_PRICE  applied_price      // 適用価格(通常 PRICE_CLOSE)
);

戻り値はハンドル。値の取り出しでは CopyBuffer()バッファ番号を使い分けます。

バッファ番号 内容
0 MACD線(本体)
1 シグナル線

※ ヒストグラム(棒)は「MACD線 − シグナル線」で自分で計算できます。iMACDのバッファは上記2本です。

サンプル①:MACDとシグナルの現在値を取得する

コピペOK

int macdHandle = INVALID_HANDLE;

int OnInit()
{
   // ① ハンドルを1回だけ作る(12, 26, 9・終値)
   macdHandle = iMACD(_Symbol, PERIOD_CURRENT, 12, 26, 9, PRICE_CLOSE);
   if(macdHandle == INVALID_HANDLE)
   {
      Print("iMACDハンドルの作成に失敗: ", GetLastError());
      return(INIT_FAILED);
   }
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   double macd[], sig[];
   ArraySetAsSeries(macd, true);
   ArraySetAsSeries(sig,  true);

   // ② バッファ0=MACD線、バッファ1=シグナル線
   if(CopyBuffer(macdHandle, 0, 0, 2, macd) < 2) return;
   if(CopyBuffer(macdHandle, 1, 0, 2, sig)  < 2) return;

   Comment("MACD = ", DoubleToString(macd[0], _Digits),
           "  /  Signal = ", DoubleToString(sig[0], _Digits));
}

void OnDeinit(const int reason)
{
   IndicatorRelease(macdHandle);
}

サンプル②:ゴールデンクロス/デッドクロスを検出する

MACD線がシグナル線をまたいだ瞬間をクロスとして判定します。確定足の [1] と [2]を比較し、新しい足ができた時だけチェックします(リペイント防止)。

コピペOK

datetime lastBar = 0;

void OnTick()
{
   datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
   if(t == lastBar) return;
   lastBar = t;

   double macd[], sig[];
   ArraySetAsSeries(macd, true);
   ArraySetAsSeries(sig,  true);
   if(CopyBuffer(macdHandle, 0, 0, 3, macd) < 3) return;
   if(CopyBuffer(macdHandle, 1, 0, 3, sig)  < 3) return;

   // MACDがシグナルを下から上へ=ゴールデンクロス(買い)
   bool golden = (macd[2] <= sig[2] && macd[1] > sig[1]);
   // MACDがシグナルを上から下へ=デッドクロス(売り)
   bool dead   = (macd[2] >= sig[2] && macd[1] < sig[1]);

   if(golden) Print("MACDゴールデンクロス");
   if(dead)   Print("MACDデッドクロス");
}

サンプル③:ゼロラインでトレンドの土台を見る

MACD線が0より上か下かで、相場の大きな傾きを判定できます。「0より上のときだけ買いのクロスを採用する」といったフィルターに使うと、逆行を減らせます。

コピペOK

double macd[], sig[];
ArraySetAsSeries(macd, true);
ArraySetAsSeries(sig,  true);
if(CopyBuffer(macdHandle, 0, 0, 3, macd) < 3) return;
if(CopyBuffer(macdHandle, 1, 0, 3, sig)  < 3) return;

bool bull   = (macd[1] > 0.0);                          // MACDが0より上=上昇優勢
bool golden = (macd[2] <= sig[2] && macd[1] > sig[1]);   // クロス

// ゼロラインより上で起きたゴールデンクロスだけを「買い」とする
if(golden && bull) Print("買い(0ライン上でのGC)");

// ヒストグラム(勢い)が必要なら自分で計算
double histogram = macd[1] - sig[1];

サンプル④:MACDクロスで売買する最小EA

ゴールデンクロスで買い、デッドクロスで決済する、動く最小EAです。CTrade を使います。

コピペOK(デモ口座で動作確認用)

#include <Trade\Trade.mqh>
CTrade   trade;
int      macdHandle;
datetime lastBar = 0;
input double InpLot = 0.10;

int OnInit()
{
   macdHandle = iMACD(_Symbol, PERIOD_CURRENT, 12, 26, 9, PRICE_CLOSE);
   if(macdHandle == INVALID_HANDLE) return(INIT_FAILED);
   trade.SetExpertMagicNumber(20260618);
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
   if(t == lastBar) return;
   lastBar = t;

   double macd[], sig[];
   ArraySetAsSeries(macd, true);
   ArraySetAsSeries(sig,  true);
   if(CopyBuffer(macdHandle, 0, 0, 3, macd) < 3) return;
   if(CopyBuffer(macdHandle, 1, 0, 3, sig)  < 3) return;

   bool golden = (macd[2] <= sig[2] && macd[1] > sig[1]);
   bool dead   = (macd[2] >= sig[2] && macd[1] < sig[1]);

   if(golden && PositionsTotal() == 0)
      trade.Buy(InpLot, _Symbol);

   if(dead)
   {
      for(int i = PositionsTotal() - 1; i >= 0; i--)
      {
         ulong ticket = PositionGetTicket(i);
         if(PositionSelectByTicket(ticket) &&
            PositionGetString(POSITION_SYMBOL) == _Symbol)
            trade.PositionClose(ticket);
      }
   }
}

void OnDeinit(const int reason)
{
   IndicatorRelease(macdHandle);
}
これは学習用の最小サンプルです
SL・TP・スプレッド確認・資金管理は入っていません。実運用には必須の安全装置を足し、必ずデモ口座で確認してください。

MACDを使うときの注意・落とし穴

① レンジではクロスが頻発してダマシだらけ
方向感のないレンジでは、MACDとシグナルが何度も交差します。ゼロラインや上位足トレンド(iMA)と組み合わせ、トレンド方向のクロスだけを採用すると安定します。
② バッファ番号を取り違えない
0=MACD線、1=シグナル線。逆にすると判定が崩れます。
③ お決まりの3点
ハンドルは OnInit() で1回/CopyBuffer() の戻り値チェック/ArraySetAsSeries(配列, true)

まとめ

  • iMACD() はハンドルを返す。バッファ0=MACD線・1=シグナル線CopyBuffer() で取得
  • 売買の基本はクロス(MACD×シグナル)とゼロライン(0より上/下)
  • 判定は確定足 [1]・[2]で、新バー時のみ
  • レンジではダマシが多い → ゼロライン・上位足トレンドでフィルター
  • ヒストグラムは「MACD − シグナル」で自分で計算できる
タイトルとURLをコピーしました