この記事はすでに確定しているバーの計算を一回だけに限定する方法を紹介しています。
ティック毎にすべてのバーを計算していては処理が重たくなりますので、一番最初だけすべてのバーを計算したい場合等に使用します。
MT4とMT5ではバーの数え方が異なります。
MT4では最新のバー(一番右のバー)は「0」、一番古いバー(一番左のバー)は「バーの総数-1」
MT5では最新のバー(一番右のバー)は「バーの総数-1」、一番古いバー(一番左のバー)は「0」
です。
確定しているバーを一回だけ処理するコード
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
//---確定したバーを一回だけ処理するコード
for(int i=prev_calculated ; i<=rates_total ; i++){
//---ここに計算式を代入していく
}
return(rates_total);
}
上記のコードの解説
今回紹介したいコードは下記の部分です。
//---確定したバーを一回だけ処理するコード
for(int i=prev_calculated ; i<=rates_total ; i++){
//---ここに計算式を代入していく
}
簡単に説明すると、当初変数iには0が入っています。そして、処理をするごとにiが加算されていき、すべてのバーの計算をします。
この説明だと毎回全部計算するんじゃないか?と思われると思いますが、この疑問を【prev_calculated】が解決してくれています。
【prev_calculated】とは
【prev_calculated】とは計算処理をしたバーの本数を保持しています。
ですので、チャートが表示される前は【0】が格納されています。その後、ローソク足や、バーチャートが表示されることによって、各バーが計算されたとみなされ、表示されているバーの本数になります。
つまり、計算されたバーは二回計算されない状態になります。
そして、うれしいことに最新のバーは毎回計算しなおしてくれます。
これは【rates_total】と比較しているからです。
【rates_total】とは
【rates_total】とはすべてのバーの本数を保有しています。
つまり、【prev_calculated】と同じ数値を保持することになります。
この2つを【<=】で比較することにより、最新のバーのみ計算をし続けてくれる仕組みを作ることができます。
注意点
注意するまでもないかもしれませんが、すべてのバーの本数は【rates_total】に保持されていますが、最新のバーの位置は【rates_total-1】です。一番左のバーが【0】なので、一番右のバーは【バーの総数-1】となります。
付録(単純移動平均線)のインジゲータ
上記のコードを活用した移動平均線を表示するインジゲータを添付していますので、コードを見てみてください。正直移動平均線を表示するインジゲータはデフォルトで入っているので、作成する意味はないですが、デフォルトで入っている移動平均線のプログラムは細かいところまで作りこまれているので、参考にしづらいと思います。
自分が作成したインジゲータは必要最低限のコードでしか書かれていないので、読み解くのが非常に簡単です。ぜひ中身を確認してみてください。
コメント