MetaTrader 5でのOsCD描画クラス: リングバッファを使用したインディケーター

Mike 2013.01.08 00:45 53 0 0
添付ファイル

概要

COsMAOnRingBufferクラスは、オシレーターの移動平均(OsMA)というテクニカルインディケーターをリングバッファアルゴリズムを使って計算するために設計されています。

クラスの宣言

class COsMAOnRingBuffer : public CArrayRing

タイトル

#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>

COsMAOnRingBuffer.mqhクラスのファイルは、MQL5\Include\内に作成する必要があるIncOnRingBufferフォルダーに配置してください。このフォルダーに含まれるサンプル用の2つのファイルも添付されています。リングバッファ、MACD、および移動平均クラスのファイルもこのフォルダー内に配置する必要があります。

クラスメソッド

//--- 初期化メソッド:
bool Init(    // エラーがあればfalse、成功すればtrue
    int fast_period = 12, // ファスト移動平均のスムージング期間
    int slow_period = 26, // スローペースの移動平均のスムージング期間
    int signal_period = 9, // シグナル移動平均のスムージング期間
    ENUM_MA_METHOD fast_method = MODE_EMA, // ファスト移動平均のスムージング方法
    ENUM_MA_METHOD slow_method = MODE_EMA, // スローペースの移動平均のスムージング方法
    ENUM_MA_METHOD signal_method = MODE_SMA, // シグナルラインのスムージング方法
    int size_buffer = 256, // リングバッファのサイズ、格納するデータの数
    bool as_series = false // trueの場合は時系列、falseの場合は通常のインデックス
);
//--- 時系列またはインディケータバッファに基づく計算メソッド:
int MainOnArray(    // 処理された要素数を返す
    const int rates_total, // array[]のサイズ
    const int prev_calculated, // 前回の呼び出し時の処理要素数
    const double &array[] // 入力値の配列
);
//--- 配列の個別シリーズ要素に基づく計算メソッド:
double MainOnValue(    // 設定された要素のOsMA値を返す
    const int rates_total, // 配列のサイズ
    const int prev_calculated, // 配列の処理済み要素
    const int begin, // 配列の重要なデータが始まるインデックス
    const double value, // 配列の重要な要素
    const int index // 要素のインデックス
);
//--- データへのアクセス方法:
int BarsRequired(); // インディケーター描画に必要なバー数を返す
string Name(); // インディケーターの名前を返す
string FastMethod(); // ファストラインのスムージング方法をテキスト形式で返す
string SlowMethod(); // スローペースラインのスムージング方法をテキスト形式で返す
string SignalMethod(); // シグナルラインのスムージング方法をテキスト形式で返す
int FastPeriod(); // ファストラインのスムージング期間を返す
int SlowPeriod(); // スローペースラインのスムージング期間を返す
int SignalPeriod(); // シグナルラインのスムージング期間を返す
int Size(); // リングバッファのサイズを返す

リングバッファから計算されたインディケータのデータを通常の配列のように取得することができます。例えば:

//--- OsMA計算メソッドを持つクラス:
#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>
COsMAOnRingBuffer osma;

...

//+------------------------------------------------------------------+
//| カスタムインディケーターの反復関数                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, 
    const int prev_calculated, 
    const int begin, 
    const double &price[]) 
{ 
//--- 価格時系列に基づくインディケーターの計算:
    osma.MainOnArray(rates_total, prev_calculated, price);

...

//--- "osma"リングバッファからデータを使用し、
//    インディケータバッファにデータをコピーする:
    for(int i=start;i<rates_total;i++)
        OsMABuffer[i]=osma[rates_total-1-i];          // インディケータヒストグラム
//--- 次の呼び出し用にprev_calculatedの値を返す:
    return(rates_total);
}

リングバッファのインデックスは、時系列と同じであることに注意してください。

  1. Test_OsMA_OnArrayRB.mq5ファイルは、価格時系列に基づいてインディケーターを計算します。MainOnArray()メソッドの適用が示されています。
  2. Test_OsMA_OnValueRB.mq5ファイルは、MainOnValue()メソッドの使用を示しています。最初にOsMAインディケーターが計算され描画され、その後このインディケーターのリングバッファに基づいてさらに1つのOsMAインディケーターが描画されます。


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



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

 

コードを書く際には、MetaQuotes Software Corp.IntegerおよびGODZILLAの開発が使用されました。

リスト
コメント 0