Barre di conteggio compresi i fine settimana - pagina 3

 
Igor Makanu:

complicato, c'è un tempo tra le date in secondi (datetime) - questo è sufficiente per calcolare il numero di giorni interi in cui 24 ore, 60 minuti in ogni ora e 60 secondi in un minuto.... google per aiutare

Se parliamo di un modo contorto di contare, si può fare così:

si può, come suggerisci, contare ogni barra e scoprire se c'è stato un fine settimana tra la barra attuale e la precedente.... in generale qui solo la possibilità di complicare il compito è limitata dal desiderio )))

Dovremmo iniziare assumendo che gli intervalli di tempo iniziano e finiscono a 0:0.

 
Dmitry Fedoseev:

Dobbiamo iniziare assumendo che gli intervalli di tempo iniziano e finiscono a 0:0.

nel mio esempio questa assunzione non è necessaria, ma dobbiamo assumere che il calcolo sia entro un anno civile

c'era una soluzione nel primo post, in alternativa dovrebbe esserci un'altra soluzione nel topic Solo codici utili da kimiw, credo di aver visto

 
Igor Makanu:

nel mio esempio questa assunzione non è necessaria, ma dobbiamo assumere che il calcolo sia entro un anno civile

nel primo post era la soluzione, come opzione - ci dovrebbe essere un'altra soluzione nel thread Solo codici utili da KimIV, credo di aver visto

Non bisogna contare solo i giorni, ma anche i giorni lavorativi o i fine settimana.

 
Dmitry Fedoseev:

Non bisogna contare solo i giorni, ma anche i giorni della settimana o i fine settimana.

È difficile da dire, la formulazione del problema è ambigua:

forex2030:

come si fa a sapere quanti fine settimana c'erano tra i punti, per esempio su D1, e poi aggiungerli alle barre richieste?

se secondo la vostra formulazione, allora copiateCopyTime() le barre del giorno e analizzate le barre del fine settimana nel ciclo, ma cosa fare con le barre del fine settimana? - dice che vuole aggiungerli?
 
Igor Makanu:

È difficile da dire, la formulazione del problema è ambigua:

...

Dov'è l'ambiguità: "come si fa a sapere quante uscite ci sono state tra i punti adesempio su D1 in modo da poterle poi aggiungere alle barre richieste?"

Perché questo è necessario è un'altra domanda.

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

Sembra aver controllato, sembra a posto. Controlla se non sei troppo pigro.

 
Dmitry Fedoseev:

Dov'è l'ambiguità: " come fai a sapere quante uscite ci sono state tra i punti su D1, per esempio, in modo da poterle aggiungere alle barre che vuoi? "

E perché questo sia necessario è un'altra questione.

Penso che se chiacchieriamo ancora per un paio d'ore, cominceremo a valutare il problema, e quante uscite possono esserci tra due barre.... e sicuramente c'è sempre una corrispondenza che prima del lunedì arriva la domenica?

)))))

con la correzione del calcolo dei giorni sottraendo il datetime, penso che questo codice funzionerà per tutti i casi

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:

Per data

Al primo punto aggiungo delle barre

Poi conta il numero di barre tra queste date.

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
Ottieni meno del numero di barre che hai impostato. La differenza tra il numero di barre impostate e il numero di barre ottenute è il numero di giorni di riposo. Così, otteniamo il numero di barre di qualsiasi periodo, anche di un minuto. Basta controllare attentamente quante barre vengono restituite da questa funzione. Saranno considerate le due barre esterne o una di esse. Non ricordo esattamente, ma sembra che entrambi siano considerati.
 
Alexey Viktorov:

Poi conta il numero di barre tra queste date.

Si ottiene meno del numero dato di barre. La differenza tra il numero di barre dato e il numero di barre ricevuto è il numero di giorni di riposo. Così, otteniamo il numero di barre di qualsiasi periodo, anche di un minuto. Basta controllare attentamente quante barre vengono restituite da questa funzione. Saranno considerate le due barre esterne o una di esse. Non ricordo esattamente, ma sembra che entrambi siano considerati.

Parla delle date per le quali non ci sono ancora barre.

 

Per sicurezza, aggiungo un esempio - conta quante barre mancano

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