差分処理の説明書|超初心者向け
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. 一番大事なまとめ
差分処理とは、毎回全部を計算しないための仕組みです。
目的は、インジケーターを軽くすることです。
このコードでは、初回や設定変更時は全部計算し、通常時は最新付近だけを計算します。
差分処理 = 新しく増えた分だけ計算する仕組み