MQL5 iMACDの使い方完全ガイド|MACD取得・CopyBuffer・EA実装まで解説

目次

1. MQL5の iMACD とは何か

MQL5の iMACD は、MetaTrader 5(MT5)で MACD(Moving Average Convergence Divergence)インジケーターの値を取得するための標準関数です。
MACDはテクニカル分析で広く使われる指標であり、トレンドの強さや転換の兆候を判断するために利用されます。

裁量トレードではチャートに表示されたMACDを目視で確認しますが、EA(自動売買プログラム)では プログラムからMACDの値を取得して売買判断に利用します。その際に使うのが iMACD です。

ただし、MQL5では初心者が混乱しやすい重要なポイントがあります。

iMACD はMACDの値を直接返す関数ではありません。

この関数が返すのは インジケーターハンドル(indicator handle) と呼ばれる識別子です。
実際のMACD値は、このハンドルを使って CopyBuffer 関数で取得するという構造になっています。

この仕組みはMQL4と大きく異なるため、初めてMQL5を扱う人が最もつまずきやすい部分の一つです。

1.1 MACD(Moving Average Convergence Divergence)の基本

MACDは、2つの移動平均(EMA)の差を利用してトレンドの勢いを測るテクニカル指標です。

主に次の3つの要素で構成されています。

  • MACDライン
    短期EMA − 長期EMA
  • シグナルライン
    MACDラインの移動平均
  • ヒストグラム
    MACDラインとシグナルラインの差

トレードでは主に以下のように利用されます。

  • ゴールデンクロス
    MACDラインがシグナルラインを上抜け → 上昇の可能性
  • デッドクロス
    MACDラインがシグナルラインを下抜け → 下降の可能性
  • モメンタム確認
    トレンドの勢いを測る

MACDは「トレンド系」と「モメンタム系」の特徴を併せ持つため、
トレンドフォロー型のEAでよく使われる指標です。

1.2 MQL5でMACDを使う2つの方法

MQL5でMACDを利用する方法は主に次の2つです。

方法1:標準関数 iMACD を使用する

最も一般的な方法です。

特徴

  • MT5標準インジケーターを利用
  • コードがシンプル
  • 動作が安定している

EA開発では、基本的にこの方法が使われます。

方法2:iCustom でカスタムMACDを呼び出す

カスタムインジケーターを利用する方法です。

  • 改良MACD
  • 特殊な計算式
  • 独自シグナル

ただし、通常のMACDを使う場合は iMACD の方がシンプルで管理しやすいため、まずはこちらを覚えるのが一般的です。

1.3 EA開発でMACDが使われる場面

MACDはEA開発でも非常に利用頻度の高い指標です。

代表的な利用方法は次の通りです。

1 トレンドエントリー

  • MACDクロスを利用
  • トレンド初動を狙う

2 トレンドフィルター

  • MACD > 0 → 上昇トレンド
  • MACD < 0 → 下降トレンド

3 エントリー確認

他の指標と組み合わせる例

  • RSI
  • 移動平均
  • ATR

例えば

  • 移動平均でトレンド判断
  • MACDでエントリー確認

というように 複数のインジケーターを組み合わせる設計がよく使われます。

よくある初心者の失敗

1 iMACD だけで値が取得できると思ってしまう

これはMQL5初心者に非常に多いミスです。

double macd = iMACD(...);

このような書き方は MQL5では動作しません。

理由

  • iMACDハンドルを返す関数

値の取得には

CopyBuffer()

を使う必要があります。

2 毎Tick iMACD を作ってしまう

NG例

void OnTick()
{
   iMACD(...);
}

これは パフォーマンス低下の原因になります。

正しい方法

  • OnInit() でインジケータ作成
  • OnTick() で値取得

3 データ不足でMACDが取得できない

MACDは複数のEMAを使用するため、
十分な価格履歴がないと値が取得できない場合があります。

特に

  • 新しいチャート
  • テスター開始直後

では発生することがあります。

2. iMACD の構文とパラメータ

MQL5でMACDインジケーターを利用する場合、まず iMACD 関数を使ってインジケーターハンドルを作成します。
このハンドルを使うことで、後から CopyBuffer を通してMACDの値を取得できます。

ここでは iMACD の基本構文と、それぞれのパラメータの意味を初心者向けに整理します。

