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の範囲で勢いの強さを示す指標です。
・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で動かすまでの手順です。
- MetaTrader 5の「ツール」→「MetaQuotes Language Editor」でMetaEditorを開く
- 「ファイル」→「新規作成」→「インジケーター」を選び、名前を「VIDyATrendColor」にして作成する
- テンプレートの中身をすべて削除し、上のコードを丸ごと貼り付ける
- F7キーでコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- チャートに適用し、トレンドが強い場面で線の色が切り替わる頻度を、既刊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の計算を含めた自作が必要になる点に注意してください。
コメント