ある指標でゼロ除算エラーが発生した - ページ 6

 
Aleksey Vyazmikin:

論理的にゼロになることはないはずなのですが、なぜそうなるのかは不明です

d1では小さな数字が出るので、int bid=int((tick_array[0].bid+_Point/10)/_Point) のように価格をintに変換して問題を回避しています。確かに、doubleで計算すると5桁で0.0000099999と出ることがあります。
 
Aleksey Vyazmikin:

ロジックでゼロになることは全くないはずなのに、なぜそうなるのか理解できない!?

Si-9.18でデバッガで実行。レートでの時間はなぜか2016年。iの値は2189であるが。従って、流動性のないチャートの先頭 から計算を開始します。起動から停止までの初期時間は1時間です。しかし、その1時間には、1つの時間値しかありません。startとstopの両方の変数で見つけます。その結果、スタート=ストップとなる。もちろん、引き算をすればゼロになる。あとはまだわからない。

 
ovak77:
d1が小さい数字になっていますが、価格をint型に変換して、例えばint bid=int((tick_array[0].bid+_Point/10)/_Point); とすると、確かにdoubleで計算した場合、0が返ってくることがありますね。

d1の議論はやめましょう。必要なら必要なのです。そこではすべてが正しくカウントされているのです。問題は、start_timeとstop_time、start_indexとstop_indexが同じ値になるのはなぜか、ということです。

 
Aleksey Vyazmikin:

d1の議論はやめましょう。必要なら必要なのです。そこではすべてが正しくカウントされているのです。問題は、なぜstart_timeとstop_timeの値がstart_indexとstop_indexの値と同じになるのか、ということです。

あなた次第です。例えば、0.0000099999を2で割ってみてください。
 

さらにハングアップした後、端末が動かなくなる...。再インストールせずに復活させるにはどうしたらいいですか?

メモリ内でハングアップしていることが判明し、プロセスを強制終了したところ、起動しました。

 
Aleksey Vyazmikin:

どうして時間が平等になるのでしょうか?半年間、すべて正常に動作していたのに...。

void CreateFigure(int i,const datetime &Time[],const double &Open[],const double &High[],const double &Low[],const double &Close[],MqlRates &rates[])
  {                                                              //i = 2189 
   datetime start_time=rates[i].time;                            //start_time=rates[i].time = D'2016.10.06 12:00:00'
   datetime stop_time=(start_time+PeriodSeconds(TimeFrames));    //stop_time = D'2016.10.06 13:00:00'
//---                                                            //Time[38572] = D'2016.10.05 19:23:00'
   int start_index,stop_index,limit;                             //Time[38571] = D'2016.10.06 12:35:00'
   datetime vertical_line_time;                                  //Time[38570] = D'2016.10.06 19:05:00'
//---
   start_index=ArrayBsearch(Time,start_time);                    //start_index = 38571
   if(Time[start_index]<start_time) start_index=(start_index>0?start_index-1:start_index);
   start_time=Time[start_index];                                 //start_time = D'2016.10.06 12:35:00'
   if(i>0)
     {
      stop_index=ArrayBsearch(Time,stop_time);                   //stop_index = 38571
      if(Time[stop_index]>stop_time) stop_index++;
      stop_time=Time[stop_index];                                //stop_time  = D'2016.10.06 12:35:00'
      limit=start_index-stop_index+1;
      vertical_line_time=Time[start_index-(limit>>1)];
まずlimit=start_index-stop_index+1 があり、つまりlimit==1 で、次に 2 で割った ところがlimit=(int)(stop_time-start_time)/PeriodSeconds(_Period) となっていますね。1つは追加されません。ゼロは周期で区切られる。
 
Sergey Savinkin:

Si-9.18でデバッガで実行。レートでの時間はなぜか2016年。iの値は2189であるが。従って、流動性のないチャートの先頭 から計算を開始します。起動から停止までの初期時間は1時間です。しかし、その1時間には、1つの時間値しかありません。startとstopの両方の変数で見つけます。その結果、スタート=ストップとなる。もちろん、引き算をすればゼロになる。あとはまだわからない。

受信パラメータにBarsUsed=100を入れる。

 
Aleksey Vyazmikin:

受信パラメータにBarsUsed=100を入れる。

はい、この方法ならエラーは起こりません。しかし、流動性の低い商品や流動性の低い時間帯、例えばイブニングセッションに参加すれば、1時間以内に1本の安値バーを簡単に取得することができるのです。よって、リミット=0が保証されることになるのですまた、引用符が 2 の場合、limit/2 は丸め誤魔化しても 0 となります。

 
Sergey Savinkin:

はい、それはエラーではありません。しかし、流動性の低い商品や流動性の低い時間帯に手を出すと、例えばイブニング・セッションの場合、1時間に1本のローバーが出るかもしれません。よって、リミット=0が保証されることになるのですまた、引用符が2であれば、limit/2は丸められたときに0になったままです。

おそらく、考えてみます、ありがとうございました。しかし、世界的な問題は別のところにある...。問題は、安定しないことです。

 
ovak77:
あなた次第です。例えば、0.0000099999を2で割ってみてください。

プリントされたd1 - 私の目的ではそれは

2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=35.71428571428572
2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=32.78688524590164
2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=32.78688524590164
2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=32.78688524590164
2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=43.47826086956522

とにかく、そんなことより、ありがとうございます。