2.1 iMACD の基本構文

iMACD の基本構文は次の通りです。

int iMACD(
   string symbol,
   ENUM_TIMEFRAMES period,
   int fast_ema_period,
   int slow_ema_period,
   int signal_period,
   ENUM_APPLIED_PRICE applied_price
);

この関数は MACDインジケーターのハンドル(識別番号)を返します。

返り値

  • 成功 → インジケーターハンドル(0以上の整数)
  • 失敗INVALID_HANDLE

EAでは通常、次のように 変数にハンドルを保存して使います。

int macdHandle;

2.2 各パラメータの意味

iMACD の引数には、MACD計算に必要な設定を指定します。

① symbol

対象の通貨ペア(シンボル)を指定します。

NULL

意味

  • 現在のチャートのシンボルを使用

"EURUSD"

特定通貨ペアを指定する場合に使用します。

初心者は NULL を使うのが一般的です。

② period

時間足(タイムフレーム)を指定します。

PERIOD_CURRENT

意味

  • 現在のチャート時間足

PERIOD_M15
PERIOD_H1
PERIOD_D1

EAでは 複数時間足分析に使われることもあります。

③ fast_ema_period

MACDの 短期EMA(指数移動平均)期間です。

一般的な設定

12

この値はMACDの標準設定として広く使われています。

④ slow_ema_period

MACDの 長期EMA期間です。

一般的な設定

26

短期EMAとの差を取ることで、トレンドの勢いを測定します。

⑤ signal_period

MACDの シグナルライン期間です。

一般的な設定

9

MACDラインの移動平均として計算されます。

⑥ applied_price

MACD計算に使用する価格です。

代表例

PRICE_CLOSE

意味

  • 終値を使用

他の例

PRICE_OPEN
PRICE_HIGH
PRICE_LOW
PRICE_MEDIAN

ただし MACDは終値ベースが一般的です。

2.3 iMACD の実装例

EAでは通常、OnInit() 関数内でインジケーターハンドルを作成します。

int macdHandle;

int OnInit()
{
   macdHandle = iMACD(
      NULL,
      PERIOD_CURRENT,
      12,
      26,
      9,
      PRICE_CLOSE
   );

   if(macdHandle == INVALID_HANDLE)
   {
      Print("MACDハンドル作成失敗");
      return(INIT_FAILED);
   }

   return(INIT_SUCCEEDED);
}

ポイント

  • OnInit() で作成
  • ハンドルエラーを必ずチェック

よくある初心者の失敗

1 OnTick() でハンドルを作る

NG例

void OnTick()
{
   int macd = iMACD(NULL,PERIOD_CURRENT,12,26,9,PRICE_CLOSE);
}

問題

  • 毎Tickインジケーター作成
  • パフォーマンス低下

正解

  • OnInit() で作る

2 ハンドルエラーを確認しない

INVALID_HANDLE が返るケース

  • パラメータ異常
  • メモリ不足
  • MT5内部エラー

エラーチェックは EAの安定動作に必須です。

3 取得できる値を勘違いする

iMACD

MACD値を返しません。

返るもの

インジケーターハンドル

実際の値は

CopyBuffer()

で取得します。

3. CopyBuffer を使ってMACD値を取得する方法

iMACD で作成したインジケーターハンドルは、そのままではMACDの値を取得できません。
実際のMACDデータは CopyBuffer 関数を使って取得します。

CopyBufferインジケーターの計算結果(バッファ)を配列にコピーする関数です。
MQL5ではほぼすべてのインジケーターがこの方法で値を取得されます。

そのため iMACDとCopyBufferは必ずセットで使うと理解しておくとよいでしょう。

3.1 MACDのバッファ番号

MACDには複数のデータ系列(バッファ)が存在します。

CopyBuffer を使う際は どのデータを取得するかを番号で指定します。

バッファ番号 内容
0 MACDライン
1 シグナルライン
2 ヒストグラム

トレードロジックでは主に

  • MACDライン
  • シグナルライン

の2つを使うケースが多いです。

3.2 CopyBuffer の基本構文

int CopyBuffer(
   int indicator_handle,
   int buffer_num,
   int start_pos,
   int count,
   double buffer[]
);

主なパラメータ

