無条件で1,500円分の
Amazonギフト券が貰えるって本当!?

MQL4

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

\ プログラミングスクール厳選ランキング /

プログラミングスクール厳選ランキングTOP10!

プログラミングスキルを身につけるべく、スクール受講を検討している方に向けて、数多く存在するスクールの中から厳選した10社をランキング形式でご紹介!無料体験を受講することで、誰でも1,500円分のAamazonギフト券が貰えるお得なキャンペーンも実施しているので、ぜひこの機会を逃さずにチェックしてくださいね!

今スグ詳細をチェックする

-MQL4

© 2021 ユウマのブログ