1. iVIDyA関数の概要と実務での活用法
iVIDyAは、Variable Index Dynamic Average(可変インデックス動的平均)を算出するためのMQL5組み込み関数です。開発者はTushar Chande氏で、通常の移動平均線(MA)とは異なり、市場のボラティリティ(変動率)に応じて計算期間を自動的に調整する画期的なインディケータです。
実務での活用法
実務上の最大の特徴は、「トレンド相場では価格に敏感に反応し、レンジ相場では反応を鈍くする」という適応力にあります。具体的には内部でCMO(Chande Momentum Oscillator)を使用しており、ボラティリティが高いときには平滑化定数を大きくして追随性を高め、ボラティリティが低いときには平滑化定数を小さくしてダマシを回避します。
開発者がつまずきやすいポイント
多くの初心者は、これを単なる「少し高性能なEMA(指数平滑移動平均)」として扱ってしまいます。しかし、iVIDyAは「一定の期間」という概念を動的に変化させるため、通常のMAクロス戦略をそのまま適用すると、ボラティリティの急変時に想定外のサインが出ることがあります。実務では、単体でのシグナル判断よりも、「トレンドの押し目買い・戻り売りの境界線」や「ダイナミックな損切りライン(トレイリングストップ)」として活用するのが最も効果的です。
2. 構文と戻り値
iVIDyA関数を使用するには、まず「インディケータ・ハンドル」を作成する必要があります。
構文
int iVIDyA(
string symbol, // 通貨ペア(NULLで現在のペア)
ENUM_TIMEFRAMES period, // 時間軸(0またはPERIOD_CURRENTで現在の時間軸)
int cmo_period, // CMO(モメンタム)の計算期間
int ema_period, // 平滑化(EMA)の計算期間
int ma_shift, // 指標の横ずらし(通常は0)
ENUM_APPLIED_PRICE applied_price // 適用価格(PRICE_CLOSE等)
);
戻り値
- 成功した場合:iVIDyAの計算設定を保持するハンドル(int型)を返します。
- 失敗した場合:
INVALID_HANDLEを返します。
このハンドルを使って、後述する CopyBuffer 関数により実際の数値を取得します。
3. 具体的な使い方・実践サンプルコード
MQL5では、OnInitでハンドルを生成し、OnTickで値を取得するのが標準的な作法です。以下に、現在の価格がVIDyAを上抜いたか判定する実戦的なEAの骨組みを示します。
//+------------------------------------------------------------------+
//| SimpleVIDyA_EA.mq5 |
//| Copyright 2024, Quant Engineer |
//+------------------------------------------------------------------+
#property strict
// 入力パラメーター
input int InpCMOPeriod = 9; // CMOの期間
input int InpEMAPeriod = 12; // 平滑化の期間
input int InpShift = 0; // 表示シフト
// グローバル変数
int handleVIDyA; // iVIDyAのハンドルを格納
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// iVIDyAハンドルの作成
handleVIDyA = iVIDyA(_Symbol, _Period, InpCMOPeriod, InpEMAPeriod, InpShift, PRICE_CLOSE);
// ハンドルの作成に失敗した場合はエラー
if(handleVIDyA == INVALID_HANDLE)
{
Print("iVIDyAハンドルの作成に失敗しました。エラーコード:", GetLastError());
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double vidyaValues[]; // 値を格納する動的配列
ArraySetAsSeries(vidyaValues, true); // 最新のデータから順に並べる
// ハンドルから現在のVIDyAの値をコピー(直近2本分)
if(CopyBuffer(handleVIDyA, 0, 0, 2, vidyaValues) < 2)
{
Print("データのコピーに失敗しました。");
return;
}
double currentVIDyA = vidyaValues[0]; // 現在のVIDyA
double closePrice = iClose(_Symbol, _Period, 0); // 現在の終値
// 簡単なロジック:価格がVIDyAより上なら上昇トレンドと判断
if(closePrice > currentVIDyA)
{
Comment("現在のトレンド: 強気 (VIDyAの上側)");
}
else
{
Comment("現在のトレンド: 弱気 (VIDyAの下側)");
}
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// ハンドルの解放(メモリ節約のため)
IndicatorRelease(handleVIDyA);
}
4. 使用上の注意点とよくあるエラー
① ハンドルの生成場所に注意
iVIDyA関数を OnTick 内で毎回呼び出さないでください。ハンドル生成はPCのリソースを消費するため、必ず OnInit で一度だけ行い、変数に格納して使い回すのがMQL5の鉄則です。これを怠ると、バックテストが極端に遅くなったり、ターミナルがフリーズしたりする原因になります。
② 計算期間のバランス
cmo_period(モメンタム期間)を小さくしすぎると、ノイズを拾いやすくなり、VIDyAの利点である「滑らかさ」が失われます。一般的には cmo_period を9〜14、ema_period を12〜20程度から調整し始めるのがセオリーです。
③ CopyBufferの戻り値チェック
インディケータの計算が完了する前に値を参照しようとすると、CopyBuffer はエラーを返します。特にEA起動直後や時間足変更時には、データが十分に準備されていないことがあるため、必ず戻り値をチェックする処理を入れてください。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、iVIDyAのような優れた指標でエントリー精度を高めることは重要ですが、それ以上に収益を左右するのが「ネットワーク遅延(レイテンシ)」です。日本の自宅PCから海外のMT5サーバーへ注文を出す場合、物理的な距離により数百ミリ秒の遅延が発生します。このわずかな遅れが、スリッページを引き起こし、計算上の利益を食いつぶす致命的な損失に繋がります。
プロのクオンツエンジニアとして断言しますが、FXの自動売買において自宅PCでの運用は「趣味」の域を出ません。極限まで約定スピードを高め、理論通りのパフォーマンスを発揮させるには、ブローカーのデータセンターに近い場所にある専用のVPS(仮想専用サーバー)の利用が必須です。ミリ秒単位のスピード差が、年間収益で数%から数十%の差となって現れるのが、シストレのシビアな現実です。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント