Les sessions de négociation ou l'importance du temps - page 9

 

Voici quelques fonctions utiles pour gérer l'heure (vous pouvez déterminer si l'heure d'été ou d'hiver est en vigueur pour une date donnée).

#property copyright "Erics"
#property link      "erics.fx@tut.by"

#define EUR 0
#define USA 1

//+------------------------------------------------------------------+
//| скрипт, демонстрирующий использование некоторых функций времени  |
//+------------------------------------------------------------------+

void start()
{
  int tl = TimeLocal();
  MessageBox("Сейчас: " + TimeToStr(tl) + ", летнее время = " + getDST(EUR, tl) +
             "\n\n20.03.2008 0:00, летнее время в Европе  = " + getDST(EUR, MTtime(DateSerial(2008,3,20))) +
             "\n20.03.2008 0:00, летнее время в Америке = " + getDST(USA, MTtime(DateSerial(2008,3,20))) +
             "\n\n1.04.2008 0:00, летнее время в Европе  = " + getDST(EUR, MTtime(DateSerial(2008,4,1))) +
             "\n1.04.2008 0:00, летнее время в Америке = " + getDST(USA, MTtime(DateSerial(2008,4,1))));
}

int MTtime(double serialTime)
{ // переводит дату/время, заданную в днях от 1900 года (Windows)
  // в дату, заданную в секундах от 1970 года (Unix)
  return(86400.*(serialTime - 25569.));
}

int DateSerial(int yyyy, int mm, int dd)
{ // возвращает дату в формате Windows (от 1.01.1900 г.)
  yyyy -= 1900; mm++;
  if (mm < 4) { mm += 12; yyyy--; }
  int res = MathFloor(365.25*yyyy) + MathFloor(30.6*mm) + dd - 62;
  return(res);
}

int getDST(int country, int time)
{ // Daylight Saving Time - возвращает 1, если на время time действует летнее время и 0 - если поясное (зимнее) время
  int DSTstarts, DSTends, y, yr = TimeYear(time);

  switch(country)
  {
    case EUR:
      // летнее время в Европе и России начинается в последнее восресенье марта, в 2 часа ночи
      y = MathFloor(1.25 * yr + 4.);
      DSTstarts = MTtime(DateSerial(yr, 3, 31 - y % 7) + 2./24.);
      // летнее время в Европе и России заканчивается в последнее восресенье октября, в 3 часа ночи
      y = MathFloor(1.25 * yr + 1.);
      DSTends   = MTtime(DateSerial(yr,10, 31 - y % 7) + 3./24.);
      break;

    case USA:
      // летнее время в США и Канаде с 2007 г. начинается во второе восресенье марта, в 3 часа ночи
      y = MathFloor(1.25 * yr + 1.);
      DSTstarts = MTtime(DateSerial(yr, 3, 14 - y % 7) + 3./24.);
      // летнее время в США и Канаде с 2007 г. заканчивается в первое восресенье ноября, в 3 часа ночи
      DSTends   = MTtime(DateSerial(yr,11, 7 - y % 7) + 3./24.);
      break;
  }  
  if (time>=DSTstarts && time<=DSTends) return(1); else return(0);
}

P.S. En Amérique, avant 2007, le passage à l'heure d'été était identique à celui de l'Europe. Utilisez EUR lorsque vous appelez.

Si quelqu'un peut convertir ceci en bibliothèque, je suis prêt à aider (Asie, Australie).

Dossiers :
 

J'ai également créé des fonctions DST pour l'Europe et les États-Unis, qui renvoient true pour l'heure d'été et false pour l'heure d'hiver. Ils sont conçus pour fonctionner avec l'heure du serveur, pour les États-Unis uniquement à partir de 2007.

//+------------------------------------------------------------------+
bool DST_EU(int CurrentTime) {
  int CurMonth = TimeMonth(CurrentTime);
  int CurDayOfWeek; 
  int CurDay; 
  if (CurMonth > 3  &&  CurMonth < 10) return(true);
  else { 
    if (CurMonth < 3  ||  CurMonth > 10) return(false);
    else {
      CurDayOfWeek = TimeDayOfWeek(CurrentTime); 
      CurDay = TimeDay(CurrentTime); 
      switch (CurMonth) {
        case  3: if (CurDay-CurDayOfWeek > 24) return(true);
                 else return(false);
                 break;
        case 10: if (CurDay-CurDayOfWeek < 25) return(true);
                 else return(false);
                 break;
      }
    }
  }
}
//+------------------------------------------------------------------+
bool DST_US(int CurrentTime) {
  int CurMonth = TimeMonth(CurrentTime);
  int CurDayOfWeek; 
  int CurDay; 
  if (CurMonth > 3  &&  CurMonth < 11) return(true);
  else { 
    if (CurMonth < 3  ||  CurMonth > 11) return(false);
    else {
      CurDayOfWeek = TimeDayOfWeek(CurrentTime); 
      CurDay = TimeDay(CurrentTime); 
      switch (CurMonth) {
        case  3: if (CurDay-CurDayOfWeek > 7) return(true);
                 else return(false); 
                 break;
        case 11: if (CurDay-CurDayOfWeek < 1) return(true);
                 else return(false); 
                 break;
      }
    }
  }
}


Erics писал (а) >>

P.S. En Amérique, avant 2007, le passage à l'heure d'été était le même qu'en Europe. Utilisez EUR lorsque vous êtes appelé.

Ce n'est qu'à moitié vrai, seule la fin correspond.

 
kombat писал (а) >>

10:00 - Lancement européen

