Visualización simultánea de señales de varios indicadores de los cuatro periodos de tiempo

Pavel Chigirev | 11 mayo, 2016


Introducción

Durante el trading manual, podemos vigilar los valores de varios indicadores. Es algo distinto al trading mecánico. Si tenemos dos o tres indicadores y hemos elegido un periodo de tiempo para el trading, no es una tarea complicada. Pero ¿qué ocurre si tenemos cinco o seis indicadores y nuestra estrategia de trading requiere tener en cuenta las señales de varios periodos de tiempo? Además, ¿qué ocurrirá si operamos simultáneamente con varios pares de divisas? La tarea parece lo suficientemente complicada y en la mayoría de casos lleva a errores y, por tanto, a pérdidas.


Real_Time_MultiIndicator_v1 está creado especialmente para resolver estas tareas. Este indicador calcula las señales de los indicadores elegidos en los cuatro periodos de tiempo simultáneamente y los convierte en una tabla en la subventana del gráfico principal. En los paréntesis tras la señal del indicador podemos ver el número de las últimas barras que pertenecen al periodo de tiempo elegido, que muestra la señal.

Podemos cambiar los parámetros de los indicadores y añadir los nuestros propios. Ahora, para tomar una decisión solo tenemos que echar un vistazo a la tabla donde se recogen las señales de los cuatro periodos de tiempo.



Real_Time_MultiIndicator_v1

El indicador muestra los datos en la subventana separada del gráfico. Esta es la vista exterior del indicador:


En la columna INDICATOR podemos ver los nombres de los indicadores usados, en los paréntesis están sus parámetros. En las columnas M15, M30, H1 y H4 se muestran las señales de los indicadores de los correspondientes periodos de tiempo. El número de barras que muestran la señal también se indica. Si se están cargando o no existen los datos históricos, veremos el mensaje de datos Waiting... para el periodo de tiempo correspondiente. Si el terminal está conectado a internet, se cargarán los datos necesarios en unos segundos.

Por favor, observe que el precio medio (High+Low)/2 se usa para todos los indicadores. Puede ser distinto a los valores por defecto. Si adjuntamos el indicador del gráfico o si cambiamos el zoom en el gráfico principal, puede ampliarse o reducirse la tabla. No se confunda. La tabla adoptará un aspecto normal después de la llegada de un nuevo tick. Si el terminal no está conectado a internet, haga lo siguiente después de hacer zoom en el gráfico: cambie el periodo de tiempo, como por ejemplo de H1 a H4 y viceversa, y la tabla adoptará un aspecto normal.

Para usar el indicador tenemos que descargar el archivo Real_Time_MultiIndicator_v1.mq4 en la carpeta \ con terminal\experts\indicators y reiniciar el terminal. Para adjuntar el indicador elija la sección "Indicadores del usuario" en el "Navegador", y luego vaya a Real_Time_MultiIndicator_v1. Luego en el menú


Puede elegir el color de la tabla (TColor), el color del texto (TxtColor) y también los parámetros de los indicadores que se están usando. Si quiere cambiar los parámetros de los indicadores, tiene que hacer lo siguiente: hacer clic con el botón derecho del ratón sobre el gráfico principal y elegir el comando "Lista de indicadores" o usar las teclas Ctrl+l,


luego elegir Real_Time_MultiIndicator_v1 y hacer clic en el botón "Propiedades". El cambio de los parámetros de los indicadores no es muy difícil, aunque añadir un nuevo indicador requerirá algo de esfuerzo y conocimientos de MQL4 a nivel de iniciación.



Añadir un nuevo indicador en la tabla

No he rellenado las últimas tres líneas de la tabla del indicador para que pueda añadir los indicadores que utilice o los que ha escrito usted mismo. He intentado realizar el algoritmo de cálculo y la conversión de los datos en la tabla de la forma más sencilla posible. Además, he dejado las partes del código con los comentarios en el programa fuente para que cualquier que conozca MQL4 a nivel de iniciación pueda añadir los indicadores en la tabla sin profundizar en los detalles del funcionamiento del algoritmo.

Usando el ejemplo del indicador Commodity Channel Index, le mostraré el algoritmo para añadir un nuevo indicador a la tabla. Por favor, observe que interpretaré las señales de este indicador de la forma siguiente: el valor del indicador 0 - la señala para comprar y viceversa. Esta interpretación es algo distinta a la clásica, pero lo hago a propósito para hacer que la explicación del algoritmo sea más sencilla. Además, puede interpretar las señales según sus preferencias.

Elija la sección "Indicadores del usuario" en el "Navegador", y luego vaya a Real_Time_MultiIndicator_v1 y haga clic en el botón "Cambio".


Luego haremos los cambios en el código fuente:

