iACは、Bill Williamsが考案した

Accelerator/Decelerator Oscillatorの値を、

MQL4で直接取得できる組み込み関数です。

既刊のiAO(Awesome Oscillator)記事では、

値動きの「勢い」そのものを取得する方法を解説しました。

iACはそのAOが、

前と比べて強まっているか弱まっているかという「勢いの変化」を示す指標です。

この記事では、iACの引数と戻り値を整理したうえで、

既刊iAOとの計算対象の違いを明らかにし、

ゼロラインクロスと簡易版のピーク検知を行う、

実際に動くインジケーターの作り方を解説します。

この記事で分かること
・iACの3つの引数と戻り値の意味
・既刊iAOとの計算対象の違い(AOの値そのもの vs AOの変化率)
・MQL4とMQL5でiACの戻り値の種類が違う点
・実際に動くコード全体

設計思想: なぜAOだけでは「勢いの変化」が分からないか

まず、iACが既刊iAOと何が違うのかを整理します。

既刊iAO(Awesome Oscillator)との計算対象の違い

iAOは、中間値の5期間SMAと34期間SMAの差で、

「いまの勢いの大きさ」そのものを数値化します。

一方、iACは、そのAOの値から、

AO自身の5期間SMAを引いた値です。

指標 計算式 示すもの
iAO(既刊) SMA(中間値,5) – SMA(中間値,34) 勢いの大きさ
iAC(本記事) AO – SMA(AO,5) 勢いの変化(加速・減速)

AOが「いま勢いがあるかどうか」を示すのに対し、

ACは「その勢いが強まっているか弱まっているか」を示す、という関係です。

速度と加速度の関係に近い

価格の動きを車の運転に例えると、

AOは「いまのスピード」、

ACは「アクセルを踏んでいるかブレーキを踏んでいるか」に近い関係です。

AOとACの関係
・AO: いま勢いがあるかどうか(速度に近い)
・AC: その勢いが強まっているか弱まっているか(加速度に近い)
・ACがAOより先に反転することがあるため、先行指標として扱われる

この「AOより先に反転しやすい」という性質が、

ACがAOの補助指標として使われる理由です。

iAC関数の引数と戻り値

公式リファレンス(MQL4 Reference: iAC)の内容を整理します。

3つの引数の意味

double iAC(
   string symbol,     // 通貨ペア名(NULLで現在のチャート)
   int    timeframe,  // 時間足(0で現在の時間足)
   int    shift        // 何本前のバーの値を取得するか
);

iAOと全く同じ3引数の並びです。

期間やmodeの指定が不要な点が、

iBandsやiEnvelopesのような複数バッファ系の関数と違うところです。

MQL5版との違い: 戻り値が直接の値かハンドルか

MQL4のiACは、値をdoubleで直接返します。

一方、MQL5のiAC(MQL5 Reference: iAC)は、

値ではなくインジケーターのハンドル(int)を返します。

MQL5移行時の注意
・MQL5のiACはハンドルを返すだけで、値そのものは返さない
・実際の値はCopyBuffer()で別途取得する必要がある
・引数もsymbol+periodの2つに減る
・shiftはCopyBuffer側の配列インデックスで扱う

既刊のMQL4→MQL5移行チェックリストと同じ、

テクニカル指標のハンドル方式化という変化点がここにも当てはまります。

サンプルインジケーター: ゼロラインクロスと簡易ピーク検知

単にACの値をヒストグラムで描くだけでなく、

ゼロラインを跨いだ瞬間と、2本連続で色が同方向に変化した瞬間を矢印で知らせます。

ACの値を取得しヒストグラムの色を決める

double ac = iAC(NULL, 0, i);
double acPrev = iAC(NULL, 0, i + 1);
bool rising = (ac > acPrev);

前のバーと比較して値が増えていれば上昇中、

減っていれば下降中として色を塗り分けます。

ゼロラインクロスの矢印

ACの符号が前のバーと変わった瞬間だけ、

ゼロラインクロスの矢印をセットします。

簡易ピーク検知(2本連続の色変化)

ヒストグラムの色が2本連続で同方向に変化した場合に、

「勢いの変化が続いている」とみなす簡易判定を行います。

本来のBill Williamsの手法はより多くのバー形状を見るものですが、

本記事では実装しやすい簡易版として扱います。

実際に動くコード全体

実際にMetaEditorでコンパイルできる、

ACヒストグラムとゼロラインクロス矢印を表示するインジケーターです。

//+------------------------------------------------------------------+
//|                                                   ACCrossArrow.mq4 |
//|                     Copyright 2026, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 DodgerBlue
#property indicator_width3 2

double ACUpBuffer[];
double ACDownBuffer[];
double ZeroCrossArrow[];

