Marcos temporales personalizados en MQL5

 

Mql5 permite una gama completa de periodos temporales del gráfico: M1, M2 , M3, M4,... H1, H2,... hasta gráficos de mes; 21 marcos temporales en total (o Timeframes; TF en adelante). Pero en la práctica, cuando optimizamos, nos interesa detectar en qué plazo temporal se desarrolla mejor la estrategia: ¿en plazos muy cortos M1 o M5?; ¿en plazos medios H2, H4?; ¿o en plazos largos D1, W1?. No nos hace falta tanta variedad de opciones.

¿Cómo lo resuelvo?.

Defino la enumeración...

enum mi_MARCOTMP_CORTO
{
   _M1= PERIOD_M1,
   _M5= PERIOD_M5,
   _M15=PERIOD_M15,
//   _M20=PERIOD_M20,
   _M30=PERIOD_M30,
   _H1= PERIOD_H1,
   _H2= PERIOD_H2,
   _H4= PERIOD_H4,
//   _H8= PERIOD_H8,
   _D1= PERIOD_D1,
   _W1= PERIOD_W1,
   _MN1=PERIOD_MN1
};

 donde en cada momento introduzco o anulo los marcos que interesen. Para optimizar, al inicio del código defino la variable de entrada...

input mi_MARCOTMP_CORTO marcoTiempo    = _H1;

 que con la siguiente función...

//----------------------------------------- DEFINE MARCO TIEMPO ----------------------------------------------------------
ENUM_TIMEFRAMES defMarcoTiempo(mi_MARCOTMP_CORTO marco)
{
   ENUM_TIMEFRAMES resp= _Period;
   switch(marco)
   {
      case _M1: resp= PERIOD_M1; break;
      case _M5: resp= PERIOD_M5; break;
      case _M15: resp= PERIOD_M15; break;
      case _M30: resp= PERIOD_M30; break;
      case _H1: resp= PERIOD_H1; break;
      case _H2: resp= PERIOD_H2; break;
      case _H4: resp= PERIOD_H4; break;
      case _H8: resp= PERIOD_H8; break;
      case _D1: resp= PERIOD_D1; break;
      case _W1: resp= PERIOD_W1; break;
      case _MN1: resp= PERIOD_MN1;
   }
return(resp);
}
ENUM_TIMEFRAMES marcoTF= defMarcoTiempo(marcoTiempo);		//marcoTF definida como variable global

y usando marcoTF en el resto del código, puedo analizar los resultados del EA en diferentes TFs, porque en el cuadro de parámetros del optimizador puedo definir el intervalo de ejecución de la variable "marcoTiempo" que ahora estará ceñido a los pasos que me interesan, sin perder tiempo en analizar M2 o M6, por ejemplo.

Claro, que también se puede resolver con...

ENUM_TIMEFRAMES marcoTF= (ENUM_TIMEFRAMES)marcoTiempo;

 y en el resto del código usas "marcoTF" como variable del gráfico. Pero de esto te das cuenta cuando haces el n-simo repaso del código buscando su simplificación.