indicator_handle

  • iMACD で作成したハンドル

buffer_num

  • 取得するデータ種類
  • 例:MACDラインなら 0

start_pos

  • 取得開始位置
  • 0 は最新バー

count

  • 取得するデータ数

buffer[]

  • 結果を格納する配列

3.3 MACDラインを取得するコード例

最も基本的な例です。

double macdBuffer[];

ArraySetAsSeries(macdBuffer,true);

CopyBuffer(
   macdHandle,
   0,
   0,
   3,
   macdBuffer
);

ポイント

  • ArraySetAsSeries(true)
    → 配列を 最新バーから並ぶ形式にする

取得結果

インデックス 内容
macdBuffer[0] 最新MACD
macdBuffer[1] 1本前
macdBuffer[2] 2本前

3.4 MACDクロス判定の例

EAでは MACDとシグナルのクロスを検出することがよくあります。

double macd[3];
double signal[3];

ArraySetAsSeries(macd,true);
ArraySetAsSeries(signal,true);

CopyBuffer(macdHandle,0,0,3,macd);
CopyBuffer(macdHandle,1,0,3,signal);

bool crossUp =
   macd[1] < signal[1] &&
   macd[0] > signal[0];

bool crossDown =
   macd[1] > signal[1] &&
   macd[0] < signal[0];

意味

ゴールデンクロス

前バー:MACD < Signal  
現在バー:MACD > Signal

デッドクロス

前バー:MACD > Signal  
現在バー:MACD < Signal

このロジックは MACD系EAの基本パターンです。

3.5 CopyBuffer 使用時の注意点

1 取得失敗を確認する

CopyBuffer取得した要素数を返します。

int copied = CopyBuffer(macdHandle,0,0,3,macd);

if(copied <= 0)
{
   Print("MACD取得失敗");
}

データ不足などで失敗することがあります。

2 データがまだ計算されていない

EA起動直後やテスター開始直後では
インジケーターがまだ計算されていない場合があります。

この場合

CopyBuffer = -1

になることがあります。

3 配列サイズ不足

配列サイズが不足すると取得に失敗します。

安全策

ArrayResize(macd,3);

4 配列の向きを設定していない

ArraySetAsSeries(true) を忘れると

  • 配列順序が逆
  • ロジック誤動作

になります。

これは初心者が非常に多くハマるポイントです。

よくある初心者の失敗

1 CopyBuffer を毎Tick大量に呼ぶ

過剰呼び出しは EA速度低下の原因になります。

一般的には

  • 必要なデータ数だけ取得
  • 無駄な再取得を避ける

のが基本です。

2 バッファ番号を間違える

0 = MACD
1 = Signal
2 = Histogram

この番号を間違えると 売買ロジックが完全に崩れます。

3 未初期化ハンドルを使う

macdHandle

INVALID_HANDLE

のまま CopyBuffer を呼ぶとエラーになります。

4. MACDクロスを判定するEAロジック

iMACDCopyBuffer を使って値を取得できるようになったら、次は その値をどう売買判断に使うか が重要です。
MACDを使ったEAで最も基本になるのは、MACDラインとシグナルラインのクロス判定です。

ただし、単に「クロスしたら買い・売り」と書くだけでは、実運用では不十分です。
実際のEAでは次の点を整理して実装する必要があります。

  • どのタイミングでクロスとみなすか
  • 確定足で判定するか
  • 同じシグナルで何度も発注しないか
  • 他の条件と組み合わせるか

ここでは、まず 最小構成のMACDクロス判定を理解し、その後で実運用上の注意点を整理します。

4.1 ゴールデンクロスとデッドクロスの判定方法

MACDクロス判定では、通常 現在バーと1本前のバーを比較します。

考え方は次の通りです。

ゴールデンクロス

  • 1本前では MACDライン < シグナルライン
  • 現在では MACDライン > シグナルライン

つまり、下から上へ抜けた状態です。

デッドクロス

  • 1本前では MACDライン > シグナルライン
  • 現在では MACDライン < シグナルライン

つまり、上から下へ抜けた状態です。

コード例は次のようになります。

double macd[2];
double signal[2];

ArraySetAsSeries(macd,true);
ArraySetAsSeries(signal,true);

