MQL4で過去分のローソク足を集計するには、どの様にコードを記述すれば良いのでしょう?
単純にfor文のみでも集計することはできますが、それでは負荷が掛かりすぎてMT4の処理が重くなってしまう可能性があります。
そこで、「Bars」と「IndicatorCounted()」の出番です。
Barsには、チャートウィンドウ上に表示されているローソク足の合計本数が格納されています。
IndicatorCounted()は、インジケータ起動後、変化していないローソク足の量を返す関数です。
当記事では、この2つの変数と関数を用いて過去のローソク足を取得する方法を解説します。
MQL4で過去のローソク足を集計する方法
早速ですが、実際にコードを見ていきましょう。
下記コードが、過去のローソク足を取得し集計する方法になります。
//+------------------------------------------------------------------+
//| 1ティック毎に実行 |
//+------------------------------------------------------------------+
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 limit = Bars - IndicatorCounted() - 1;
//チャートを集計
for(int i = limit; i >= 0; i--) {
//最新足の集計
if(i == 0) {
/* 処理を記述 */
}
//過去足の集計
if(i > 1) {
/* 処理を記述 */
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
それぞれを分解して、さらに詳細に見ていきましょう。
過去のローソク足を取得
//過去のローソク足を取得
int limit = Bars - IndicatorCounted() - 1;
「Bars」はチャート上に表示されているローソク足の合計、「IndicatorCounted()」はインジケーター起動後、変化していないローソク足の合計でしたね。
例えばチャート上に表示されているローソク足が100本だと仮定すると、Barsに格納されている値は100になります。
一方で、IndicatorCounted()は変化していないローソク足、すなわち計算済みのローソク足の合計本数を返すので、1回目の処理段階では0が返されます。
よって、数値に置き換えると下記の様になります。
int limit = 100 - 0 - 1; //limit = 99になる
次に、式の最後にある「-1」の存在についてですが、これは2回目以降に処理が通った際に最新足のみ(0のみ)を取得するという意味です。
実際に2回目に処理が実行される際の値を、数値で見てみましょう。
int limit = 101 - 100 - 1; //limit = 0になる
この様に記述する理由ですが、後に解説するfor文での負荷を減らす為のものになります。
チャートを集計
//チャートを集計
for(int i = limit; i >= 0; i--)
上記コードでは単純に、過去足を格納した「limit」変数の値をfor文で用いて、その数分処理を繰り返すというコードになります。
ちなみに、「for(int i = 0; i <= limit-1; i++)」の様に記述することでも処理は行われますが、この場合現在を起点に過去に向かってfor文の処理が実行されることになります。
具体的には、0(最新足)を起点に1、2、3、4、5…という様に、過去足に向かうということです。
今回の様に過去足を集計したい場合は、基本的には「for(int i = limit; i >= 0; i–)」を用いることをオススメします。
この書き方であれば、過去足(limit)を起点に、現在へ向かってfor文の処理が実行されます。
最新・過去足の集計
ここまでくれば、後はif文を用いて条件分岐させるだけでOKです。
//最新足の集計
if(i == 0) {
/* 処理を記述 */
}
//過去足の集計
if(i > 1) {
/* 処理を記述 */
}
最新足を集計したい場合は、最新足を表す0で分岐させる為に「if(i == 0)」を用います。
過去足を集計したい場合は、1以上の数値を分岐させる為に「if(i > 1)」を用いればOKです。