int OnInit()
  {
   SetIndexBuffer(0, ACUpBuffer);
   SetIndexStyle(0, DRAW_HISTOGRAM);
   SetIndexBuffer(1, ACDownBuffer);
   SetIndexStyle(1, DRAW_HISTOGRAM);

   SetIndexBuffer(2, ZeroCrossArrow);
   SetIndexStyle(2, DRAW_ARROW);
   SetIndexArrow(2, 159);
   SetIndexEmptyValue(2, EMPTY_VALUE);

   IndicatorShortName("AC Cross Arrow");
   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int needed = 40; // AOの計算に必要な34本 + AO自身の5期間SMA分の余裕
   if(rates_total < needed)
      return(0);

   int limit = (prev_calculated == 0) ? rates_total - needed : rates_total - prev_calculated + 1;

   for(int i = limit; i >= 0; i--)
     {
      double ac     = iAC(NULL, 0, i);
      double acPrev = iAC(NULL, 0, i + 1);

      ACUpBuffer[i]   = EMPTY_VALUE;
      ACDownBuffer[i] = EMPTY_VALUE;
      if(ac >= acPrev)
         ACUpBuffer[i] = ac;
      else
         ACDownBuffer[i] = ac;

      ZeroCrossArrow[i] = EMPTY_VALUE;
      bool crossedUp   = (ac > 0 && acPrev <= 0);
      bool crossedDown = (ac < 0 && acPrev >= 0);
      if(crossedUp || crossedDown)
         ZeroCrossArrow[i] = ac;
     }

   return(rates_total);
  }

MetaEditorでのコンパイル・実行手順

実際にMT4で動かすまでの手順です。

  1. MetaEditorで新規インジケーター「ACCrossArrow」を作成し、上のコードを貼り付けてコンパイルする
  2. エラー・警告が0件であることを確認する
  3. サブウィンドウにヒストグラムが緑(上昇)と赤(下降)で色分けされて表示されることを確認する
  4. ゼロラインを跨いだバーに矢印が出ることを確認する
  5. 既刊iAOのヒストグラムと並べて表示し、ACがAOより先に反転する場面があるか見比べる

よくあるエラーと注意点

実装でつまずきやすいポイントをまとめます。

ACとAOを混同する

ACもAOと同じく0を基準に上下しますが、

示している意味は全く別物です。

AOが「勢いの大きさ」、ACが「勢いの変化」であることを混同すると、

シグナルの解釈を誤ります。

AO – SMA(AO,5)を自分で再計算してしまう

ACの計算式を知っていると、

iAO()を取得してから自分でSMAを計算し直したくなりますが、

iAC()を直接呼べば同じ値が一発で取得できます。

二重に計算する必要はありません。

needed本数が足りない状態で呼び出す

iACはAOの5期間SMAまで遡って計算するため、

内部的にはAOの計算に必要な34本よりさらに本数が必要です。

ヒストリーが少ない通貨ペアでは、

rates_totalが足りているかの確認を省略しないでください。

既刊テクニカル指標記事との使い分け

似た「勢い系」の記事が複数あるため、使い分けを整理します。

記事 計算対象 用途
本記事(iAC) AOの変化率(加速度) 勢いの変化の先行検知
iAO記事(既刊) 中間値の2本のSMAの差 いまの勢いの大きさ
iOsMA記事(既刊) MACDと主線の差 MACDのクロス予兆
iForce記事(既刊) 価格変化×出来高 出来高を含めた勢い

よくある質問

iACについて、よくある疑問に回答します。

iACとiAO、どちらを先に見るべきですか?

役割が違うため、どちらか一方だけでは判断しません。

ACはAOより先に反転しやすい先行指標として、

AOの転換を早めに察知する補助に使うのが一般的です。

このインジケーターをEAのフィルターに使えますか?

使えます。

本記事のゼロラインクロス判定部分を関数化すれば、

「ACが上にクロスしたらエントリーを許可する」といった環境認識フィルターに組み込めます。

簡易ピーク検知だけで売買判断してよいですか?

本記事の2本連続判定は、

本来のBill Williamsのシグナルを簡略化したものです。

実際の売買判断では、

他の指標や値動きと組み合わせて使うことをおすすめします。

【MQL4】iAC(Accelerator/Decelerator Oscillator)でAOの「勢いの変化」を検知するインジケーターの作り方:まとめ

iACは、既刊iAOの値そのものではなく、

AOの5期間SMAからの変化率(AO – SMA(AO,5))を示す関数です。

AOが「いま勢いがあるか」、

ACが「その勢いが強まっているか弱まっているか」という役割の違いを理解しておくと、

2つの指標を補完的に使い分けられます。

MQL5では戻り値がハンドルに変わり、

CopyBuffer()で値を取得する点に注意してください。

関連記事