if(CopyBuffer(macdHandle,0,0,2,macd) <= 0) return;
if(CopyBuffer(macdHandle,1,0,2,signal) <= 0) return;

bool goldenCross =
   (macd[1] < signal[1]) &&
   (macd[0] > signal[0]);

bool deadCross =
   (macd[1] > signal[1]) &&
   (macd[0] < signal[0]);

このロジックはシンプルですが、MACD系EAの基本です。
まずはこの形を正しく理解することが重要です。

4.2 買い・売り条件に落とし込む基本形

クロス判定ができたら、次は売買条件に接続します。

最小構成では、次のように考えます。

  • ゴールデンクロス → 買いシグナル
  • デッドクロス → 売りシグナル

例えば、売買判定だけを書くと次のようになります。

if(goldenCross)
{
   Print("買いシグナル");
}

if(deadCross)
{
   Print("売りシグナル");
}

実際に注文する場合は OrderSendCTrade クラスを使いますが、
初心者はまず シグナル判定と注文処理を分けて考える方が安全です。

理由は単純で、シグナル判定に問題がある状態で注文処理まで一気に書くと、
どこが原因で誤動作しているのか分からなくなるためです。

実務的には、次の順で作ると安定します。

  • まず Print() でシグナル確認
  • その後に発注処理を追加
  • 最後に損切り・利確やポジション管理を追加

4.3 確定足で判定するべき理由

MACDクロスをEAに組み込むとき、初心者が特に注意すべきなのが 確定足で判定するかどうか です。

macd[0]signal[0]現在進行中のバーです。
この値は、Tickが来るたびに変化します。

そのため、進行中バーでクロスしたように見えても、バー確定時にはクロスしていないことがあります。
この現象がいわゆる ダマシシグナルの揺れ の原因になります。

より安定した判定にしたい場合は、確定済みのバーだけで判定する方法が有効です。

bool goldenCrossConfirmed =
   (macd[2] < signal[2]) &&
   (macd[1] > signal[1]);

bool deadCrossConfirmed =
   (macd[2] > signal[2]) &&
   (macd[1] < signal[1]);

この場合は

  • macd[1] = 確定した直近バー
  • macd[2] = その1本前

を使っているため、進行中バーの揺れに影響されにくくなります。

短期足のスキャルピングでは進行中バー判定を使うケースもありますが、
初心者向けのEAでは確定足判定の方が再現性が高いです。

4.4 実運用でよく使う補助条件

MACDクロスだけで売買すると、レンジ相場でシグナルが増えすぎることがあります。
そのため、実用EAでは補助条件を追加することが一般的です。

代表例は次の通りです。

  • MACDが0ラインより上なら買い優先
  • MACDが0ラインより下なら売り優先
  • 移動平均で大きなトレンド方向を確認
  • ATRでボラティリティを確認
  • RSIで逆行局面を除外

例として、買いだけを絞るなら次のようにできます。

bool buySignal =
   goldenCross &&
   macd[0] > 0;

この条件は、上昇モメンタムが相対的に強い場面だけを狙う考え方です。

ただし、条件を増やしすぎると

  • シグナルが極端に減る
  • 過剰最適化(過去データに合わせすぎること)
  • 実運用で性能が落ちる

といった問題も起こりやすくなります。
そのため、最初は MACDクロス単体 → 1条件追加 → 検証 の順で進めるのが安全です。

よくある失敗と注意点

1 同じシグナルで何度も発注する

OnTick() はTickごとに実行されるため、条件が真のままだと同じバー内で何度も注文することがあります。

対策例

  • 新しいバーでのみ判定する
  • すでにポジション保有中なら発注しない
  • シグナル発生フラグを持つ

2 進行中バーで判定して結果が安定しない

バックテストでは良く見えても、リアル運用ではブレることがあります。
これは 0 番バーの揺れが原因であることが多いです。

最初は 確定足ベースで設計した方が無難です。

3 クロス判定だけで相場環境を無視する

MACDは有効な指標ですが、レンジ相場では往復ビンタになりやすい場面があります。
そのため、トレンドフィルターなしの単独運用は注意が必要です。

4 CopyBuffer の戻り値を確認していない

取得失敗時にもそのまま配列を参照すると、誤判定や不安定動作の原因になります。
値取得の前提条件は毎回確認するべきです。