//----The parameters of the indicators
extern string p1 = "SAR parameters";
extern double SAR_Step = 0.01;
extern double SAR_Max = 0.1;
extern string p2 = "MACD parameters";
extern int Fast_EMA = 12;
extern int Slow_EMA = 26;
extern int MACD_SMA = 9;
extern string p3 = "Moving Average parameters";
extern int Fast_MA = 5;
extern int Slow_MA = 10;
extern string p4 = "ADX parameters";
extern int ADX_Period = 14;
//extern string p5 = "The parameters of the indicator 1";
//extern string p6 = "The parameters of the indicator 2";
//extern string p7 = "The parameters of the indicator 3";



En esta parte tenemos que borrar los comentarios en la línea con el texto “The parameters of the indicator 1” y añadir el nombre CCI. Como resultado tendremos:

extern string p5 = "CCI parameters";

Luego añadimos el parámetro del indicador CCI - el periodo:

extern string p5 = "CCI parameters";
extern int Period_CCI = 14;



En esta línea

string name[] = {"Parabolic SAR","MACD","Сrossing MA","ADX","","",""};



añadir el nombre del indicador a mostrar en la tabla:

string name[] = {"Parabolic SAR","MACD","Сrossing MA","ADX","CCI","",""};



Luego, en el bloque de inicialización del indicador

  int init()
    {
     string sn = "Real_Time_MultiIndicator_v1";
     IndicatorShortName(sn);
     SetIndexLabel(0, sn);
     name[0] = name[0] + "(" + DoubleToStr(SAR_Step, 2) + ", " +
               DoubleToStr(SAR_Max, 2) + ")";
     name[1] = name[1] + "(" + DoubleToStr(Fast_EMA, 0) + ", " +
               DoubleToStr(Slow_EMA, 0) + ", " + 
               DoubleToStr(MACD_SMA, 0) + ")";
     name[2] = name[2] + "(" + DoubleToStr(Fast_MA, 0) + ", " +
               DoubleToStr(Slow_MA, 0) + ")";
     name[3] = name[3] + "(" + DoubleToStr(ADX_Period, 0) + ")";
     //name[4] = name[4] + "(" + 
     //          DoubleToStr(1st parameter of the indicator 1, 0) +
     //          ", " + DoubleToStr(2nd parameter of the indicator 1, 0) + ")";
     //name[5] = name[5] + "(" + 
     //          DoubleToStr(1st parameter of the indicator 2, 0) +
     //          ", " + DoubleToStr(2nd parameter of the indicator 2, 0) + ")";
     //name[6] = name[6] + "(" + 
     //          DoubleToStr(1st parameter of the indicator 3, 0) +
     //          ", " + DoubleToStr(2nd parameter of the indicator 3, 0) + ")";
     return(0);
    }

borramos los comentarios en la línea

//name[4] = name[4] + "(" + 

//          DoubleToStr(1st paramater of the indicator 1, 0) +

//          ", " + DoubleToStr(2nd parameter of the indicator 1, 0) + ")";

y realizamos los cambios siguientes:

name[4] = name[4] + "(" + DoubleToStr(Period_CCI, 0) + ")";

Luego, borramos los comentarios de este bloque:

/*

//+------------------------------------------------------------------+

//| Function 1                                                                       |
//+------------------------------------------------------------------+

string Function(int p)

 {
  int ii  = 1;
  if (C=Condition for the indicator - true - sell, false - buy)
    {
      while (Conditionc for sell)
          ii++;
      if (Error(p,ii+1) == 1) return("Waiting data");
      return("Sell(" + DoubleToStr(ii, 0) + ")");
    }
  else
    {
      while (Condition for buy)
          ii++;
      if (Error(p,ii+1) == 1) return("Waiting data");
      return("Buy(" + DoubleToStr(ii, 0) + ")");
    }
  }*/

En lugar de la palabra "Function" escribimos el nombre de la función, como por ejemplo CCI:

string CCI(int p)

Ahora, en lugar de la línea “Condition for the indicator - true - sell, false – buy” escribimos la condición para que la señal compre en la barra actual (cero):

iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 0

Luego, en lugar de la línea "Condition for sell” escribimos la condición para que la señal compre y para calcular el número de barras procesadas que muestran esta señal:

while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < 0)

ii—es un cambio en relación a la barra actual. De la misma forma, cambiamos la línea "while" (condición para comprar) a

while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 0)

Como resultado podemos ver:

string CCI(int p)
  {
    int ii = 1;
    if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 0)
     {
       while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < 0)       
ii++;
      if(Error(p, ii + 1) == 1) 
          return("Waiting data");
      return("Sell(" + DoubleToStr(ii, 0) + ")");
    }
  else
    {
      while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 0)
          ii++;
      if(Error(p, ii + 1) == 1) 
          return("Waiting data");
      return("Buy(" + DoubleToStr(ii, 0) + ")");
    }
  }
Si queremos contar las señales desde los niveles 100 y -100, y no interpretar el rango (-100;100) como una señal para comprar o vender, tenemos que cambiar 0 a -100 y 100 para vender y comprar respectivamente, y para añadir la siguiente línea para visualizar el hecho incierto en la tabla:

if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) > -100) &&   
iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 100))
    return("N/A");

Ahora tenemos

