iVIDyAは、VIDYA

(Variable Index Dynamic Average)の値を、

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

既刊のiMA(移動平均)は、常に同じ本数のバーを使って平均を取る、

期間が固定の指標でした。

iVIDyAは、相場の勢いが強いときは平滑期間を短くして反応を早め、

勢いが弱いときは平滑期間を長くしてノイズを抑える、

期間そのものが自動で変わる移動平均です。

この記事では、iVIDyAの6つの引数を整理したうえで、

既刊iMAとの設計の違いを明らかにし、

MQL4にこの関数が存在しない理由にも触れながら、

傾きで色を変えるトレンド判定インジケーターの作り方を解説します。

この記事で分かること
・iVIDyAの6つの引数と戻り値の意味
・既刊iMAとの違い(期間固定 vs 期間が自動で変わる)
・iVIDyAがMQL4には存在せずMQL5専用である理由
・実際に動くトレンド判定インジケーターのコード全体

設計思想: 平滑期間そのものが自動で変わる移動平均

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

既刊iMAとの設計の違い

iMA(単純移動平均・指数移動平均等)は、

パラメーターで指定した期間を、

相場の状況に関わらずずっと同じ本数で使い続けます。

VIDYAは、CMO(Chandeモメンタムオシレーター)という、

別の指標で測った「いまの相場の勢いの強さ」を使って、

平滑期間の重みづけを自動で調整します。

指標 平滑期間 トレンド相場 レンジ相場
iMA(既刊) 常に固定 反応が一定 反応が一定
iVIDyA(本記事) 勢いに応じて自動変化 短くなり反応が早い 長くなりノイズを抑える

CMOという「勢いの強さ」を使う理由

CMOは、一定期間内の上昇量と下降量の差を、

その合計で割って正規化した、

-100から+100の範囲で勢いの強さを示す指標です。

VIDYAの基本的な考え方
・CMOの絶対値が大きいほど、一方向への勢いが強い
・勢いが強いときは平滑期間を短くし値動きに素早く追従
・勢いが弱い(CMOが0に近い)ときは平滑期間を長くする
・考案者はTushar Chandeとして広く知られている
・具体的な重み付け計算式は公式リファレンスには記載がない

既刊のiAlligatorのような「複数本の固定移動平均を組み合わせて

トレンドを判定する」設計とは違い、

VIDYAは1本の移動平均の中に適応の仕組みを持っている点が特徴です。

iVIDyA関数の引数と戻り値

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

6つの引数の意味

int iVIDyA(
   string              symbol,         // 通貨ペア名(NULLで現在のシンボル)
   ENUM_TIMEFRAMES     period,         // 時間足(PERIOD_CURRENTで現在の時間足)
   int                 cmo_period,     // CMO計算の期間
   int                 ema_period,     // 平滑係数計算用のEMA期間
   int                 ma_shift,       // 価格チャートに対するシフト
   ENUM_APPLIED_PRICE  applied_price   // 使用する価格の種類
);

既刊iATRの記事と同じく、

MQL5のテクニカル指標関数は値を直接返さず、

ハンドル(int)を返す設計です。

cmo_periodとema_period、2つの期間引数の役割分担

VIDYAには期間を表す引数が2つあり、役割が異なります。

引数 役割
cmo_period 勢いの強さ(CMO)を測る期間
ema_period 平滑係数を計算するためのEMA期間(平滑の土台となる本数)

cmo_periodを短くするほど勢いの変化に敏感になり、

ema_periodを長くするほど全体としては滑らかな線になります。

MQL4には存在しない理由

MQL4公式リファレンスのインジケーター関数一覧には、

iVIDyAという項目自体が存在しません。

既刊のmql-coverage-gap.md台帳では、

長らくMQL4関数ギャップの1つとして分類されていましたが、

2026-11-02の調査でこれは分類の誤りと判明しました。

台帳訂正のお知らせ
・iVIDyAはMQL4のインジケーター関数一覧に存在しない
・MQL5専用の関数であり、MQL4版への移行例は書けない
・CMOによる適応型平滑というMQL5独自の設計
・MQL4で近い動きを再現するには自作が必要になる

MQL4でVIDYA相当の動きを再現したい場合は、

CMOの値を自分で計算し、

平滑係数を毎バー手動で調整する自作インジケーターが必要になります。

サンプルインジケーター: 傾きで色を変えるトレンド判定

VIDYAの値をチャート上に重ねて描画し、

前のバーより上がっていれば緑、下がっていれば赤に色分けします。

ハンドルの作成とバッファの取得

int vidyaHandle = iVIDyA(_Symbol, PERIOD_CURRENT, CmoPeriod, EmaPeriod, 0, PRICE_CLOSE);

double buf[];
ArraySetAsSeries(buf, true);
CopyBuffer(vidyaHandle, 0, 1, 2, buf);//1つ前と2つ前の確定足を取得

iVIDyAのバッファは1つだけなので、

バッファ番号は常に0を指定します。

傾きの判定ロジック

取得した2本の値を比較し、

上がっていれば上昇中、下がっていれば下降中として色を決めます。

実際に動くコード全体

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

