Подсчёт баров с учётом выходных - страница 3

 
Igor Makanu:

сложно все, есть время между датами в секундах (datetime) - этого достаточно, чтобы посчитать количество целых дней в которых 24 часа, 60 минут в каждом часе и 60 секунд в минуте....гугл в помощь

если речь о извращенных способах подсчета, то можно так:

можно как Вы предлагаете, считать каждый бар и узнавать были между текущим и предыдущим баром выходные....в общем тут только желанием ограничены возможности усложнить задачу )))

Надо начать допуская, что интервалы времени начинаются и заканчиваются в 0:0. 

 
Dmitry Fedoseev:

Надо начать допуская, что интервалы времени начинаются и заканчиваются в 0:0. 

в моем примере это допущение не нужно, но нужно допущение, что расчет идет внутри одного календарного года

в первом сообщение было решение, как вариант - должно быть еще решение в топике Только полезные коды от КимИВ, кажется видел 

 
Igor Makanu:

в моем примере это допущение не нужно, но нужно допущение, что расчет идет внутри одного календарного года

в первом сообщение было решение, как вариант - должно быть еще решение в топике Только полезные коды от КимИВ, кажется видел 

Нужно же не просто дни посчитать, а рабочие или выходные.

 
Dmitry Fedoseev:

Нужно же не просто дни посчитать, а рабочие или выходные.

сложно сказать, не однозначная формулировка задачи:

forex2030:

как узнать сколько было выходных между точками например на D1 чтобы потом их прибавить к нужным барам?

если по Вашей формулировке, тогда копировать CopyTime() дневные бары и в цикле анализировать выходные, а что делать то с выходными? - пишет же, что прибавлять их хочет?
 
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 чтобы потом их прибавить к нужным барам?"

А зачем это надо - это другой вопрос.

думаю, что если мы еще пару часов пообщается, то начнем оценивать задачу, а сколько же выходных может быть между двумя барами.... а точно всегда есть соответствие, что перед понедельником идет воскресение?

)))))

вот с корректировкой расчет дней через вычитание 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        // по какую дату 
   );
Получаете меньше заданного. Разница заданного количества баров и полученного и есть количество выходных. Таким образом получим количество баров любого периода, хоть минутного. Только внимательно разберитесь сколько возвращает функция. Учитываются оба крайних бара или один. Я точно не помню, но кажется учитываются оба.
 
Alexey Viktorov:

Затем считаете количество баров между этими датами.

Получаете меньше заданного. Разница заданного количества баров и полученного и есть количество выходных. Таким образом получим количество баров любого периода, хоть минутного. Только внимательно разберитесь сколько возвращает функция. Учитываются оба крайних бара или один. Я точно не помню, но кажется учитываются оба.

Разговор о датах, по которым еще нет баров.

 

на всякий случай, дополню пример - посчитает сколько отсутствует баров

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