string CCI(int p)
   {  
int ii = 1;
    if((iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) > -100) && 
       (iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 100) )
        return("N/A");
    if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < -100)
      {
        while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < -100)
            ii++;
        if(Error(p, ii + 1) == 1) 
            return("Waiting data");
        return("Sell(" + DoubleToStr(ii, 0) + ")");
      }
    else
      {
        while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 100)
            ii++;
        if(Error(p, ii + 1) == 1) 
            return("Waiting data");
        return("Buy(" + DoubleToStr(ii, 0) + ")");
      }
   }

Ahora tenemos que convertir los resultados del cálculo en la tabla. Hacemos lo siguiente: encontramos la parte del código en el texto del programa

/*//----------Пятая строка   
  for (i = 1; i <= 4; i++)
     {
       ObjectDelete("6" + DoubleToStr(i, 0));
       ObjectCreate("6" + DoubleToStr(i, 0), OBJ_TEXT, 
                           WindowFind("Real_Time_MultiIndicator_v1"), textT[i+1], textC[6]);
       ObjectSetText("6" + DoubleToStr(i, 0), Функция(per[i-1]), 13, "Tahoma", TxtColor);
    }*/

y borramos los comentarios en ella. Como las coordenadas para mostrar el texto se calculan por separado, es posible rellenar la tabla usando el ciclo. Tenemos que establecer la función que calcula los resultados. Luego escribimos el nombre de la función en lugar de la palabra "Function". Ahora tenemos

 //----------Fifth line   
 for (i=1;i<=4;i++)
   {
     ObjectDelete("6" + DoubleToStr(i, 0));
     ObjectCreate("6" + DoubleToStr(i, 0), OBJ_TEXT,
                  WindowFind("Real_Time_MultiIndicator_v1"),
                  textT[i+1], textC[5]);
     ObjectSetText("6" + DoubleToStr(i, 0), CCI(per[i-1]), 13, 
                   "Tahoma", TxtColor);
   }

Luego hacemos clic en el botón "Compilar". Vamos al terminal y adjuntamos el indicador al gráfico. Como resultado tenemos:




Si queremos cambiar los periodos de tiempo donde se cuentan los valores de los indicadores, tenemos que hacer lo siguiente:
En la línea:

int per[] = {15,30,60,240};

introducimos la cantidad de minutos para el periodo de tiempo que hemos elegido, por ejemplo:

int per[] = {5,30,60,240};



y en la línea:

string nameS[] = {"INDICATOR","M15","M30","H1","H4"}

tenemos que introducir su nombre:


string nameS[] = {"INDICATOR","M5","M30","H1","H4"};

y compilar. Finalmente tenemos:



Depuración de parámetros en el historial

El indicador descrito puede usarse solo en el modo en línea. La razón de ello es que durante la prueba en el modo de visualización el indicador mostrará los valores adecuados solo en el periodo de tiempo actual. Es la características del terminal y el probador. Si queremos depurar los parámetros de los indicadores o probar nuestra propia estrategia al probar la visualización en el historial, le recomiendo que use Real_Time_MultiExpert_v1. Las funciones realizadas por Real_Time_MultiIndicator_v1 y Real_Time_MultiExpert_v1 son absolutamente idénticas. Su código fuente es idéntico, y hacer cambios en el código del experto tiene el mismo algoritmo que hacer cambios en el código del indicador. Para usar el experto tenemos que descargar el archivo Real_Time_MultiExpert_v1. mq4 en \terminal folder\experts\indicators y reiniciar el terminal.

Para usar Real_Time_MultiExpert_v1 tenemos que hacer una plantilla con el nombre “Real_Time_MultiExpert_v1” con el indicador “Real_Time_MultiIndicator_v2” adjunto al gráfico. La tarea del indicador “Real_Time_MultiIndicator_v2” es crear una subventana con la ampliación del zum bajo el gráfico principal. Luego tienes que seleccionar Real_Time_MultiExpert_v1 en el campo "Advisor" del probador y seleccionar la opción "Todos los ticks" en el campo "Modelo", de lo contrario los indicadores del asesor en la barra actual (cero) pueden ser distintos al estado real de las cosas pero en general las indicaciones serán correctas.


No olvide hacer clic en el botón de cambio automático:

Luego elija la opción "Visualización" y haga clic en el botón "Inicio".


En la ventana Real_Time_MultiIndicator_v2 verá la tabla con las señales de los indicadores. Puede elegir cualquier periodo de tiempo para la prueba, ya que los valores de los indicadores no dependen de él. No hay una gran diferencia entre el experto descrito y el indicador, por lo que puede elegir el que prefiera. En mi opinión es más conveniente usar el indicador en el modo en línea.


Conclusión

En el artículo hemos visto uno de los métodos de recogida y organización de información importante sobre el estado del mercado: las señales de varios indicadores de los cuatro periodos de tiempo. Este método puede usarse para resolver una amplia variedad de tareas. Usando los programas descritos puede seleccionar los parámetros necesarios para los indicadores que usa al hacer pruebas con las cotizaciones del historial. El indicador tiene por finalidad ser usado para el trading manual.