VIDYAの傾きで色を変えるトレンド判定インジケーターです。

//+------------------------------------------------------------------+
//|                                              VIDyATrendColor.mq5  |
//|                     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 indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLime
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed

input int                CmoPeriod = 9;   //CMO計算期間
input int                EmaPeriod = 12;  //平滑係数計算用のEMA期間
input ENUM_APPLIED_PRICE AppliedPrice = PRICE_CLOSE;

double UpLine[];
double DownLine[];
int    vidyaHandle = INVALID_HANDLE;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0, UpLine,   INDICATOR_DATA);
   SetIndexBuffer(1, DownLine, INDICATOR_DATA);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);

   vidyaHandle = iVIDyA(_Symbol, PERIOD_CURRENT, CmoPeriod, EmaPeriod, 0, AppliedPrice);
   if(vidyaHandle == INVALID_HANDLE)
     {
      Print("iVIDyAのハンドル作成に失敗しました。エラーコード=", GetLastError());
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(vidyaHandle != INVALID_HANDLE)
      IndicatorRelease(vidyaHandle);//使い終わったハンドルは必ず解放する
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   if(BarsCalculated(vidyaHandle) < rates_total)
      return(0);//インジケーター本体の計算がまだ追いついていない

   double vidya[];
   ArraySetAsSeries(vidya, false);//time[]と同じ並び順(古い→新しい)で取得する

   if(CopyBuffer(vidyaHandle, 0, 0, rates_total, vidya) <= 0)
      return(0);

   int start = (prev_calculated == 0) ? 1 : prev_calculated - 1;

   for(int i = start; i < rates_total; i++)
     {
      UpLine[i]   = EMPTY_VALUE;
      DownLine[i] = EMPTY_VALUE;

      if(vidya[i] >= vidya[i - 1])
         UpLine[i] = vidya[i];
      else
         DownLine[i] = vidya[i];
     }

   return(rates_total);
  }

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

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

  1. MetaTrader 5の「ツール」→「MetaQuotes Language Editor」でMetaEditorを開く
  2. 「ファイル」→「新規作成」→「インジケーター」を選び、名前を「VIDyATrendColor」にして作成する
  3. テンプレートの中身をすべて削除し、上のコードを丸ごと貼り付ける
  4. F7キーでコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
  5. チャートに適用し、トレンドが強い場面で線の色が切り替わる頻度を、既刊iMAの線と見比べる

よくあるエラーと注意点

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

period引数に0を渡してコンパイルエラーになる

MQL4の感覚で`iVIDyA(NULL, 0, …)`のように、

第2引数に整数の0を渡すとコンパイルエラーになります。

MQL5では`ENUM_TIMEFRAMES`型の、

`PERIOD_CURRENT`を渡してください。

cmo_periodとema_periodを逆に覚えてしまう

cmo_periodは「勢いをどれくらいの期間で測るか」、

ema_periodは「平滑の土台となる期間」という役割の違いがあります。

どちらも単なる「期間」として同じ感覚で調整すると、

意図した反応速度にならないことがあります。

MQL4版を探してしまう

この記事の冒頭で触れたとおり、

iVIDyAはMQL4には存在しません。

MQL4環境でVIDYA相当の動きが必要な場合は、

CMOの計算を含めて自作する必要があります。

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

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

記事 平滑期間 対応環境
本記事(iVIDyA) CMOに応じて自動変化 MQL5専用
iMA記事(既刊) 常に固定 MQL4/MQL5共通
iAlligator記事(既刊) 固定・3本の組み合わせ MQL4/MQL5共通

よくある質問

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

iVIDyAとiAMA(適応型移動平均)は同じものですか?

いずれも「相場の状況に応じて平滑期間が変わる」

という発想は共通していますが、

適応の度合いを測る方法が異なります(VIDYAはCMO、

他の適応型移動平均はEfficiency Ratio等、別の指標を使います)。

名前が似ていても計算の土台は別物として扱ってください。

EAの発注条件に使えますか?

使えます。

本記事の傾き判定部分を関数化すれば、

「VIDYAが上向きのときだけエントリーを許可する」

といった環境認識フィルターに組み込めます。

cmo_period・ema_periodの値はどれくらいにすればよいですか?

公式リファレンスに推奨値の記載はなく、

通貨ペアや時間足によって最適値が変わります。

まずは標準値(cmo_period=9、ema_period=12)で試し、

線の色が切り替わる頻度を見ながら調整してください。

【MQL5入門】iVIDyA(Variable Index Dynamic Average)は相場の勢いで平滑期間が自動で変わる移動平均:まとめ

iVIDyAは、既刊のiMAのように期間が固定の移動平均ではなく、

CMOで測った相場の勢いに応じて平滑期間そのものが自動で変わる、

MQL5専用の移動平均です。

台帳では長らくMQL4関数ギャップとして分類されていましたが、

MQL4のインジケーター関数一覧には存在しないMQL5専用関数であることが分かりました。

MQL4環境でVIDYA相当の動きが必要な場合は、

CMOの計算を含めた自作が必要になる点に注意してください。

関連記事