【MQL4】過去のローソク足を集計する方法

mql4過去足を集計

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です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Webベンチャー企業で働くエンジニア | 効率化のためのツール開発とかが好きな人 | ブログ最高月間収益18万 | 千葉県1995年11月生まれ | 当ブログでは「プログラミング・デザイン・ブログ」に関する内容を中心に、役立つ情報を発信します

目次