Las sesiones de negociación o la importancia del tiempo - página 9

 

Aquí hay algunas funciones útiles para tratar la hora (puede determinar si el horario de verano o de invierno está en vigor para cualquier fecha).

#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.D. En Estados Unidos, antes de 2007, el cambio de horario era el mismo que en Europa. Utilice EUR cuando llame.

Si alguien quiere convertir esto en una biblioteca, dispuesto a ayudar (asia, australia).

Archivos adjuntos:
 

Hice las funciones DST para Europa y Estados Unidos también, devuelven true para el horario de verano y false para el horario de invierno. Están diseñados para trabajar con la hora del servidor, sólo para EE.UU. a 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.D. En Estados Unidos, antes de 2007, el cambio de horario era el mismo que en Europa. Utiliza EUR cuando se te llame.

Esto es sólo una verdad a medias, sólo el final coincidió.

 
kombat писал (а) >>

10:00 - Lanzamiento europeo

kombat, te equivocas. Europa abre a las 09:00 MSK (hora de verano)

 
Una pregunta para el mercado experimentado... ¿Tiene algún mes especialmente afortunado en el juego y viceversa? Por supuesto, depende de sus tácticas de negociación, por lo que la pregunta es demasiado abstracta. ¿Pero de una forma u otra?
 

Tal y como prometí, he "digerido" todo lo que he podido sobre las sesiones de negociación y el horario de verano. He hecho un archivo excel con el calendario del horario de verano y el cálculo de la hora de inicio y fin de la sesión.

La primera hoja es sólo un calendario de transición, sin fórmulas. Este calendario se utiliza para calcular las sesiones de la segunda hoja. En la segunda hoja, sólo puedes establecer tres parámetros: la fecha actual para la que quieres calcular todo, y dos zonas horarias: una para la zona horaria del servidor DC, y la otra para tu hora local (la que tienes en tu reloj de pulsera). Con ellos se calculan las tablas con las horas locales de los horarios de intercambio, y con ellas - las horas de inicio y fin (mínimo y máximo) de las sesiones de negociación.

Parece que funciona, pero yo (por costumbre) no puedo creer que todo se hizo sin errores. ¿Por qué? Por ejemplo, Australia y la sesión oceánica. Ellos están en el otro hemisferio y su horario de verano es en invierno, así que si nuestros meses son así LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL. En consecuencia, obtenemos fórmulas de cálculo diferentes: aquí buscamos el horario de verano, mientras que ellos tienen que buscar el horario de verano. En general hay algunas dificultades :(

Por esta razón, el archivo que he puesto en mi sitio y no publicado en el foro - como los errores se eliminan, voy a actualizar el archivo y el enlace del foro siempre será descargado versión fresca y correcta (voy a publicar las actualizaciones en este hilo). Puede descargar el archivo aquí: http: //forextools.com.ua/uploads/files/DST.zip

Se ve así:


Si alguien tiene alguna sugerencia constructiva, escriba una carta. No puedo prometer una aplicación rápida (debido a tiempo completo en el trabajo principal), pero cuando voy a tener tiempo - todo lo sensato y útil se hará ;)

 

ForexTools, ¡buen trabajo!

Pero no puedo entender qué quieres decir con eso. Explique más concretamente qué significa "aditivo" (sólo para estar seguros).

¿Y qué pasa con el servidor de TMZ y TMZ local? ¿Cuál es la diferencia entre la hora local y la hora del DC? ¿Tienes los números 2 y 3 bajo cada uno respectivamente? ¿Qué significa?

 

Simplemente hay dos cálculos de la hora exactamente iguales, sólo por comodidad, si la hora del terminal no coincide con la hora del ordenador local.

La adición es cuántas horas (teniendo en cuenta el horario de verano o de invierno) se añadirán a la hora UTC para convertir la hora UTC de la bolsa respectiva a la hora local de la zona horaria seleccionada. Este campo sólo es necesario para facilitar los cálculos en Excel.

Las reglas son muy simples: definimos (según el campo Regla) y la fecha de tiempo especificada. Se introduce en el campo Letn frente a la fecha calculada. A continuación, a la hora de trabajo de la bolsa según UTC, se le añade el número de horas TMZ (de la tabla superior) y se le añade la corrección Letn (si es horario de verano - entonces +1) y +TMZ del servidor de la casa de bolsa o TMZ local. Como resultado, la hora UTC se convierte a la hora local de la respectiva ZMT.

 
Erics писал (а) >>

Hay un estándar particular de tiempo en el mercado de divisas. Es la hora de Europa Central, CET.

Se trata de GMT (o UTC) +1 (+2 en verano).

En teoría, las velas diarias deberían empezar a medianoche CET en cualquier casa de bolsa.

Probablemente no sea el caso, pero la mayoría de las empresas de corretaje utilizan el tiempo CET.

Más adelante te enviaré un script que define el GMT, el horario de verano/invierno, las fechas de traducción en Europa y América en cualquier año (en América desde 2007, es decir, según las nuevas reglas).

Aclaración: si miro sólo el reloj del servidor (GMT+1), ¿la hora de inicio/fin de las sesiones será constante?

En el prgrama utilizo las restricciones horarias con el comando Hour(), es decir, compruebo la hora actual del servidor, y dentro o fuera.


Si hay una transición a las dos, digamos hacia atrás, entonces la vela de las horas no contiene doble volumen?

 
Parabellum писал (а) >>

Si hay una transición a las dos de la mañana, digamos, hacia atrás, ¿la vela de la una contiene un volumen doble?

La transición se produce siempre el domingo, cuando los servidores de negociación (los de MT, al menos) "no operan" y, por lo tanto, no hay volúmenes simples o dobles: sólo hay un hueco en el historial.

 
ForexTools писал (а) >>

La transición se produce siempre el domingo, cuando los servidores de negociación (los de MT, al menos) "no operan" y, por lo tanto, no hay volúmenes simples o dobles allí - sólo hay un agujero en el historial.

>> Ya veo, gracias.

¿Y la primera pregunta? No necesito saber la hora local. Mi reloj es el servidor de comercio. ¿Son constantes los horarios de las sesiones en este momento?

El programa tiene una restricción: si ( Hour()>t1 && Hout()<t2 ), entonces sigue adelante, de lo contrario cierra / duerme; aproximadamente. Sin ninguna corrección.

Razón de la queja: