Barres de comptage, y compris les week-ends - page 3

 
Igor Makanu:

compliqué, il y a un temps entre les dates en secondes (datetime) - c'est suffisant pour calculer le nombre de jours entiers dans lesquels 24 heures, 60 minutes dans chaque heure et 60 secondes dans une minute.... google pour aider

Si nous parlons d'une manière tordue de compter, vous pouvez le faire de cette façon :

vous pouvez, comme vous le suggérez, compter chaque barre et savoir s'il y a eu un week-end entre la barre actuelle et la précédente.... en général ici, seule la possibilité de se compliquer la tâche est limitée par le désir ;)))

Nous devons commencer par supposer que les intervalles de temps commencent et se terminent à 0:0.

 
Dmitry Fedoseev:

Nous devons commencer par supposer que les intervalles de temps commencent et se terminent à 0:0.

dans mon exemple, cette hypothèse n'est pas nécessaire, mais nous devons supposer que le calcul se fait sur une année civile.

il y avait une solution dans le premier message, alternativement il devrait y avoir une autre solution dans le sujet Seulement des codes utiles de kimiw, je pense que j'ai vu

 
Igor Makanu:

dans mon exemple, cette hypothèse n'est pas nécessaire, mais nous devons supposer que le calcul se fait sur une année civile.

dans le premier message était la solution, comme une option - il devrait y avoir une autre solution dans le fil Seuls les codes utiles de KimIV, je pense que j'ai vu

Ce ne sont pas seulement les jours qui doivent être comptés, mais les jours ouvrables ou les week-ends.

 
Dmitry Fedoseev:

Ce ne sont pas seulement les jours qui doivent être comptés, mais aussi les jours de semaine ou les week-ends.

C'est difficile à dire, la formulation du problème est ambiguë :

forex2030:

comment savoir combien de week-ends il y avait entre les points, par exemple sur D1, et les ajouter ensuite aux barres requises ?

si selon votre formulation, alors copierCopyTime() les barres de jour et analyser les week-ends dans la boucle, mais que faire avec les week-ends ? - il dit qu'il veut les ajouter ?
 
Igor Makanu:

C'est difficile à dire, la formulation du problème est ambiguë :

...

Où se trouve l'ambiguïté : "comment savoir combien de sorties il y a eu entre les points sur par exemple D1 pour les ajouter aux barres requises ? "

La raison pour laquelle cela est nécessaire est une autre question.

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

Il semble avoir vérifié, tout va bien. Vérifiez si vous n'êtes pas trop paresseux.

 
Dmitry Fedoseev:

Où se trouve l'ambiguïté : " comment savoir combien de sorties il y a eu entre les points sur par exemple D1 pour pouvoir les ajouter aux barres que l'on veut ? ". "

Et pourquoi cela est nécessaire est une autre question.

Je pense que si nous discutons pendant quelques heures de plus, nous commencerons à évaluer le problème, et combien de sorties peuvent se trouver entre deux barres..... et il y a sûrement toujours une correspondance qu'avant le lundi vient le dimanche ?

)))))

en corrigeant le calcul des jours en soustrayant la date, je pense que ce code fonctionnera dans tous les cas.

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:

Par date

Au premier point, j'ajoute les barres

Puis comptez le nombre de barres entre ces dates.

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
Vous obtenez moins que le nombre de barres que vous avez fixé. La différence entre le nombre de barres que vous définissez et le nombre de barres que vous obtenez est le nombre de jours de congé. Ainsi, on obtient le nombre de barres de n'importe quelle période, même d'une période minute. Il suffit de vérifier attentivement combien de barres sont renvoyées par cette fonction. Les deux barres extérieures ou l'une d'entre elles seront prises en compte. Je ne me souviens pas exactement, mais il semble que les deux soient pris en compte.
 
Alexey Viktorov:

Puis comptez le nombre de barres entre ces dates.

Vous obtenez moins que le nombre donné de barres. La différence entre le nombre de barres donné et le nombre de barres reçu est le nombre de jours de congé. Ainsi, on obtient le nombre de barres de n'importe quelle période, même d'une période minute. Il suffit de vérifier attentivement combien de barres sont renvoyées par cette fonction. Les deux barres extérieures ou l'une d'entre elles seront prises en compte. Je ne me souviens pas exactement, mais il semble que les deux soient pris en compte.

Parlez des dates pour lesquelles il n'y a pas encore de barres.

 

juste au cas où, je vais ajouter un exemple - il compte combien de barres sont manquantes

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