5. iMACD 使用時によくあるエラーとトラブル対策

iMACD はMQL5の標準インジケーター関数であり、基本的には安定して動作します。しかし、EA開発では 実装ミスや環境条件によってMACDが正常に取得できないケースが頻繁に発生します。

特に初心者は次のようなトラブルに直面しやすいです。

  • CopyBuffer が失敗する
  • MACD値が取得できない
  • EAが動作しているのにシグナルが出ない
  • バックテストとリアル環境で挙動が異なる

ここでは、iMACD 使用時に実際によく発生する問題と、その対処方法を整理します。

5.1 INVALID_HANDLE エラー

iMACD が失敗すると、戻り値として INVALID_HANDLE が返されます。

int macdHandle;

macdHandle = iMACD(NULL,PERIOD_CURRENT,12,26,9,PRICE_CLOSE);

if(macdHandle == INVALID_HANDLE)
{
   Print("MACDハンドル作成失敗");
}

このチェックを入れていないと、後続処理で CopyBuffer がエラーになります。

主な原因

  • パラメータ設定ミス
  • MT5内部エラー
  • メモリ不足
  • インジケーター作成タイミングの問題

通常は EA初期化 (OnInit) で必ずチェックすることで回避できます。

5.2 CopyBuffer が失敗する

CopyBuffer の戻り値は 取得できたデータ数です。

int copied = CopyBuffer(macdHandle,0,0,3,macd);

失敗時

-1

または

0

になることがあります。

主な原因

  1. インジケーターがまだ計算されていない
  2. データ履歴不足
  3. ハンドルが無効
  4. 配列サイズ不足

安全なコード例

int copied = CopyBuffer(macdHandle,0,0,3,macd);

if(copied <= 0)
{
   Print("MACD取得失敗");
   return;
}

このチェックは EAの安定性を大きく左右します。

5.3 インジケーターの計算が間に合っていない

EA起動直後やテスター開始直後では、
インジケーターがまだ計算されていない状態になることがあります。

その場合

CopyBuffer = -1

となることがあります。

対策としては

  • 数Tick待つ
  • バー数を確認する
  • Bars() で履歴数をチェック

などがあります。

if(Bars(_Symbol,_Period) < 100)
   return;

MACDは複数EMAを使うため、ある程度の履歴データが必要です。

5.4 配列設定ミス

初心者が非常によく遭遇する問題が 配列の方向設定です。

MQL5では配列を

  • 時系列配列
  • 通常配列

のどちらとして扱うかを指定できます。

MACD取得では通常

ArraySetAsSeries(macd,true);

を設定します。

これを忘れると

  • 配列の順序が逆になる
  • クロス判定が壊れる

などの問題が起こります。

5.5 毎Tickインジケーターを作成してしまう

これは パフォーマンス低下の典型例です。

NG例

void OnTick()
{
   int macd = iMACD(NULL,PERIOD_CURRENT,12,26,9,PRICE_CLOSE);
}

このコードは TickごとにMACDを作成します。

結果

  • CPU負荷増大
  • EA遅延
  • テスター速度低下

正しい構造は次の通りです。

OnInit() → インジケーター作成  
OnTick() → データ取得

5.6 インジケーターハンドルの解放忘れ

EA終了時には、不要になったインジケーターを解放するのが望ましいです。

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

これは必須ではありませんが、

  • 長時間稼働EA
  • 多数インジケーター使用

の場合は メモリ管理の観点で推奨されます。

5.7 バックテストとリアル環境の違い

MACDを使ったEAでは、テスターとリアルで挙動が異なるケースがあります。

主な原因

  • Tick生成方式の違い
  • バー確定タイミング
  • スプレッド
  • ブローカー仕様

特に注意すべきなのは

進行中バーの値

です。

テスターでは問題なく見えても、リアル環境ではシグナルが揺れることがあります。

そのため、多くのEAでは

確定足ベース

でシグナル判定を行います。

よくある初心者の失敗まとめ

最も多いミス

  1. iMACD が値を返すと思っている
  2. CopyBuffer を使っていない
  3. ArraySetAsSeries を忘れる
  4. OnTick() でインジケーター作成
  5. CopyBuffer 戻り値未確認

