Bares de recuento incluidos los fines de semana - página 3

 
Igor Makanu:

complicado, hay un tiempo entre fechas en segundos (datetime) - esto es suficiente para calcular el número de días enteros en los que 24 horas, 60 minutos en cada hora y 60 segundos en un minuto.... google para ayudar

Si hablamos de una forma retorcida de contar, puedes hacerlo así:

puedes, como sugieres, contar cada barra y averiguar si hubo un fin de semana entre la barra actual y la anterior.... en general aquí sólo la posibilidad de complicar la tarea está limitada por el deseo ))))

Deberíamos empezar asumiendo que los intervalos de tiempo empiezan y terminan en 0:0.

 
Dmitry Fedoseev:

Tenemos que empezar asumiendo que los intervalos de tiempo empiezan y terminan en 0:0.

en mi ejemplo esta suposición no es necesaria, pero tenemos que suponer que el cálculo es dentro de un año natural

había una solución en el primer post, alternativamente debe haber otra solución en el tema Sólo los códigos útiles de kimiw, creo que he visto

 
Igor Makanu:

en mi ejemplo esta suposición no es necesaria, pero tenemos que suponer que el cálculo es dentro de un año natural

había una solución en el primer post, alternativamente debe haber otra solución en el tema Sólo los códigos útiles de KimIV, creo que he visto

No sólo hay que contar los días, sino los días laborables o los fines de semana.

 
Dmitry Fedoseev:

No sólo hay que contar los días, sino también los días de la semana o los fines de semana.

Es difícil de decir, la redacción del problema es ambigua:

forex2030:

¿cómo se sabe cuántos fines de semana hubo entre puntos, por ejemplo en D1, y luego se suman a las barras requeridas?

si de acuerdo con su redacción, entonces copiarCopyTime() barras de día y analizar las barras de fin de semana en el bucle, pero ¿qué hacer con las barras de fin de semana? - dice que quiere añadirlos?
 
Igor Makanu:

Es difícil de decir, la redacción del problema es ambigua:

...

¿Dónde está la ambigüedad: "cómo se averigua cuántas salidas hubo entre los puntos de, por ejemplo, D1 para añadirlas a las barras necesarias? "

El porqué de esta necesidad es otra cuestión.

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

Parece que lo han comprobado, parece que está bien. Comprueba si no eres demasiado vago.

 
Dmitry Fedoseev:

¿Dónde está la ambigüedad: " cómo se averigua cuántas salidas hubo entre los puntos de, por ejemplo, D1, para poder sumarlas a las barras que se deseen? "

Y por qué es necesario esto es otra cuestión.

Creo que si charlamos un par de horas más, empezaremos a evaluar el problema, y cuántas salidas puede haber entre dos bares.... y seguramente siempre hay una correspondencia que antes del lunes viene el domingo.

)))))

con la corrección del cálculo de los días restando la fecha, creo que este código funcionará para todos los casos

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:

Por fecha

Al primer punto añado barras

A continuación, cuente el número de barras entre estas fechas.

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
Obtienes menos del número de barras que has establecido. La diferencia entre el número de compases que fijas y el número de compases que obtienes es el número de días de descanso. De este modo, obtenemos el número de barras de cualquier periodo, incluso de un periodo de un minuto. Sólo hay que comprobar cuidadosamente cuántas barras devuelve esta función. Se considerarán las dos barras exteriores o una de ellas. No lo recuerdo con exactitud, pero parece que ambos son considerados.
 
Alexey Viktorov:

A continuación, cuente el número de barras entre estas fechas.

Obtienes menos del número de barras dado. La diferencia entre el número de barras dado y el número de barras recibido es el número de días libres. De este modo, obtenemos el número de barras de cualquier período, incluso de un período de un minuto. Sólo hay que comprobar cuidadosamente cuántas barras devuelve esta función. Se considerarán las dos barras exteriores o una de ellas. No lo recuerdo con exactitud, pero parece que ambos son considerados.

Habla de las fechas para las que aún no hay bares.

 

por si acaso, añadiré un ejemplo - cuenta cuántas barras faltan

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