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

 
Sergey Savinkin:

また、1時間ごとのタイムフレームからCopyRatesを作り(丸い数字が得られる)、現在のタイムフレームからの時間(Timeに変わる)をCreateFigure プロシージャに渡し、現在のタイムフレームでインデックスを検索 すると、なぜ丸くなるのか?start_index=ArrayBsearch(Time,start_time) となります。

そうです、配列の中の丸くない時間に丸い時間を求めているのです...。つまり、分単位の時間枠で、その時間がその時間の開始 時間に対応するバーを探します。

 
О!
 
Алексей Тарабанов:
О!

感動はいいものだ!

でも、もしかしたら実質的な感想が出るかも!?

 

ここでは、例えば時間についてはどうかというと、時間を節約するために2つの変数を追加しました。

void CreateFigure(int i,const datetime &Time[],const double &Open[],const double &High[],const double &Low[],const double &Close[],MqlRates &rates[])
  {
   datetime start_time=rates[i].time;
   datetime stop_time=(start_time+PeriodSeconds(TimeFrames));
   datetime start_timeA=start_time;
   
//---
   int start_index,stop_index,limit;
   datetime vertical_line_time;
//---
   start_index=ArrayBsearch(Time,start_time);
   datetime start_timeB=Time[start_index];   
   if(Time[start_index]<start_time) start_index=(start_index>0?start_index-1:start_index);
   start_time=Time[start_index];
   Print("start_timeA=", start_timeA, " start_timeB=",start_timeB," start_time=",start_time);

このようなプリントを得ることができます。

2018.07.05 00:39:30.465 IndDrafter_Test (Si-9.18,M1)    start_timeA=2018.07.04 12:00:00 start_timeB=2018.07.04 12:00:00 start_time=2018.07.04 12:00:00
2018.07.05 00:39:30.465 IndDrafter_Test (Si-9.18,M1)    start_timeA=2018.07.04 13:00:00 start_timeB=2018.07.04 13:00:00 start_time=2018.07.04 13:00:00
2018.07.05 00:39:30.465 IndDrafter_Test (Si-9.18,M1)    start_timeA=2018.07.04 14:00:00 start_timeB=2018.07.04 13:59:00 start_time=2018.07.04 14:05:00
2018.07.05 00:39:30.465 IndDrafter_Test (Si-9.18,M1)    start_timeA=2018.07.04 15:00:00 start_timeB=2018.07.04 15:00:00 start_time=2018.07.04 15:00:00

つまり、通常/静止状態では、すべてが正しいかのように。

14:00に分足TFのバーの開始時刻が 14:05に修正されていることがわかります - TF M1上の最初のバーが出現した実際の時刻です。
 
Aleksey Vyazmikin:

感動はいいものだ!

でも、もしかしたら実質的な感想が出るかも!?

時間は同じなので、limit=0。自分でやりたかったんです。

 
Алексей Тарабанов:

時間は同じなので、limit=0。自分でやりたかったんです。

では、1時間が同じならどうでしょう?何しろ、TF M1のこの時間には60本の小節があるのだ!

また、現在のTFと計算されたTFが一致した場合、保護され、この状況ではゼロによる除算は 行われません。

if(_Period>=TimeFrames) return(0);
 
スリーピング
 
Алексей Тарабанов:
スリーピング

隠れているのか!?

 
スリーピング
 
Алексей Тарабанов:
スリーピング

???