これらを避けるだけで、MACD EAの安定性は大きく向上します。

6. iMACD を使ったEAのサンプルコード(最小構成)

ここでは、iMACD を利用して MACDクロスで売買シグナルを判定する最小構成のEAコードを紹介します。
このコードは実運用EAではなく、MACD取得とシグナル判定の基本構造を理解するためのサンプルです。

実際のEAでは次のような機能を追加する必要があります。

  • 注文処理(CTrade / OrderSend
  • ポジション管理
  • 損切り・利確
  • 新バー判定
  • 複数条件フィルター

まずは MACD値取得 → クロス判定 → シグナル出力 の流れを理解してください。

6.1 EAの基本構造

MQL5のEAは、主に次の関数で構成されます。

関数 役割
OnInit() EA初期化
OnTick() Tickごとの処理
OnDeinit() EA終了処理

iMACDOnInit() で作成するのが基本です。

6.2 MACDクロス検出EA(最小サンプル)

int macdHandle;

double macd[3];
double signal[3];

int OnInit()
{
   macdHandle = iMACD(
      NULL,
      PERIOD_CURRENT,
      12,
      26,
      9,
      PRICE_CLOSE
   );

   if(macdHandle == INVALID_HANDLE)
   {
      Print("MACDハンドル作成失敗");
      return(INIT_FAILED);
   }

   ArraySetAsSeries(macd,true);
   ArraySetAsSeries(signal,true);

   return(INIT_SUCCEEDED);
}

void OnTick()
{
   if(CopyBuffer(macdHandle,0,0,3,macd) <= 0)
      return;

   if(CopyBuffer(macdHandle,1,0,3,signal) <= 0)
      return;

   bool goldenCross =
      macd[1] < signal[1] &&
      macd[0] > signal[0];

   bool deadCross =
      macd[1] > signal[1] &&
      macd[0] < signal[0];

   if(goldenCross)
   {
      Print("MACDゴールデンクロス");
   }

   if(deadCross)
   {
      Print("MACDデッドクロス");
   }
}

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

このコードのポイントは次の通りです。

1 OnInit() でインジケーター作成

macdHandle = iMACD(...)

2 CopyBuffer でMACD取得

CopyBuffer(macdHandle,0,0,3,macd)

3 MACDクロス判定

macd[1] < signal[1] &&
macd[0] > signal[0]

この3つが MACD系EAの基本構造です。

6.3 実用EAに近づける改善ポイント

上記サンプルは動作確認用です。
実際のEAでは、いくつかの改善が必要です。

新バー判定を入れる

OnTick() はTickごとに実行されるため、同じバー内で何度もシグナルが発生する可能性があります。

一般的には 新しいバーでのみ判定します。

static datetime lastBar;

datetime currentBar = iTime(_Symbol,_Period,0);

if(currentBar == lastBar)
   return;

lastBar = currentBar;

ポジション重複防止

MACDクロスごとに発注すると、ポジションが増えすぎる場合があります。

よくある対策

  • ポジション保有中は新規注文しない
  • 最大ポジション数制限

フィルター条件

MACD単体はレンジ相場に弱いため、補助条件を追加することがあります。

  • 移動平均トレンド
  • ATRボラティリティ
  • RSIフィルター

6.4 MACD EA設計の基本方針

MACDをEAで使う場合、設計は大きく2つに分かれます。

トレンドフォロー型

特徴

  • MACDクロスでエントリー
  • 大きなトレンドを狙う
  • 勝率よりリスクリワード重視

MACDクロス + 移動平均

モメンタム型

特徴

  • MACDの傾き
  • ヒストグラム拡大
  • 短期売買

MACDヒストグラム上昇

どちらが良いかは

  • 通貨ペア
  • 時間足
  • ボラティリティ

などの市場条件によって変わります。

よくある初心者の失敗

1 MACDクロスだけでEAを作る

MACDクロスだけでは、レンジ相場で 連続損失が発生することがあります。

2 過剰最適化

パラメータを調整しすぎると

過去データだけ強いEA

になることがあります。

3 バックテストだけで判断する

実運用では

  • スプレッド
  • 約定遅延
  • 流動性

などの影響を受けます。

そのため

  • フォワードテスト
  • デモ運用

も重要です。

7. iMACD と他インジケーターを組み合わせる実践パターン

iMACD は単体でも使えますが、実運用では 他のインジケーターと組み合わせて精度を上げることが一般的です。
理由は単純で、MACDは有力な指標ではあるものの、すべての相場局面に強いわけではないからです。

特に弱くなりやすい場面は次の通りです。

  • レンジ相場でクロスが増える
  • 短期足でノイズが多い
  • 進行方向の大きなトレンドと逆向きのシグナルが出る

この問題を減らすために、EAでは 役割の異なる指標を組み合わせることがよくあります。

考え方は次のように整理すると分かりやすいです。

  • MACD → エントリー判断
  • 移動平均 → 大きな方向性の確認
  • ATR → ボラティリティ確認
  • RSI → 過熱感の確認

つまり、MACDを「単独の万能指標」として使うのではなく、
売買判断の中核にしつつ、他の条件で誤シグナルを減らすという設計です。

7.1 iMACD + 移動平均でトレンド方向を絞る

最も基本的で相性が良い組み合わせが、MACD + 移動平均です。

考え方

  • 移動平均より価格が上 → 上昇トレンドとみなす
  • 移動平均より価格が下 → 下降トレンドとみなす
  • その上でMACDクロスが出た方向だけ採用する

例えば、買い条件を次のように絞れます。

  • 価格が移動平均より上
  • MACDがゴールデンクロス

この構造のメリットは、逆張りに近い不要なシグナルを減らしやすいことです。

典型例

buySignal = goldenCross && Close[1] > maValue;
sellSignal = deadCross && Close[1] < maValue;

よくある使い方

  • 短期MACDでエントリー
  • 長期移動平均で相場方向を確認

この構成は、トレンドフォロー型EAで非常によく使われます。

7.2 iMACD + RSIで過熱感を確認する

次によく使われるのが MACD + RSI です。

役割分担

  • MACD → 方向転換や勢いを見る
  • RSI → 買われすぎ・売られすぎを確認する

例えば、次のような考え方ができます。

  • MACDがゴールデンクロス
  • RSIが高すぎない
  • → 買いを許可

逆に、MACDが買いシグナルでも RSIが極端に高い場合は、
すでに上昇しすぎている可能性があります。

イメージ

buySignal = goldenCross && rsiValue < 70;
sellSignal = deadCross && rsiValue > 30;

注意点として、RSI条件を厳しくしすぎるとシグナルが減りすぎます。
そのため、最初は単純に

  • 買い時はRSI 70未満
  • 売り時はRSI 30超

程度から始める方が扱いやすいです。

7.3 iMACD + ATRで相場の強さを確認する

MACDはトレンド方向を見るのに向いていますが、
相場が十分に動いているかどうかは別問題です。

ここで使いやすいのが ATR(Average True Range) です。
ATRは、価格変動の大きさ、つまり ボラティリティ(値動きの大きさ) を測る指標です。

考え方

  • ATRが小さい → 値動きが弱い
  • ATRが大きい → 値動きが活発

これをMACDに組み合わせると、
動きが小さいレンジ局面のシグナルを減らすことができます。

buySignal = goldenCross && atrValue > atrThreshold;
sellSignal = deadCross && atrValue > atrThreshold;

この設計は、特に次の場面で有効です。

  • 短期足EA
  • ロンドン時間・NY時間を狙うEA
  • 値動きが少ない時間帯を除外したい場合

7.4 組み合わせ設計で重要な考え方

複数指標を使うときは、それぞれの役割を明確に分けることが重要です。
これを曖昧にすると、条件が増えるだけで性能が上がらないEAになりやすくなります。

おすすめの役割分担

  • 方向性フィルター
    移動平均、上位足トレンド
  • エントリーシグナル
    MACDクロス
  • 相場環境フィルター
    ATR、時間帯、スプレッド
  • 過熱感フィルター
    RSI

このように整理すると、EA設計がかなり分かりやすくなります。

よくある初心者の失敗

1 指標を増やしすぎる

ありがちな失敗は、精度を上げようとして条件を増やしすぎることです。

  • MACD
  • RSI
  • ATR
  • MA
  • ボリンジャーバンド
  • ストキャスティクス

ここまで増やすと、今度は

  • なぜ入るのか分かりにくい
  • シグナルが少なすぎる
  • 過剰最適化しやすい

という問題が起こります。

2 役割が重複している

似たような指標を重ねると、効果が薄いことがあります。

  • MACD
  • 移動平均クロス
  • モメンタム系指標

これらを無計画に重ねると、似た情報を何度も確認しているだけになることがあります。

3 フィルター条件だけで勝てると思ってしまう

フィルターは 誤シグナルを減らす補助であって、
それ自体が勝率や期待値を保証するわけではありません。

最終的には

  • バックテスト
  • フォワードテスト
  • DD(ドローダウン)
  • PF(プロフィットファクター)

などで検証する必要があります。

8. iMACD に関するよくある質問(FAQ)

Q1. iMACD はMACDの値を直接返す関数ですか?

いいえ。
iMACDMACDの値ではなく「インジケーターハンドル」を返します。

MQL5ではインジケーター値を取得する流れは次の2段階です。

  1. iMACD() でインジケーターハンドルを作成
  2. CopyBuffer() でMACDデータを取得

int macdHandle = iMACD(NULL,PERIOD_CURRENT,12,26,9,PRICE_CLOSE);

CopyBuffer(macdHandle,0,0,3,macdBuffer);

MQL4ではインジケーター値を直接取得できましたが、
MQL5ではハンドル方式になっている点に注意が必要です。

Q2. MACDラインとシグナルラインはどのバッファ番号ですか?

iMACD のバッファ番号は次の通りです。

バッファ番号 内容
0 MACDライン
1 シグナルライン
2 ヒストグラム

CopyBuffer(macdHandle,0,0,3,macd);
CopyBuffer(macdHandle,1,0,3,signal);

EAで使われるのは通常

  • MACDライン
  • シグナルライン

の2つです。

Q3. CopyBuffer が失敗するのはなぜですか?

主な原因は次の通りです。

  • インジケーターがまだ計算されていない
  • 履歴データ不足
  • ハンドルが INVALID_HANDLE
  • 配列サイズ不足

特にEA起動直後は、インジケーター計算が間に合わないことがあります。

対策例

if(CopyBuffer(macdHandle,0,0,3,macd) <= 0)
{
   return;
}

また、価格履歴が十分に読み込まれているかも確認する必要があります。

Q4. iMACDOnTick() で呼び出してもよいですか?

推奨されません。

iMACDインジケーターを生成する処理なので、
Tickごとに作成するとパフォーマンスが悪化します。

正しい構造

OnInit()  → インジケーター作成
OnTick()  → CopyBufferで値取得

これがMQL5 EAの基本構造です。

Q5. MACDクロスは確定足で判定するべきですか?

一般的には 確定足で判定する方が安定します。

理由

  • 進行中バーは値が変化する
  • クロスしたように見えて戻ることがある

確定足判定例

macd[2] < signal[2] &&
macd[1] > signal[1]

短期足EAでは進行中バーを使うケースもありますが、
初心者は 確定足ベースの設計から始める方が安全です。

Q6. MACDクロスだけでEAを作ることはできますか?

技術的には可能です。

しかし、MACDクロス単体では

  • レンジ相場で損失が増える
  • ダマシが発生する

といった問題が起きやすいです。

そのため実運用では、次のようなフィルターを追加することが多いです。

  • 移動平均(トレンド方向)
  • ATR(ボラティリティ)
  • RSI(過熱感)

Q7. MACDの標準パラメータは何ですか?

一般的に使われる設定は次の通りです。

パラメータ
fast EMA 12
slow EMA 26
signal 9

これはMT4・MT5ともに標準設定です。

ただし、最適な値は

  • 通貨ペア
  • 時間足
  • 戦略

によって異なる場合があります。

Q8. iMACDiCustom の違いは何ですか?

iMACD

  • MT5標準MACDを使用
  • シンプルで安定

iCustom

  • カスタムインジケーターを使用
  • 独自MACDなどに対応

通常のMACDをEAで使う場合は、iMACD の方が実装が簡単です。

This website stores cookies on your computer. These cookies are used to provide a more personalized experience and to track your whereabouts around our website in compliance with the European General Data Protection Regulation. If you decide to to opt-out of any future tracking, a cookie will be setup in your browser to remember this choice for one year.

Accept or Deny