
MQL4MQL5 テクニカル指標
iMACD()
- できること
- MACD のメインライン・シグナルラインの値を取得する
- 対応
- MQL4・MQL5
iMACD() とは
MACD を計算する関数です。メインライン(短期 EMA − 長期 EMA)とシグナルライン(メインラインの移動平均)の2本があり、どちらを取得するかを指定します。
iMACD() の書式と引数
MQL4 の場合MT4
double iMACD(
string symbol,
int timeframe,
int fast_ema_period,
int slow_ema_period,
int signal_period,
int applied_price,
int mode,
int shift
)| 引数 | 型 | 省略時 | 説明 |
|---|---|---|---|
symbol | string | 必須 | 銘柄名。チャートの銘柄なら _Symbol(NULL も可)。 |
timeframe | int | 必須 | 時間足。0 または PERIOD_CURRENT でチャートの時間足。 |
fast_ema_period | int | 必須 | 短期 EMA の期間(よく使われるのは 12)。 |
slow_ema_period | int | 必須 | 長期 EMA の期間(よく使われるのは 26)。 |
signal_period | int | 必須 | シグナルラインの期間(よく使われるのは 9)。 |
applied_price | int | 必須 | 計算に使う価格。PRICE_CLOSE(終値)、PRICE_OPEN、PRICE_HIGH、PRICE_LOW、PRICE_MEDIAN((高値+安値)/2)、PRICE_TYPICAL など。MQL5 では、別のインジケーターのハンドルを渡して、そのインジケーターの値をもとに計算させることもできます(そのため型は int です)。 |
mode | int | 必須 | 取得するライン。MODE_MAIN(メイン)または MODE_SIGNAL(シグナル)。 |
shift | int | 必須 | 値を取得するバーの位置。0 が現在(未確定)のバー、1 がひとつ前の確定したバー。 |
戻り値(MQL4)
指定したラインの値。
MQL5 の場合MT5
int iMACD(
string symbol,
ENUM_TIMEFRAMES period,
int fast_ema_period,
int slow_ema_period,
int signal_period,
int applied_price
)| 引数 | 型 | 省略時 | 説明 |
|---|---|---|---|
symbol | string | 必須 | 銘柄名。チャートの銘柄なら _Symbol(NULL も可)。 |
period | ENUM_TIMEFRAMES | 必須 | 時間足。PERIOD_CURRENT でチャートの時間足。 |
fast_ema_period | int | 必須 | 短期 EMA の期間(よく使われるのは 12)。 |
slow_ema_period | int | 必須 | 長期 EMA の期間(よく使われるのは 26)。 |
signal_period | int | 必須 | シグナルラインの期間(よく使われるのは 9)。 |
applied_price | int | 必須 | 計算に使う価格。PRICE_CLOSE(終値)、PRICE_OPEN、PRICE_HIGH、PRICE_LOW、PRICE_MEDIAN((高値+安値)/2)、PRICE_TYPICAL など。MQL5 では、別のインジケーターのハンドルを渡して、そのインジケーターの値をもとに計算させることもできます(そのため型は int です)。 |
戻り値(MQL5)
インジケーターのハンドル。CopyBuffer() のバッファ番号は 0 がメイン(MAIN_LINE)、1 がシグナル(SIGNAL_LINE)です。
iMACD() の使い方(コード例)
MQL4
double main1 = iMACD(_Symbol, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1);
double sig1 = iMACD(_Symbol, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 1);
double main2 = iMACD(_Symbol, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2);
double sig2 = iMACD(_Symbol, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 2);
if(main2 <= sig2 && main1 > sig1)
Print("MACD がシグナルを上抜け");MQL5
int hMacd = INVALID_HANDLE;
int OnInit()
{
hMacd = iMACD(_Symbol, PERIOD_CURRENT, 12, 26, 9, PRICE_CLOSE);
return hMacd == INVALID_HANDLE ? INIT_FAILED : INIT_SUCCEEDED;
}
void OnTick()
{
double m[], s[];
ArraySetAsSeries(m, true);
ArraySetAsSeries(s, true);
if(CopyBuffer(hMacd, MAIN_LINE, 1, 2, m) < 2 || CopyBuffer(hMacd, SIGNAL_LINE, 1, 2, s) < 2)
return;
if(m[1] <= s[1] && m[0] > s[0])
Print("MACD がシグナルを上抜け");
}OnTick()・OnStart() などの関数の中に書いて使う例です。MetaEditor でコンパイルできることを確認済みです。
iMACD() の注意点
- MQL5 では値ではなく「ハンドル」(インジケーターの番号)が返ります。ハンドルは OnInit() で1回だけ作り、OnTick() などで CopyBuffer() を使って値を読み出します。毎ティック作り直すと動作が重くなります。
- MT の MACD はメインラインがヒストグラム(棒)、シグナルラインが線で表示されます。
MQL4 と MQL5 の違い
MQL4 は mode 引数(MODE_MAIN / MODE_SIGNAL)でラインを選びます。MQL5 はハンドルを1つ作り、CopyBuffer() のバッファ番号(0 / 1)でラインを選びます。












