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

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

概要

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

クラスの宣言

class COsMAOnRingBuffer : public CArrayRing

タイトル

#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>

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

クラスメソッド

//--- 初期化メソッド:bool Init(    // エラーがあればfalse、成功すればtrueint 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(    // 処理された要素数を返すconstint rates_total, // array[]のサイズconstint prev_calculated, // 前回の呼び出し時の処理要素数constdouble &array[] // 入力値の配列
);
//--- 配列の個別シリーズ要素に基づく計算メソッド:double MainOnValue(    // 設定された要素のOsMA値を返すconstint rates_total, // 配列のサイズconstint prev_calculated, // 配列の処理済み要素constint begin, // 配列の重要なデータが始まるインデックスconstdouble value, // 配列の重要な要素constint 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;

...

//+------------------------------------------------------------------+//| カスタムインディケーターの反復関数                              |//+------------------------------------------------------------------+intOnCalculate(constint rates_total, 
    constint prev_calculated, 
    constint begin, 
    constdouble &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