週末を含むカウントバー - ページ 3

 
Igor Makanu:

複雑な、秒単位で日付間の時間(datetime)がある - これは、24時間、各時間に60分、1分に60秒で、全体の日数を計算するのに十分です...助けるためにGoogleの。

ひねくれた数え方ということであれば、こんなやり方もありますよ。

ご指摘のように、各バーをカウントして、現在のバーと前のバーの間に週末があったかどうかを調べることができます...一般的にここでは、タスクを複雑にする可能性は欲求によって制限されています )))

まず、時間間隔は0:0から始まり、0:0で終わると仮定してみましょう。

 
Dmitry Fedoseev:

まず、時間間隔が0:0で始まり、0:0で終わると仮定することから始めなければならない。

私の例ではこの仮定は必要ありませんが、1暦年内の計算であると仮定する必要があります。

最初の投稿に解決策がありましたが、代わりにトピックに別の解決策があるはずです キミウからの唯一の有用なコード、私は見たことがあると思います

 
Igor Makanu:

私の例ではこの仮定は必要ありませんが、1暦年内の計算であると仮定する必要があります。

最初の投稿に解決策がありました。または、KimIVからの有用なコードのみというトピックに別の解決策があるはずです。

カウントする必要があるのは日数だけでなく、労働日や週末も含まれます。

 
Dmitry Fedoseev:

カウントするのは日数だけでなく、平日でも土日でも構いません。

問題の表現が曖昧で何とも言えない。

forex2030 です。

D1のようなポイント間の週末をどのように把握し、必要なバーに追加するのでしょうか?

もし、あなたの表現によると、コピータイム() 日中バーをコピーし、ループで週末のバーを分析しますが、週末のバーで何をするのでしょうか?- と表示されるのですが、追加したいのでしょうか?
 
Igor Makanu:

問題の表現が曖昧で何とも言えない。

...

D1などのポイント間の出力 数をどのように把握し、必要なバー数に 加算するのか」という曖昧さです。"

なぜこれが必要なのかは、また別の問題です。

 
int WorkingDays(datetime startDate,datetime endDate){

   int d=int((endDate-startDate)/86400);
   
   int m[7,7]={
   {0, 0,1,2,3,4,5}, // воскр
   {0, 1,2,3,4,5,5}, // понед
   {0, 1,2,3,4,4,4}, // вторн
   {0, 1,2,3,3,3,4}, // среда
   {0, 1,2,2,2,3,4}, // четв
   {0, 1,1,1,2,3,4}, // пятн
   {0, 0,0,1,2,3,4}  // субб
   };

   return (d/7)*5+m[(int)TimeDayOfWeek(startDate)][d%7];
}

確認したようで、問題ないようです。手抜きがないか確認する

 
Dmitry Fedoseev:

D1などの ポイント間の出力 数をどのように把握し、必要なバー数に 加算するのか」という曖昧さです。"

そして、なぜそれが必要なのかは、また別の問題です。

あと2時間くらいおしゃべりすれば、問題の評価が始まって、2本のバーの間にいくつの出力ができるのか......ということになると思うんです。そしてきっと、月曜日の前には必ず日曜日が来るという対応策があるのだろう。

)))))

日数計算をdatetimeの引き算で修正することで、このコードはすべてのケースで機能すると思います。

input datetime d_start = D'2020.01.01 12:30:27';
input datetime d_stop  = D'2020.02.01';

//+------------------------------------------------------------------+
void OnStart()
{
   const int day_in_sec = 24 * 60 * 60;
   datetime d_corect1 = d_start - d_start % day_in_sec;
   datetime d_corect2 = d_stop - d_stop % day_in_sec;
   int result = (int)((d_corect2 - d_corect1) / day_in_sec);
   printf("всего %i дней ", result);
}
//+------------------------------------------------------------------+
 
forex2030:

日付別

最初のポイントに、私はバーを追加します。

そして、これらの日付の間にあるバーの 数を数えます。

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
設定したバー数より少なくなる。設定した棒の本数と取得した棒の本数の差は、休みの日数です。このようにして、任意の期間、たとえ1分単位の期間であっても、バーの本数を求めることができる。ただ、この関数から返されるバーの本数をよく確認してください。外側の2本のバー、またはどちらか一方が考慮されます。正確には覚えていませんが、どちらも検討されているようです。
 
Alexey Viktorov:

そして、これらの日付の間にあるバーの 数を数えます。

与えられた棒の本数より少ない本数しかもらえない。与えられた棒グラフの数と受け取った棒グラフの数の差が、休みの日数です。このようにして、任意の期間、たとえ1分単位の期間であっても、バーの本数を求めることができる。ただ、この関数から返されるバーの本数をよく確認してください。外側の2本のバー、またはどちらか一方が考慮されます。正確には覚えていませんが、どちらも検討されているようです。

まだバーがない日付の話。

 

念のため、例として、何本のバーが欠けているかをカウントします。

input datetime d_start = D'2020.01.01 12:30:27';
input datetime d_stop  = D'2020.02.01';

//+------------------------------------------------------------------+
void OnStart()
{
   const int day_in_sec = 24 * 60 * 60;
   datetime d_corect1 = d_start - d_start % day_in_sec;
   datetime d_corect2 = d_stop - d_stop % day_in_sec;
   int result = (int)((d_corect2 - d_corect1) / day_in_sec);
   printf("всего %i дней ", result);
   datetime t_arr[];
   int allbarD1 = CopyTime(_Symbol, PERIOD_D1, d_start, d_stop, t_arr);
   if(allbarD1 < 0)
   {
      printf("Error CopyTime() func № %i", GetLastError());
      return;
   }
   printf("Всего выходных % i дней", result - allbarD1);
}
//+------------------------------------------------------------------+