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

MetaTrader 5でのOBVをリングバッファで描く方法

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

概要

COBVOnRingBufferクラスは、オンバランスボリューム(OBV)というテクニカル指標をリングバッファアルゴリズムを使用して計算するために設計されています。

クラスの宣言

class COBVOnRingBuffer : public CArrayRing

タイトル

#include <IncOnRingBuffer\COBVnRingBuffer.mqh>

COBVOnRingBuffer.mqhクラスのファイルは、MQL5\Include内に新たに作成したIncOnRingBufferフォルダに配置する必要があります。このフォルダには、このクラスで使われるサンプル用の2つのファイルが添付されています。また、リングバッファのクラスファイルもこのフォルダ内に置いておく必要があります。

クラスメソッド

//--- 初期化メソッド:
bool Init(// エラーがあればfalseを返し、成功すればtrue
  int period = 0, // OBVの期間
  int size_buffer = 256, // リングバッファのサイズ
  bool as_series = false // 時系列の場合はtrue、そうでなければfalse
  );

OBVの期間は、整数の場合と同様に使用されます。値が0(デフォルト)の場合、指標はターミナルに含まれるものと同様に、全てのバーに対して計算されます。他の正の値が指定された場合、その数値は各チャートバーの値計算に使用されるバーの数を指定します(移動平均の原則に基づく)。

//--- 時系列または指標バッファに基づく計算メソッド:
int MainOnArray(// 処理された要素の数を返します
  const int rates_total, // 配列のサイズ
  const int prev_calculated, // 前回の呼び出しで処理された要素
  const double& price[], // 価格
  const long& volume[]); // ボリューム
  );
//--- 配列の個別要素に基づく計算メソッド:
double MainOnValue(// 指定された要素(バー)のOBV値を返します
  const int rates_total, // 配列のサイズ
  const int prev_calculated, // 配列の処理済み要素
  const int begin, // 配列の重要なデータが始まる位置
  const double price, // 価格
  const long volume, // ボリューム
  const int index // 要素(バー)インデックス
  );
//--- データアクセスメソッド:
int BarsRequired(); // 指標を描画するために必要なバーの数を返します
string Name(); // 指標の名前を返します
int Period(); // 期間を返します
int Size(); // リングバッファのサイズを返します

リングバッファから計算された指標データを取得するのは、通常の配列から取得するのと同じように可能です。例えば:

//--- OBV指標の計算メソッドを持つクラス:
#include <IncOnRingBuffer\COBVOnRingBuffer.mqh>
COBVOnRingBuffer obv;

...
//+------------------------------------------------------------------+
//| カスタム指標のイテレーション関数                              |
//+------------------------------------------------------------------+
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[])
  {
//--- 時系列に基づく指標の計算:
      obv.MainOnArray(rates_total, prev_calculated, close, tick_volume);

...
//--- リングバッファ「obv」からデータを使用し、
//    例えば、指標バッファにデータをコピーします:
   for(int i=start; i<rates_total && !IsStopped(); i++)
      OBV_Buffer[i] = obv[rates_total-1-i]; // 指標ライン

...
//--- 次回の呼び出しのためにprev_calculatedを返します:
   return(rates_total);
  }

リングバッファでのインデックスは、時系列と同じです。

  1. Test_OBV_OnArrayRB.mq5ファイルの基に、指標が価格の時系列に基づいて計算されます。MainOnArray()メソッドの使用が示されています。
  2. Test_OBV_OnValueRB.mq5ファイルは、MainOnValue()メソッドの使用を実演します。最初にOBV指標が計算され描画され、その後この指標リングバッファに基づいてさらに別のOBVが描画されます。


Test_OBV_OnArrayRB.mq5のリングバッファサイズが256要素の結果



Test_OBV_OnValueRB.mq5のリングバッファサイズが256要素の結果

 

コード作成にあたって、MetaQuotes Software Corp.Integer、およびGODZILLAの開発が使用されました。

関連記事

コメント (0)