こんにちは、トレーダーの皆さん!今日は、MetaTrader 5でのAverage Directional Movement Index(ADX)を計算するためのCADXOnRingBufferクラスについてお話しします。このクラスは、リングバッファを使用してADXを算出するために設計されています。
CADXOnRingBufferクラスの概要
このクラスを使うことで、ADXを簡単に計算できます。まず、以下のようにクラスを宣言します。
class CADXOnRingBuffer次に、CADXOnRingBuffer.mqhファイルをMQL5\Include\IncOnRingBufferフォルダーに配置してください。このフォルダーには、クラスのサンプルファイルも含まれています。また、リングバッファや移動平均のクラスもこのフォルダー内に配置する必要があります。
クラスのメソッド
//--- 初期化メソッド: bool Init(// エラーの場合はfalseを返し、成功した場合はtrueを返します int ma_period = 14, // 移動平均の平滑化期間 ENUM_MA_METHOD ma_method = MODE_EMA, // 移動平均の平滑化方法 int size_buffer = 256, // リングバッファのサイズ bool as_series = false // 時系列の場合はtrue、通常のインデックスの場合はfalse ) {
このメソッドでは、移動平均の平滑化方法やリングバッファのサイズを指定します。
//--- 時系列またはインジケーターバッファに基づく計算メソッド: int MainOnArray(// 処理された要素数を返します const int rates_total, // 配列のサイズ const int prev_calculated,// 前回の呼び出しで処理された要素数 const double &high[], // 高値の配列 const double &low[], // 安値の配列 const double &close[] // 終値の配列 );
このメソッドを使うことで、ADXを計算する際に必要なデータを処理できます。
データの取得
リングバッファから計算されたデータを取得する方法も、通常の配列と同様に行えます。例えば、以下のように記述します。
#include <IncOnRingBuffer\CADXOnRingBuffer.mqh> CADXOnRingBuffer adx; int OnCalculate(const int rates_total, ...){ adx.MainOnArray(rates_total, prev_calculated, high, low, close); for(int i=start; i<rates_total; i++) { ADX_Buffer[i] = adx[rates_total - 1 - i]; // ADXの値 PDI_Buffer[i] = adx.pdi[rates_total - 1 - i]; // PDIの値 NDI_Buffer[i] = adx.ndi[rates_total - 1 - i]; // NDIの値 } }
これで、リングバッファのデータをインジケーターにコピーすることができます。
リングバッファのインデックスは、時系列と同様ですので注意してください。
サンプルファイル
- Test_ADX_OnArrayRB.mq5ファイルは、価格の時系列に基づいてインジケーターを計算します。
- Test_ADX_OnValueRB.mq5ファイルでは、MainOnValue()メソッドの使用例を示しています。

Test_ADX_OnArrayRB.mq5の結果(リングバッファサイズ:256要素)

Test_ADX_OnValueRB.mq5の結果(リングバッファサイズ:256要素)
このコードを書く際には、MetaQuotes Software Corp.、Integer、およびGODZILLAの開発を参考にしました。