ホーム テクニカル指標 投稿

MetaTrader 5でのADXをリングバッファを使って描画する方法

添付ファイル
1343.zip (9.86 KB, ダウンロード 0回)

こんにちは、トレーダーの皆さん!今日は、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の開発を参考にしました。

関連記事

コメント (0)