
MQL4MQL5 テクニカル指標
iMA()
- できること
- 移動平均線(MA)の値を取得する
- 対応
- MQL4・MQL5
iMA() とは
移動平均線(単純・指数・平滑・加重)を計算する関数です。MQL4 では指定したバーの移動平均の値が直接返ります。MQL5 ではハンドルが返り、CopyBuffer() で値を読み出します。
iMA() の書式と引数
MQL4 の場合MT4
double iMA(
string symbol,
int timeframe,
int ma_period,
int ma_shift,
int ma_method,
int applied_price,
int shift
)| 引数 | 型 | 省略時 | 説明 |
|---|---|---|---|
symbol | string | 必須 | 銘柄名。チャートの銘柄なら _Symbol(NULL も可)。 |
timeframe | int | 必須 | 時間足。0 または PERIOD_CURRENT でチャートの時間足。 |
ma_period | int | 必須 | 移動平均の期間。 |
ma_shift | int | 必須 | 線を右(未来方向)にずらす本数。ふつうは 0。 |
ma_method | int | 必須 | 移動平均の種類。MODE_SMA(単純)、MODE_EMA(指数)、MODE_SMMA(平滑)、MODE_LWMA(加重)。 |
applied_price | int | 必須 | 計算に使う価格。PRICE_CLOSE(終値)、PRICE_OPEN、PRICE_HIGH、PRICE_LOW、PRICE_MEDIAN((高値+安値)/2)、PRICE_TYPICAL など。MQL5 では、別のインジケーターのハンドルを渡して、そのインジケーターの値をもとに計算させることもできます(そのため型は int です)。 |
shift | int | 必須 | 値を取得するバーの位置。0 が現在(未確定)のバー、1 がひとつ前の確定したバー。 |
戻り値(MQL4)
移動平均の値。
MQL5 の場合MT5
int iMA(
string symbol,
ENUM_TIMEFRAMES period,
int ma_period,
int ma_shift,
ENUM_MA_METHOD ma_method,
int applied_price
)| 引数 | 型 | 省略時 | 説明 |
|---|---|---|---|
symbol | string | 必須 | 銘柄名。チャートの銘柄なら _Symbol(NULL も可)。 |
period | ENUM_TIMEFRAMES | 必須 | 時間足。PERIOD_CURRENT でチャートの時間足。 |
ma_period | int | 必須 | 移動平均の期間。 |
ma_shift | int | 必須 | 線を右(未来方向)にずらす本数。ふつうは 0。 |
ma_method | ENUM_MA_METHOD | 必須 | 移動平均の種類。MODE_SMA(単純)、MODE_EMA(指数)、MODE_SMMA(平滑)、MODE_LWMA(加重)。 |
applied_price | int | 必須 | 計算に使う価格。PRICE_CLOSE(終値)、PRICE_OPEN、PRICE_HIGH、PRICE_LOW、PRICE_MEDIAN((高値+安値)/2)、PRICE_TYPICAL など。MQL5 では、別のインジケーターのハンドルを渡して、そのインジケーターの値をもとに計算させることもできます(そのため型は int です)。 |
戻り値(MQL5)
インジケーターのハンドル。作成に失敗したら INVALID_HANDLE。
iMA() の使い方(コード例)
MQL4
// 短期 MA(5) が長期 MA(20) を上抜けたか(確定足で判定)
double fast1 = iMA(_Symbol, 0, 5, 0, MODE_SMA, PRICE_CLOSE, 1);
double fast2 = iMA(_Symbol, 0, 5, 0, MODE_SMA, PRICE_CLOSE, 2);
double slow1 = iMA(_Symbol, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
double slow2 = iMA(_Symbol, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 2);
if(fast2 <= slow2 && fast1 > slow1)
Print("ゴールデンクロス");MQL5
int hFast = INVALID_HANDLE, hSlow = INVALID_HANDLE;
int OnInit()
{
hFast = iMA(_Symbol, PERIOD_CURRENT, 5, 0, MODE_SMA, PRICE_CLOSE);
hSlow = iMA(_Symbol, PERIOD_CURRENT, 20, 0, MODE_SMA, PRICE_CLOSE);
if(hFast == INVALID_HANDLE || hSlow == INVALID_HANDLE)
return INIT_FAILED;
return INIT_SUCCEEDED;
}
void OnDeinit(const int reason)
{
IndicatorRelease(hFast);
IndicatorRelease(hSlow);
}
void OnTick()
{
double fast[], slow[];
ArraySetAsSeries(fast, true); // [0] を最新にする
ArraySetAsSeries(slow, true);
// 1本前と2本前(確定足)の値を読む
if(CopyBuffer(hFast, 0, 1, 2, fast) < 2 || CopyBuffer(hSlow, 0, 1, 2, slow) < 2)
return;
if(fast[1] <= slow[1] && fast[0] > slow[0])
Print("ゴールデンクロス");
}OnTick()・OnStart() などの関数の中に書いて使う例です。MetaEditor でコンパイルできることを確認済みです。
iMA() の注意点
- MQL5 では値ではなく「ハンドル」(インジケーターの番号)が返ります。ハンドルは OnInit() で1回だけ作り、OnTick() などで CopyBuffer() を使って値を読み出します。毎ティック作り直すと動作が重くなります。
- クロスの判定は、確定した足(shift=1 と 2)で行うと、足の途中でサインが出たり消えたりしません。
MQL4 と MQL5 の違い
MQL4:iMA(…, shift) で値が直接返ります。
MQL5:iMA() はハンドルを返し、引数に shift がありません。値は CopyBuffer(ハンドル, 0, 位置, 本数, 配列) で読みます。移植するときは、iMA の呼び出しを OnInit() に移すのがポイントです。












