Ayuda a un novato - Funciones de día y hora

 

Hola,

Soy un novato aquí, así que necesito algo de ayuda.

Tengo un EA que opera cuando el mercado abre los domingos. El problema con el EA es que también toma operaciones durante la semana y no quiero eso.

Quiero que funcione así:

extern int StartDay="domingo"

extern int StartTime="23:00"

extern int StopDay="lunes"

extern int StopTime="15:00"

Si day="sunday" y el mercado está abierto (sólo puede haber una operación abierta entre las 23:00 del domingo y las 15:00 del lunes, no hay nuevas operaciones si nuestra operación está cerrada por TP o SL)

{

Comienza la operación (un código que ya tengo)

}

¿Cómo puedo hacer esto en MQL?

 

comprobar Hora[0]

con esas funciones en la ayuda Funciones de fecha y hora

 
// SEE IF THIS WORK FOR YOU..... (I'VE NOT TESTED IT....)



int start()
{
  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())>=0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())<=1) && (Hour()<=15); 
  if( sunday_cond  || monday_cond )
      go_trading();

}
 
abstract_mind:
  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())>=0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())<=1) && (Hour()<=15); 
  if( sunday_cond  || monday_cond )

No estoy seguro de que esto sea correcto. El "sunday_cond" es verdadero cada día de la semana entre las 11pm y la medianoche. Por lo tanto, como el código hace sunday_cond o monday_cond, potencialmente operará después de las 11pm todos los días. Además, "monday_cond" se cumple los domingos hasta las 3pm. Es poco probable, pero en algunas zonas horarias eso también podría caer dentro del horario de negociación. Y lo que es más importante, Hour() <= 15 se cumple hasta las 15:59, no hasta las 15:00.


Pero el principio es obviamente sólido en términos de lo que EagleEye necesita hacer: comprobar la hora, y también el día de la semana usando DayOfWeek() o TimeDayOfWeek().

 
jjc:

No estoy seguro de que esto sea correcto. El "sunday_cond" es verdadero cada día de la semana entre las 11pm y la medianoche. Por lo tanto, como el código hace sunday_cond o monday_cond, potencialmente operará después de las 11pm todos los días. Además, "monday_cond" se cumple los domingos hasta las 3pm. Es poco probable, pero en algunas zonas horarias eso también podría caer dentro del horario de negociación. Y lo que es más importante, Hour() <= 15 se cumple hasta las 15:59, no hasta las 15:00.


Pero el principio es obviamente sólido en términos de lo que EagleEye necesita hacer: comprobar la hora, y también el día de la semana usando DayOfWeek() o TimeDayOfWeek().



Tienes razón. Esto debería funcionar:

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
go_trading();
 

Gracias, chicos,


Probaré esto y os haré saber si funciona.

 

only one trade can be open between sunday 23:00 and monday 15:00

El código anterior debería operar desde el domingo a las 23:00 hasta el lunes a las 15:59 (Hour()<=15), no a las 15:00 (Hour()<15)

También deberá tener un código para abrir sólo una operación durante el período permitido.

 
¿Qué tipo deben tener el sunday_cond y el monday_cond? ¿Int?
 

No estoy seguro de entender lo que quieres decir con esta parte WHRoeder : ¿Lunes 15:59 (Hour()<=15), no 15:00 (Hour()<15)?

Si u r derecho necesito ese código también. Espero que alguien pueda proporcionármelo.

 
EagleEye:

Sí, tienes razón, también necesito ese código. Espero que alguien pueda proporcionármelo.

Este es un problema un poco inusual porque no quieres tomar una nueva operación si ya has abierto una durante la ventana de negociación actual, incluso si la operación ya está cerrada. La mayoría de las discusiones en este foro sólo se refieren a la comprobación de que no hay una operación abierta en ese momento (y ese es un tema que surge a menudo).


En esencia, tiene tres opciones en cuanto a la comprobación de las operaciones cerradas:


  1. Al abrir una nueva operación, almacenar la hora actual en una variable. Al considerar la colocación de una nueva operación, comprobar que la hora almacenada de la última operación no cae dentro de la ventana de negociación actual.
  2. Como en el caso anterior, pero almacene la hora de la última operación en las variables globales de MT4.
  3. Examinar la lista de operaciones de MT4, buscando las operaciones cerradas que se abrieron durante la ventana de negociación actual.


Estas opciones están más o menos en orden de complejidad (y también en orden inverso de rendimiento, es decir, siendo la 3 la más lenta con diferencia, aunque cualquier diferencia de velocidad entre ellas es muy poco probable que plantee problemas en la vida real).


Sin embargo, las opciones también están en orden de resistencia:


  1. Si el tiempo de la última operación se almacena en una variable (en la memoria), entonces el valor se pierde si MT4 se reinicia o si su EA tiene que ser recargado por cualquier otra razón. En otras palabras, si el EA es recargado entonces potencialmente operará más de una vez durante la misma ventana de negociación.
  2. Si la hora se almacena en una variable global de MT4, entonces el registro de la misma debería sobrevivir a las recargas del EA. Sin embargo, si el comercio tiene que ser trasladado a toda prisa a un nuevo equipo, entonces el registro de la última hora de comercio se perderá (a menos que una copia de seguridad del archivo gvariables.dat de MT4 esté disponible).
  3. El escaneo de la lista de operaciones de MT4 es la única opción que es adecuadamente resistente en términos de recuperación de desastres: usted puede ingresar a la cuenta del corredor desde una copia de MT4 en otra computadora, iniciar el EA, y tener la garantía de no tomar operaciones adicionales incorrectas.


 

// Enfoque_1

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
if(OrdersTotal()==0)
go_trading();



// Enfoque_2

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
{
if(number_of_longs()==0) // Count the longs from both "trade context" and history for the period in qestion. There is code for counting open longs/shorts in the forum
go_trading_longs();
if(number_of_shorts()==0)
go_trading_shorts();

}