MQL4では、カスタムインジケーターを作成する際に、インジケーターの表示方法や動作を設定するために#propertyという命令を使用します。
その中の一つであるindicator_buffersは、インジケーターで使用するバッファの数を指定します。バッファを宣言しないとメモリ消費が最適化されず、パフォーマンスが低下する可能性があるそうです。
具体的な例としてRSI(Relative Strength Index)インジケーターを表示する方法で解説します。
サンプルコード全文
iRSI関数を利用してRSIインジケーターを表示するコードになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
//+------------------------------------------------------------------+ //| indicator_buffers.mq4 | //| Copyright 2024, 潤奈FX | //| https://zyunafx.com/ | //+------------------------------------------------------------------+ #property strict // インディケーターの設定 #property indicator_separate_window //インジケーターをサブウインドウに表示 #property indicator_buffers 1 //インジケーターのバッファ数を指定 #property indicator_height 150 //サブウインドウの高さを指定 #property indicator_minimum 0 //サブウインドウの表示範囲の下限 #property indicator_maximum 100 //サブウインドウの表示範囲の上限 #property indicator_color1 clrRed //インジケーターの表示色を赤色に指定 // インディケーターのバッファ double rsiBuffer[]; //+------------------------------------------------------------------+ int OnInit() { // バッファの初期化 SetIndexBuffer(0, rsiBuffer); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ 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[]) { int period = 14; // RSI計算期間 // 全ローソク足から計算済バー数を引く int limit = rates_total - prev_calculated; // 計算済バー数が0の時(初期動作)は、全ローソク足から1を引く if (prev_calculated == 0) limit--; // 過去から現在までのローソク足分をループ処理をする for (int i = limit; i >= 0; i--){ rsiBuffer[i] = iRSI(_Symbol, 0, period, PRICE_CLOSE, i); } return(rates_total); } //+------------------------------------------------------------------+ |
コード説明
インジケーターの設定
1 2 3 4 5 6 |
#property indicator_separate_window //インジケーターをサブウインドウに表示 #property indicator_buffers 1 //インジケーターのバッファ数を指定 #property indicator_height 150 //サブウインドウの高さを指定 #property indicator_minimum 0 //サブウインドウの表示範囲の下限 #property indicator_maximum 100 //サブウインドウの表示範囲の上限 #property indicator_color1 clrRed //インジケーターの表示色を赤色に指定 |
#propertyはコンパイルする際に使われ、インジケーターの表示方法や見た目を設定します。
indicator_buffersを使用して、インジケーターで使用するバッファの数を指定します。
インジケーターのバッファ
1 |
double rsiBuffer[]; //インジケーターの値を格納する為の配列 |
インジケーターの値を格納する為の配列をバッファといいます。このバッファを使用して、計算されたインジケーターの値をチャート上に表示します。
インジケーターの初期化関数
1 2 3 4 5 6 7 |
int OnInit() { // バッファの初期化 SetIndexBuffer(0, rsiBuffer); return(INIT_SUCCEEDED); } |
OnInit関数は、インジケーターの初期化を行います。SetIndexBuffer関数を使用して、rsiBufferをインジケーターのバッファとして設定します。
これにより、計算された値がこのバッファに格納され、チャートに表示されます。
インジケーターの計算関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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[]) { int period = 14; // RSI計算期間 // 全ローソク足から計算済バー数を引く int limit = rates_total - prev_calculated; // 計算済バー数が0の時(初期動作)は、全ローソク足から1を引く if (prev_calculated == 0) limit--; // 過去から現在までのローソク足分をループ処理をする for (int i = limit; i >= 0; i--){ rsiBuffer[i] = iRSI(_Symbol, 0, period, PRICE_CLOSE, i); } return(rates_total); } |
OnCalculate関数は、インジケーターの主な計算部分です。ここでは、iRSI
関数を使用して指定された通貨ペアと時間枠に対してRSIを計算し結果を返します。
計算済バー数prev_calculatedから全バー数rates_totalを引き、その範囲内でループ処理を行います。初回計算時は全バー数から1を引いた数を計算範囲とし、過去から最新のバーに向かってRSIを計算します。
表示イメージ画像
まとめ
indicator_buffersは、インジケーターで使用するバッファの数を指定する重要な設定です。この設定により、インジケーターが複数のバッファを使用する場合でも適切にバッファを管理し、値を格納することができます。
サンプルコードではiRSI
関数を使用してRSIを計算し表示していますが、同様の方法でさまざまなインディケーターを作成することができますので試してみてください。
コメント