MQL5差分の基礎知識

差分処理の説明書|超初心者向け

1. 今回説明するコード

まず、今回説明するのはこの部分です。

bool shokai_or_all_keisan = (prev_calculated == 0) || zenbu_keisan;
int  inc  = (prev_calculated == 0) ? 0 : MathMax(0, rates_total - prev_calculated);
int  need = shokai_or_all_keisan ? bars5_or_total : MathMax(2, MathMin(bars5_or_total, inc + 2));

int min_end = need - 2;
if(min_end < 0)
{
   return(rates_total);
}

int  min_end_or_zouka = (prev_calculated == 0) ? min_end : MathMax(0, rates_total - prev_calculated);
int  yobi = 1;
int  main_loop_start = 0;
int  main_loop_end = shokai_or_all_keisan ? min_end : MathMin(main_loop_start + MathMax(1, min_end_or_zouka + yobi) - 1, min_end);

この部分が、毎回すべてのローソク足を計算せず、必要な部分だけを計算するための処理です。

2. 差分処理とは

差分処理とは、前回から変わった部分だけを計算する処理のことです。

インジケーターはローソク足を使って計算します。

しかし、毎回すべてのローソク足を計算し直すと、動作が重くなります。

そこでこのコードでは、最初だけ全部計算し、その後は新しく増えたローソク足だけを計算します。

3. まず覚えること

この差分処理は、次のように動きます。

  • 初回は全部計算する
  • 設定変更があったら全部計算する
  • 通常時は、新しく増えた分だけ計算する

4. 変数の意味

prev_calculated

前回までに計算したローソク足の本数です。

初回はまだ何も計算していないので、0になります。

rates_total

今チャートにあるローソク足の本数です。

zenbu_keisan

全部計算し直すためのスイッチです。

true のときは、差分処理ではなく全部計算します。

bars5_or_total

今回、表示対象にするローソク足の本数です。

inc

前回から新しく増えたローソク足の本数です。

need

今回、計算に必要なローソク足の本数です。

main_loop_start

計算を始める位置です。

このコードでは 0 なので、最新のローソク足から計算します。

main_loop_end

計算を終える位置です。

つまり、最新足からどこまで過去に戻って計算するかを決めています。

5. 1行ずつ説明

初回か、全部計算かを確認する

bool shokai_or_all_keisan = (prev_calculated == 0) || zenbu_keisan;

これは、初回かどうか、または全部計算し直す必要があるかを確認しています。

prev_calculated が 0 なら初回です。

zenbu_keisan が true なら、設定変更などで全部計算し直す状態です。

前回から増えた本数を調べる

int inc = (prev_calculated == 0) ? 0 : MathMax(0, rates_total - prev_calculated);

これは、前回からローソク足が何本増えたかを調べています。

たとえば、前回1000本、今回1001本なら、増えた本数は1本です。

今回計算する本数を決める

int need = shokai_or_all_keisan ? bars5_or_total : MathMax(2, MathMin(bars5_or_total, inc + 2));

これは、今回何本分を計算するかを決めています。

初回や全部計算のときは、表示対象分を全部計算します。

通常時は、増えた本数に少し余裕を足して計算します。

6. なぜ +2 するのか

クロス判定では、今のローソク足だけではなく、1本前のローソク足も見る必要があります。

たとえば、1本前ではMA1がMA2より下、今の足ではMA1がMA2より上なら、ゴールデンクロスと判断します。

つまり、今の足だけでは判断できません。

そのため、増えた本数だけではなく、少し多めに計算しています。

7. ループ範囲を決める処理

最後の位置を決める

int min_end = need - 2;

これは、計算で使う最後の位置を決めています。

クロス判定では次の足を見ることがあるため、最後の位置を少し手前にしています。

計算できない場合は終了する

if(min_end < 0)
{
   return(rates_total);
}

ローソク足が少なすぎる場合は、無理に計算せず終了します。

余裕分を決める

int yobi = 1;

これは、少し余分に計算するための数です。

計算開始位置を決める

int main_loop_start = 0;

0 は最新のローソク足を意味します。

つまり、最新のローソク足から計算を始めます。

計算終了位置を決める

int main_loop_end = shokai_or_all_keisan ? min_end : MathMin(main_loop_start + MathMax(1, min_end_or_zouka + yobi) - 1, min_end);

ここでは、どこまで過去に戻って計算するかを決めています。

初回や全部計算なら、広い範囲を計算します。

通常時なら、増えた分と余裕分だけを計算します。

8. 具体例

前回1000本まで計算していて、今回1001本になったとします。

この場合、新しく増えたローソク足は1本です。

しかし、クロス判定では前の足も見る必要があります。

そのため、1本だけではなく、数本分だけ再計算します。

つまり、1001本すべてを計算し直すのではなく、最新付近だけを計算します。

9. このコードを日本語にすると

この差分処理は、次のような意味です。

初回なら全部計算する。

設定変更があったら全部計算する。

通常時なら、前回から増えたローソク足だけ調べる。

ただし、クロス判定には前の足も必要なので、少し多めに計算する。

最後に、最新足からどこまで過去に戻って計算するかを決める。

10. 一番大事なまとめ

差分処理とは、毎回全部を計算しないための仕組みです。

目的は、インジケーターを軽くすることです。

このコードでは、初回や設定変更時は全部計算し、通常時は最新付近だけを計算します。

差分処理 = 新しく増えた分だけ計算する仕組み