Hafta sonları dahil barların hesaplanması - sayfa 3

 
Igor Makanu :

her şey karmaşık, tarihler arasında saniye cinsinden zaman var (tarih saat) - bu, 24 saat, her saatte 60 dakika ve bir dakikada 60 saniye olan tam günlerin sayısını hesaplamak için yeterlidir .... google to the kurtarmak

Sapık sayma yöntemlerinden bahsediyorsak, bunu yapabilirsiniz:

önerdiğiniz gibi, her çubuğu saymak ve mevcut ve önceki çubuk arasında hafta sonları olduğunu bulmak mümkündür .... genel olarak, görevi karmaşıklaştırma olasılıkları yalnızca arzu ile sınırlıdır)))

Zaman aralıklarının 0:0'da başlayıp bittiğini varsayarak başlamalıyız.

 
Dmitry Fedoseev :

Zaman aralıklarının 0:0'da başlayıp bittiğini varsayarak başlamalıyız.

Örneğimde, bu varsayım gerekli değildir, ancak hesaplamanın bir takvim yılı içinde gerçekleştiği varsayımına ihtiyaç vardır.

ilk mesajda seçenek olarak bir çözüm vardı - konuda başka bir çözüm olmalı Sadece KimIV'ten faydalı kodlar gördüm sanırım

 
Igor Makanu :

Örneğimde, bu varsayım gerekli değildir, ancak hesaplamanın bir takvim yılı içinde gerçekleştiği varsayımına ihtiyaç vardır.

ilk mesajda seçenek olarak bir çözüm vardı - konuda başka bir çözüm olmalı Sadece KimIV'ten faydalı kodlar gördüm sanırım

Sadece günleri değil, iş günlerini veya hafta sonlarını da saymak gerekir.

 
Dmitry Fedoseev :

Sadece günleri değil, iş günlerini veya hafta sonlarını da saymak gerekir.

söylemesi zor, sorunun belirsiz formülasyonu:

forex2030 :

örneğin D1'de noktalar arasında kaç hafta sonu olduğunu nasıl öğrenebilirim, böylece daha sonra gerekli çubuklara eklenebilirler?

ifadenize göre, CopyTime() günlük çubukları kopyalayın ve hafta sonlarını bir döngüde analiz edin, ancak hafta sonları ile ne yapmalı? - onları eklemek istediğini yazıyor?
 
Igor Makanu :

söylemesi zor, sorunun belirsiz formülasyonu:

...

Belirsizlik nerede: " noktalar arasında, örneğin D1'de kaç gün izin olduğunu nasıl öğrenebilirim , böylece daha sonra gerekli çubuklara eklenebilirler? "

Bunun neden gerekli olduğu başka bir soru.

 
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 ];
}

Kontrol ettim, iyi görünüyor. Kimin tembel olmadığını kontrol edin.

 
Dmitry Fedoseev :

Belirsizlik nerede: " noktalar arasında, örneğin D1'de kaç gün izin olduğunu nasıl öğrenebilirim , böylece daha sonra gerekli çubuklara eklenebilirler? "

Bunun neden gerekli olduğu başka bir soru.

Sanırım birkaç saat daha konuşursak, işi değerlendirmeye başlayacağız ve iki bar arasında kaç gün izin olabilir... ama her zaman pazartesiden önce bir Pazar olduğuna dair bir yazışma var mı?

))))))

burada, ayarlamayla, datetime çıkarılarak günlerin hesaplanmasıyla, bu kodun her durumda işe yarayacağını düşünüyorum.

 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 :

Tarihe göre

İlk noktaya çubuklar ekliyorum

Ardından bu tarihler arasındaki çubuk sayısını sayın.

 int    Bars ( 
   string            symbol_name,     // имя символа 
   ENUM_TIMEFRAMES   timeframe,       // период 
   datetime          start_time,       // с какой даты 
   datetime          stop_time         // по какую дату 
   );
Size verilenden daha azını alırsınız. Verilen çubuk sayısı ile alınan çubuk arasındaki fark, izin günlerinin sayısıdır. Böylece herhangi bir periyodun, hatta bir dakikanın çubuk sayısını elde ederiz. Sadece fonksiyonun ne kadar geri döndüğünü dikkatlice hesaplayın. Hem aşırı çubuklar hem de biri dikkate alınır. Tam olarak hatırlamıyorum ama ikisi de sayılır.
 
Alexey Viktorov :

Ardından bu tarihler arasındaki çubuk sayısını sayın.

Size verilenden daha azını alırsınız. Verilen çubuk sayısı ile alınan çubuk arasındaki fark, izin günlerinin sayısıdır. Böylece herhangi bir periyodun, hatta bir dakikanın çubuk sayısını elde ederiz. Sadece fonksiyonun ne kadar geri döndüğünü dikkatlice hesaplayın. Hem aşırı çubuklar hem de biri dikkate alınır. Tam olarak hatırlamıyorum ama ikisi de sayılır.

Henüz bar olmayan tarihler hakkında konuşun.

 

her ihtimale karşı bir örnek ekleyeceğim - kaç tane çubuğun eksik olduğunu hesaplayacak

 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);
}
//+------------------------------------------------------------------+