Contagem de barras, incluindo fins de semana - página 3

 
Igor Makanu:

complicado, há um tempo entre datas em segundos (datetime) - isso é suficiente para calcular o número de dias inteiros em que 24 horas, 60 minutos em cada hora e 60 segundos em um minuto.... google para ajudar

Se estamos falando de uma forma distorcida de contar, você pode fazê-lo desta forma:

você pode, como você sugere, contar cada barra e descobrir se houve um fim de semana entre a barra atual e a anterior em geral aqui apenas a possibilidade de complicar a tarefa é limitada pelo desejo ))))

Devemos começar assumindo que os intervalos de tempo começam e terminam às 0:0.

 
Dmitry Fedoseev:

Temos que começar assumindo que os intervalos de tempo começam e terminam às 0:0.

em meu exemplo esta suposição não é necessária, mas precisamos assumir que o cálculo está dentro de um ano civil

havia uma solução no primeiro post, alternativamente deveria haver outra solução no tópico Apenas códigos úteis do kimiw, acho que já vi

 
Igor Makanu:

em meu exemplo esta suposição não é necessária, mas precisamos assumir que o cálculo está dentro de um ano civil

houve uma solução no primeiro post, alternativamente deveria haver outra solução no tópico Somente códigos úteis da KimIV, acho que vi

Não são apenas os dias que precisam ser contados, mas os dias úteis ou fins de semana.

 
Dmitry Fedoseev:

Não são apenas os dias que precisam ser contados, mas os dias de semana ou fins de semana.

É difícil dizer, o texto do problema é ambíguo:

forex2030:

como você sabe quantos fins de semana houve entre os pontos, por exemplo, em D1, e depois adicioná-los às barras necessárias?

se de acordo com seu texto, então copieCopyTime() day bars e analise os fins de semana no loop, mas o que fazer com os fins de semana? - diz que quer adicioná-los?
 
Igor Makanu:

É difícil dizer, o texto do problema é ambíguo:

...

Onde está a ambiguidade: "Como você sabe quantas saídas havia entre os pontos em, por exemplo, D1 para adicioná-las às barras necessárias? "

Por que isto é necessário é outra questão.

 
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 ter verificado, parece estar tudo bem. Verifique se você não é muito preguiçoso.

 
Dmitry Fedoseev:

Onde está a ambiguidade: " como você descobre quantas saídas havia entre os pontos em, por exemplo, D1 para que você possa adicioná-las às barras que você quer? "

E por que isto é necessário é outra questão.

Penso que se conversarmos por mais algumas horas, começaremos a avaliar o problema, e quantas saídas podem estar entre duas barras.... e certamente há sempre uma correspondência que antes de segunda-feira chega domingo...

)))))

com a correção do cálculo dos dias, subtraindo a data/hora , acho que este código funcionará para todos os 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 data

Ao primeiro ponto eu acrescento barras

Em seguida, conte o número de barras entre essas datas.

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
Você recebe menos do que o número de barras que você estabelece. A diferença entre o número de barras que você fixa e o número de barras que você recebe é o número de dias de folga. Assim, obtemos o número de barras de qualquer período, mesmo de um período de um minuto. Basta verificar cuidadosamente quantas barras são devolvidas por esta função. Ou as duas barras externas ou uma delas será considerada. Não me lembro exatamente, mas parece que ambos são considerados.
 
Alexey Viktorov:

Em seguida, conte o número de barras entre essas datas.

Você recebe menos do que o número dado de barras. A diferença entre o número dado de barras e o número recebido de barras é o número de dias de folga. Assim, obtemos o número de barras de qualquer período, mesmo de um período de um minuto. Basta verificar cuidadosamente quantas barras são devolvidas por esta função. Ou as duas barras externas ou uma delas será considerada. Não me lembro exatamente, mas parece que ambos são considerados.

Fale sobre as datas para as quais ainda não há barras.

 

só para o caso de, vou acrescentar um exemplo - conta quantas barras estão faltando

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