1. iADXWilder関数の概要と実務での活用法
iADXWilderは、テクニカル指標の父、J.ウェルズ・ワイルダーが考案した本来の計算手法に基づいた「ADX(平均方向性指数)」のハンドルを取得するための関数です。
MQL5には通常のiADX関数も存在しますが、両者の違いは「平滑化(スムージング)」の計算式にあります。iADXWilderはワイルダー独自の移動平均手法を用いており、一般的なADXよりも直近の価格変動に対して緩やかに反応する傾向があります。
実務での活用法:
実務開発において、初心者が最もつまずきやすいのは「ADXの値が高い=価格が上昇している」と勘違いすることです。ADXはあくまで「トレンドの強さ」を示すものであり、方向性は示しません。
– ADXライン: トレンドの強さ(25以上でトレンド発生、20以下でレンジと判断するのが一般的)
– +DI: 上昇方向の強さ
– -DI: 下降方向の強さ
これらを組み合わせ、「+DIが-DIを上回り(上昇トレンド)、かつADXが25を超えた(強いトレンド)」といった条件でトレンドフォロー戦略を構築するのが王道の手法です。
2. 構文と戻り値
iADXWilder関数を使用するには、まずインジケーターの「ハンドル」を取得する必要があります。この関数自体はADXの数値(25.5など)を直接返すわけではなく、計算設定を格納した「識別番号(ハンドル)」を返します。
【構文】
int iADXWilder(
string symbol, // 通貨ペア名(NULLで現在のチャート)
ENUM_TIMEFRAMES period, // 時間軸(PERIOD_CURRENTで現在の時間軸)
int adx_period // 平均化期間(一般的には14)
);
【戻り値】
– 成功した場合:インジケーターのハンドル(int型の整数)。
– 失敗した場合:INVALID_HANDLE。
取得したハンドルを使い、CopyBuffer関数経由で実際の数値(ADX、+DI、-DI)を取得する流れになります。
3. 具体的な使い方・実践サンプルコード
以下は、iADXWilderを使用して「トレンドの発生」を検知し、ログに出力するシンプルなEAのサンプルです。
//+------------------------------------------------------------------+
//| SampleADXWilder.mq5 |
//+------------------------------------------------------------------+
#property strict
// インジケーターのハンドルを格納する変数
int adxHandle;
// 数値を格納する動的配列
double adxValues[];
double plusDIValues[];
double minusDIValues[];
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1. ADXWilderのハンドルを取得(期間14)
adxHandle = iADXWilder(_Symbol, _Period, 14);
// ハンドル取得失敗時のエラーチェック
if(adxHandle == INVALID_HANDLE)
{
Print("ADXWilderハンドルの取得に失敗しました。");
return(INIT_FAILED);
}
// 配列を時系列順(インデックス0が最新)にセット
ArraySetAsSeries(adxValues, true);
ArraySetAsSeries(plusDIValues, true);
ArraySetAsSeries(minusDIValues, true);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 2. 最新のデータを配列にコピー(最新から3本分)
// Buffer 0: ADX, Buffer 1: +DI, Buffer 2: -DI
if(CopyBuffer(adxHandle, 0, 0, 3, adxValues) < 0 ||
CopyBuffer(adxHandle, 1, 0, 3, plusDIValues) < 0 ||
CopyBuffer(adxHandle, 2, 0, 3, minusDIValues) < 0)
{
Print("データコピー失敗");
return;
}
// 3. トレンド判断ロジック(例:1本前の確定足で判断)
double currentADX = adxValues[1];
double currentPlusDI = plusDIValues[1];
double currentMinusDI = minusDIValues[1];
if(currentADX > 25.0)
{
if(currentPlusDI > currentMinusDI)
Comment("強い上昇トレンド中:ADX=", currentADX);
else
Comment("強い下降トレンド中:ADX=", currentADX);
}
else
{
Comment("レンジ相場、またはトレンドが弱いです。");
}
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// メモリ解放のためハンドルを削除
IndicatorRelease(adxHandle);
}
4. 使用上の注意点とよくあるエラー
-
ハンドルの取得はOnInitで行う:
iADXWilder関数をOnTick内で毎回呼び出すのは厳禁です。計算リソースを膨大に消費し、PCやプラットフォームがフリーズする原因になります。必ずOnInitで一度だけ取得し、使い回してください。 -
インデックス番号の間違い:
ADXWilderには3つのバッファがあります。- 0:Main(ADXライン)
- 1:+DI(プラス方向性指数)
- 2:-DI(マイナス方向性指数)
これを取り違えると、上昇トレンドなのに下降と判断するなど、致命的なロジックミスに繋がります。
-
計算に必要なバーの不足:
EAを稼働させた直後、チャートの履歴データが不足しているとADXが正しく計算されません(特にワイルダーの計算式は過去の値を累積するため、期間の数倍のデータが必要です)。CopyBufferが成功したか、戻り値を必ず確認する癖をつけましょう。
5. 【重要】自動売買における約定スピードと環境の罠
どれほど完璧なアルゴリズムをiADXWilderで組み上げたとしても、実行環境が「自宅のPC」であれば、その優位性は容易に崩れ去ります。FX市場はミリ秒(1000分の1秒)単位のスピード争いです。自宅のインターネット回線では、プロバイダーを経由する際の物理的な距離やネットワークの揺らぎ(ジッター)により、証券会社サーバーへの注文到達までに数十〜数百ミリ秒の遅延が発生します。
この「レイテンシ(遅延)」は、バックテストでは現れない「スリッページ」を引き起こし、本来利益が出るはずのポイントで損失を生む致命的な原因となります。自動売買をプロレベルで運用し、ロジック通りの期待値を実現するには、証券会社のデータセンターに極めて近い場所に位置する「専用VPS」の導入が不可欠です。物理的な距離をゼロに近づけることこそが、エンジニアが最初に行うべき最大のリスク回避策といえます。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント