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ロジック
iMACD と CopyBuffer を使って値を取得できるようになったら、次は その値をどう売買判断に使うか が重要です。
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("売りシグナル");
}
実際に注文する場合は OrderSend や CTrade クラスを使いますが、
初心者はまず シグナル判定と注文処理を分けて考える方が安全です。
理由は単純で、シグナル判定に問題がある状態で注文処理まで一気に書くと、
どこが原因で誤動作しているのか分からなくなるためです。
実務的には、次の順で作ると安定します。
- まず
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
になることがあります。
主な原因
- インジケーターがまだ計算されていない
- データ履歴不足
- ハンドルが無効
- 配列サイズ不足
安全なコード例
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では
確定足ベース
でシグナル判定を行います。
よくある初心者の失敗まとめ
最も多いミス
iMACDが値を返すと思っているCopyBufferを使っていないArraySetAsSeriesを忘れるOnTick()でインジケーター作成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終了処理 |
iMACD は OnInit() で作成するのが基本です。
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の値を直接返す関数ですか?
いいえ。
iMACD は MACDの値ではなく「インジケーターハンドル」を返します。
MQL5ではインジケーター値を取得する流れは次の2段階です。
iMACD()でインジケーターハンドルを作成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. iMACD は OnTick() で呼び出してもよいですか?
推奨されません。
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. iMACD と iCustom の違いは何ですか?
iMACD
- MT5標準MACDを使用
- シンプルで安定
iCustom
- カスタムインジケーターを使用
- 独自MACDなどに対応
通常のMACDをEAで使う場合は、iMACD の方が実装が簡単です。