Kombat, vous vous trompez. L'Europe ouvre à 09:00 MSK (heure d'été)

 
Une question pour le marché chevronné... Avez-vous des mois particulièrement chanceux dans le jeu et vice-versa ? Bien sûr, cela dépend de votre tactique de négociation, la question est donc trop abstraite. Mais d'une manière ou d'une autre ?
 

Comme promis, j'ai "digéré" tout ce que je pouvais concernant les sessions de négociation et l'heure d'été. J'ai créé un fichier excel avec le calendrier de l'heure d'été et le calcul de l'heure de début et de fin de session.

La première feuille est juste un calendrier de transition, sans formules. Ce calendrier est utilisé pour calculer les sessions de la deuxième feuille. Sur la deuxième feuille, vous ne pouvez définir que trois paramètres : la date du jour pour laquelle vous voulez tout calculer, et deux fuseaux horaires : l'un pour le fuseau horaire du serveur DC, et l'autre pour votre heure locale (que vous avez sur votre montre-bracelet). Grâce à eux, vous calculez des tableaux avec les heures locales des heures d'échange, et par eux - les heures du début et de la fin (minimum et maximum) des sessions de trading.

Cela semble fonctionner, mais je n'arrive pas à croire (par habitude) que tout s'est fait sans erreur. Pourquoi ? Par exemple, l'Australie et la session sur l'océan. Ils sont dans l'autre hémisphère et leur heure d'été est en hiver, donc si nos mois sont comme ça : LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL. En conséquence, nous obtenons des formules de calcul différentes : ici, nous cherchons l'heure d'été, alors qu'ils doivent chercher l'heure d'hiver. En général, il y a quelques difficultés :(

Pour cette raison, le fichier que j'ai posé sur mon site et non posté sur le forum - au fur et à mesure que les erreurs sont éliminées, je mettrai à jour le fichier et le lien du forum sera toujours téléchargé la version fraîche et correcte (je posterai les mises à jour dans ce fil). Vous pouvez télécharger le fichier ici : http://forextools.com.ua/uploads/files/DST.zip

Ça ressemble à ça :


Si vous avez des suggestions constructives, écrivez-nous. Je ne peux pas promettre une mise en œuvre rapide (en raison du travail à plein temps sur le travail principal), mais quand j'aurai le temps - tout ce qui est raisonnable et utile sera fait ;)

 

ForexTools, bon travail !

Mais je n'arrive pas à comprendre ce que tu veux dire par là. Expliquez plus précisément ce que signifie "additif" (juste pour que ce soit clair).

Et qu'en est-il du serveur TMZ et du TMZ local ? Quelle est la différence entre l'heure locale et l'heure du DC ? Vous avez les numéros 2 et 3 sous chaque respectivement ? Qu'est-ce que cela signifie ?

 

Il y a simplement deux calculs d'heure exactement identiques, par commodité - si l'heure du terminal ne correspond pas à celle de l'ordinateur local.

L'ajout est le nombre d'heures (en tenant compte de l'heure d'été ou d'hiver) qui seront ajoutées à l'heure UTC pour convertir l'heure UTC de la bourse respective en heure locale du fuseau horaire sélectionné. Ce champ est uniquement nécessaire pour faciliter les calculs dans excel.

Les règles sont très simples : nous définissons (en fonction du champ Règle) et la date et l'heure spécifiées. Elle est saisie dans le champ Letn en face de la date calculée. Ensuite, au temps de travail de l'échange selon UTC, ajoutez le nombre d'heures TMZ (du tableau supérieur) et ajoutez-y la correction Letn (si c'est l'heure d'été - alors +1) et +TMZ du serveur de la maison de courtage ou TMZ local. En conséquence, l'heure UTC est convertie en heure locale de la TMZ respective.

 
Erics писал (а) >>

Il existe une norme de temps particulière dans le domaine du forex. Il s'agit de l'heure d'Europe centrale, CET.

Il s'agit de GMT (ou UTC) +1 (+2 en été).

En théorie, les bougies quotidiennes devraient commencer à minuit CET dans n'importe quelle maison de courtage.

Ce n'est probablement pas le cas, mais la plupart des sociétés de courtage utilisent le temps CET.

Je vous enverrai plus tard un script qui définit l'heure GMT, l'heure d'été/d'hiver, les dates de traduction en Europe et en Amérique pour n'importe quelle année (en Amérique depuis 2007, c'est-à-dire selon les nouvelles règles).

Clarifiez : si je regarde uniquement l'horloge du serveur (GMT+1), l'heure de début/fin des sessions sera-t-elle constante ?

Dans le prgramme, j'utilise les restrictions horaires avec la commande Hour(), c'est-à-dire que je vérifie l'heure actuelle du serveur, et l'entrée ou la sortie.


S'il y a une transition à deux heures, disons vers l'arrière, alors la bougie des heures ne contient pas le double volume ?

 
Parabellum писал (а) >>

S'il y a une transition à deux heures du matin, disons à l'envers, la bougie d'une heure contient-elle un double volume ?

La transition se fait toujours le dimanche, lorsque les serveurs de négociation (les serveurs MT en tout cas) ne sont pas en train de négocier et il n'y a donc pas de volumes simples ou doubles - il y a juste un trou dans l'historique.

 
ForexTools писал (а) >>

La transition se fait toujours le dimanche, lorsque les serveurs de négociation (ceux de MT en tout cas) sont "non négociés" et il n'y a donc pas de volumes simples ou doubles - il y a juste un trou dans l'historique.

>> Je vois, merci.

Et la première question ? Je n'ai pas besoin de connaître l'heure locale. Mon horloge est le serveur de négociation. Les heures d'ouverture des sessions sont-elles constantes à ce jour ?

Le programme a une restriction : si ( Hour()>t1 && Hout()<t2 ), alors allez-y, sinon fermez / dormez ; en gros. Sans aucune correction.

Raison: