Discusión sobre el artículo "El comercio nocturno en la sesión asiática: cómo mantener los beneficios"

 

Artículo publicado El comercio nocturno en la sesión asiática: cómo mantener los beneficios:

En el artículo se analizan el concepto de comercio nocturno, sus estrategias comerciales y su implementación en MQL5. Se han realizado varias simulaciones y se han sacado las conclusiones pertinentes.

Vamos a tomar la popular pareja EUR/USD. Normalmente, durante la sesión asiática, comienza a disminuir su volatilidad y a moverse hacia el flat. La corrección en esta etapa puede ser tan insignificante, que se podría considerar movimiento horizontal.


Fig.2. Movimiento plano en la sesión Asiática, pareja EUR/USD

Fig.2. Movimiento plano en la sesión Asiática, pareja EUR/USD

Autor: Dmitriy Zabudskiy

 
//--- parámetros de entrada
input int      order_time=0;                        // Hora de apertura del pedido

El problema con ambos probadores es que no se puede optimizar datetime. De ahí esta fealdad forzada.

Deberíamos haber resuelto este problema hace mucho tiempo.


ZY OnTesterInit puede ayudar con datetime, pero no todos pueden.

 

Estaría bien que en el terminal se pudiera saber la hora del turno del broker al menos con respecto a GMT. Más concretamente, estaría escrito en el terminal para cada broker. Y en los resultados de las pruebas. Pero las pruebas se dan - ¿qué turno de tiempo hay? No se.

Solicitar TimeGMT() es bueno, pero no es suficiente. Y no da nada para considerar la prueba. Necesitamos exactamente el tiempo de cambio de broker en relación con GMT.

 
fxsaber:

El problema con ambos probadores es que no se puede optimizar datetime. De ahí esta fealdad forzada.

Debería haberse hecho algo al respecto hace mucho tiempo.

No es datetime lo que se quiere decir aquí -- ver:

if(time_now_str.hour==order_time && work==true && work_day==true)
Es que el autor tiene un problema con los nombres de las variables
 
ANG3110:

Estaría bien que en el terminal se pudiera saber la hora del turno del broker al menos con respecto a GMT. Más concretamente, estaría escrito en el terminal para cada broker. Y en los resultados de las pruebas. Pero las pruebas se dan - ¿qué turno de tiempo hay? No se.

Solicitar TimeGMT() es bueno, pero no es suficiente. Y no da nada para considerar la prueba. Lo que se necesita es el desplazamiento horario del broker con respecto a GMT.

Es fácil determinar TimeGMT en el modo de optimización en MT5, una sola ejecución - usted debe pensar en ello.

 
Andrey F. Zelinsky:

Esto no es datetime -- ver:

Es que el autor tiene un problema con los nombres de las variables

Me arrepiento, leí el artículo sólo hasta la línea citada. Pero el problema de datetime existe. El tiempo debe ser optimizado no sólo a través de MQL, sino también, humanamente hablando, a través de GUI.

 
fxsaber:

En el modo de optimización en MT5 no es difícil determinar TimeGMT, una sola ejecución - es necesario pensar en ello.

Pero ¿qué pasa si otra persona da los resultados de la prueba? No hay manera de determinarlo.
 
ANG3110:
¿Qué pasa si otras personas reciben los resultados de las pruebas? No hay forma de saberlo.

Sí, eso no se menciona en el informe. Es por eso que los informes personalizados son poderosos. Especialmente en MT5.

 

Tal vez en lugar de

//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   time_now_var=TimeCurrent(time_now_str);// hora actual

   switch(time_now_str.day_of_week)
     {
      case 1: if(mon==false){work_day=false;}
      else {work_day=true;}
      break;
      case 2: if(tue==false){work_day=false;}
      else {work_day=true;}
      break;
      case 3: if(wen==false){work_day=false;}
      else {work_day=true;}
      break;
      case 4: if(thu==false){work_day=false;}
      else {work_day=true;}
      break;
      case 5: if(fri==false){work_day=false;}
      else {work_day=true;}
      break;
     }

usar uno más simple

//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
  {
   time_now_var=TimeCurrent(time_now_str);// hora actual

   switch(time_now_str.day_of_week)
     {
      case 1: work_day=mon; break;
      case 2: work_day=tue; break;
      case 3: work_day=wen; break;
      case 4: work_day=thu; break;
      case 5: work_day=fri; break;
     }
...

Como se suele decir, no es nada personal, sólo un hábito estúpido - no puedo pasar de largo cuando veo un código ineficiente.
No he mirado más en el código.

 
Eugene Myzrov:

Tal vez en lugar de

usar uno más simple

Como se suele decir, no es nada personal, sólo un hábito estúpido - no puedo pasar de largo cuando veo un código ineficiente.
No he mirado más en el código.

Gracias por tu comentario. El hábito es bueno, yo también lo hago a veces.....

Tu ejemplo:

//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
  {
   time_now_var=TimeCurrent(time_now_str);// hora actual

   switch(time_now_str.day_of_week)
     {
      case 1: work_day=mon; break;
      case 2: work_day=tue; break;
      case 3: work_day=wen; break;
      case 4: work_day=thu; break;
      case 5: work_day=fri; break;
     }
...

Francamente no lo entiendo, hay que completarlo... Porque en las variables entrantes en el Asesor Experto, los días de la semana en los que necesitas trabajar están marcados como "true", y si no necesitas trabajar ese día, entonces "false".

Y la variable "día_trabajo" envía la respuesta como "verdadero" o "falso". En tu ejemplo, la variable pasa a ser de tipo "cadena", por lo que tendrás que volver a hacer una comparación.

Por lo tanto, estoy a favor de la optimización del código, aunque en este EA no era una prioridad.

Este código en particular se puede optimizar:

//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   time_now_var=TimeCurrent(time_now_str);// hora actual

   work_day=true;

   switch(time_now_str.day_of_week)
     {
      case 1: if(mon==false){work_day=false;}
      break;
      case 2: if(tue==false){work_day=false;}
      break;
      case 3: if(wen==false){work_day=false;}
      break;
      case 4: if(thu==false){work_day=false;}
      break;
      case 5: if(fri==false){work_day=false;}
      break;
     }

El tamaño del código se reducirá, pero la velocidad de trabajo no...

Tal vez usted puede implementar un bucle en la función, entonces el tamaño puede ser menor, pero la velocidad de procesamiento será más largo.

También puede trabajar y cambiar los parámetros de entrada, entonces usted puede cambiar el código, tal vez simplificarlo.

 
Dmitriy Zabudskiy: Gracias por el comentario. Es un buen hábito, yo también lo hago a veces.... Tu ejemplo:Sinceramente, no lo entiendo, hay que complementarlo.... Porque en las variables entrantes en el Asesor Experto, los días de la semana en los que necesitas trabajar están marcados como "true", y si no necesitas trabajar ese día, entonces "false". Y la variable "día_trabajo" envía la respuesta como "verdadero" o "falso". En tu ejemplo, la variable pasa a ser de tipo "cadena", por lo que tendrás que volver a hacer una comparación. Por lo tanto, estoy a favor de la optimización del código, aunque en este EA no era una prioridad. Este código en particular se puede optimizar. El tamaño del código se reducirá, pero la velocidad no... Tal vez usted puede implementar un bucle en la función, entonces el tamaño puede ser menor, pero la velocidad de procesamiento será más largo. Usted puede trabajar un poco más y de alguna manera cambiar los parámetros de entrada, entonces el código puede ser cambiado, tal vez simplificado.
   work_day=false;
   switch(time_now_str.day_of_week)
     {
      case 1: if (mon) work_day=true; break;
      case 2: if (tue) work_day=true; break;
      case 3: if (wen) work_day=true; break;
      case 4: if (thu) work_day=true; break;
      case 5: if (fri) work_day=true; break;
     }


Usted podría ofrecer un código de este tipo también. Pero eliminando los operadores "else", habrás simplificado el código fuente sólo a la mitad. La variante óptima se obtendrá si elimina también los operadores "if", dejando sólo 5 operadores de asignación. Esta será la variante óptima que se ha sugerido.

switch(time_now_str.day_of_week)
     {
      case 1: work_day=mon; break;
      case 2: work_day=tue; break;
      case 3: work_day=wen; break;
      case 4: work_day=thu; break;
      case 5: work_day=fri; break;
     default: work_day=false; // в субботу и воскресенье не торгуем...
     }

Pero no entiendo en absoluto lo de la variable que pasa a ser de tipo "cadena".