ChartIndicatorAdd

Añade un indicador con el manejador (handle) especificado a la ventana del gráfico especificada. El indicador y el gráfico tienen que generarse basándose en el mismo símbolo y en el mismo período de tiempo.

bool  ChartIndicatorAdd(
   long  chart_id,                 // identificador del gráfico
   int   sub_window                // número de subventana
   int   indicator_handle          // manejador del indicador
   );

Parámetros

chart_id

[in]  Identificador del gráfico. 0 significa el gráfico actual.

sub_window

[in]  Número de subventana del gráfico. 0 significa la ventana principal del gráfico. Para añadir un indicador a una ventana nueva, el parámetro debe ser un uno más que el índice de la última ventana existente, es decir debe ser igual a CHART_WINDOWS_TOTAL. Si el valor del parámetro sobrepasa el valor de CHART_WINDOWS_TOTAL, entonces la nueva ventana no se creará y el indicador no será agregado.

indicator_handle

[in]  Manejador del indicador.

Valor devuelto

Devuelve true en caso del éxito, de lo contrario devuelve false. Para obtener la información sobre el error, hay que llamar a la función GetLastError(). El error 4114 significa que el gráfico y el indicador que se añade se diferencian por el símbolo o por el período de tiempo.

Nota

Si a la ventana principal del gráfico se le añade un indicador que tiene que ser dibujado en una ventana separada (por ejemplo, indicador built-in iMACD o un indicador personalizado con la propiedad especificada #property indicator_separate_window), entonces puede ocurrir que este indicador se quede invisible, aunque va a figurar en la lista de indicadores. Eso quiere decir que la escala de este indicador se diferencia de la escala del gráfico de precios, y los valores del indicador insertado no entran en la extensión visualizada del gráfico de precios. En este caso GetLastError() va a devolver el código nulo que indica en la ausencia de errores. Se puede observar el valor de este indicador "invisible" en la "Ventana de Datos", así como obtenerlo desde otros programas MQL5.

Ejemplo:

#property description "El EA para demostrar el trabajo con la función ChartIndicatorAdd()."
#property description "Después de arrancarlo en el gráfico (y recibir el error en el Diario), abra"
#property description "las propiedades del EA y establezca los parámetros correctos de <symbol> y <period>."
#property description "El indicador MACD sera agregado al gráfico."
 
//--- input parameters
input string          symbol="AUDUSD";    // nombre del símbolo
input ENUM_TIMEFRAMES period=PERIOD_M12;  // período de tiempo
input int    fast_ema_period=12;          // período de media rápida MACD
input int    slow_ema_period=26;          // período de media lenta MACD
input int      signal_period=9;           // período del promedio de diferencia
input ENUM_APPLIED_PRICE apr=PRICE_CLOSE// tipo del precio para el cálculo MACD
 
int indicator_handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
//--- intentamos insertar el indicador en el gráfico
   if(!AddIndicator())
     {
      //--- la función AddIndicator() ha negado a insertar el indicador en el gráfico
      int answer=MessageBox("¿Desea intentar agregar MACD al gráfico de cualquier modo?",
                            "El símbolo y/o el período de tiempo no han sido establecidos de forma correcta para la inserción del indicador",
                            MB_YESNO // se mostrarán los botones de selección "Yes" y "No"
                            );
      //--- si el usuario aun así insiste en el uso incorrecto de ChartIndicatorAdd()
      if(answer==IDYES)
        {
         //--- primero vamos a reflejarlo en el Diario
         PrintFormat("¡Atención! %s: Intentemos agregar el indicador MACD(%s/%s) al gráfico %s/%s. Obtenemos el error 4114",
                     __FUNCTION__,symbol,EnumToString(period),_Symbol,EnumToString(_Period));
         //--- obtenemos el número de una nueva subventana en la que tratamos de insertar el indicador
         int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
         //--- ahora hagamos el intento condenado al error
         if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
            PrintFormat("Fallo al agergar el indicador MACD a la ventana %d del gráfico. Código del error %d",
                        subwindow,GetLastError());
        }
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
// el EA no hace nada
  }
//+------------------------------------------------------------------+
//| La función para comprobar y añadir el indicador al gráfico               |
//+------------------------------------------------------------------+
bool AddIndicator()
  {
//--- mostramos el mensaje
   string message;
//--- comprobamos si el símbolo del indicador coincide con el símbolo del gráfico
   if(symbol!=_Symbol)
     {
      message="Demostración del usu de la función Demo_ChartIndicatorAdd():";
      message=message+"\r\n";
      message=message+"No se puede agregar al gráfico un indicador calculado para otro símbolo.";
      message=message+"\r\n";
      message=message+"Especifique el símbolo del gráfico en las propiedades del EA - "+_Symbol+".";
      Alert(message);
      //--- salida anticipada, no vamos a añadir el indicador al gráfico
      return false;
     }
//--- comprobaremos si el periodo del indicador coincide con el período del gráfico
   if(period!=_Period)
     {
      message="No se puede agregar al gráfico un indicador calculado para otro período de tiempo.";
      message=message+"\r\n";
      message=message+"Especifique el período del gráfico en las propiedades del EA - "+EnumToString(_Period)+".";
      Alert(message);
      //--- salida anticipada, no vamos a añadir el indicador al gráfico
      return false;
     }
//--- todas las pruebas pasadas, el símbolo y el período del indicador corresponden al gráfico
   if(indicator_handle==INVALID_HANDLE)
     {
      Print(__FUNCTION__,"  Creamos el indicador MACD");
      indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
      if(indicator_handle==INVALID_HANDLE)
        {
         Print("Generación del indicador MACD fallida. Código del error ",GetLastError());
        }
     }
//--- reseteamos el código del error
   ResetLastError();
//--- agregamos el indicador al gráfico
   Print(__FUNCTION__,"  Agregamos el indicador MACD al gráfico");
   Print("MACD construida sobre ",symbol,"/",EnumToString(period));
//--- obtenemos el número de nueva subventana a la que vamos a agregar el indicador MACD
   int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   PrintFormat("Agregamos el indicador MACD a la ventana %d del gráfico",subwindow);
   if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
     {
      PrintFormat("Fallo al agergar el indicador MACD a la ventana %d del gráfico. Código del error %d",
                  subwindow,GetLastError());
     }
//--- el indicador ha sido insertado al gráfico con éxito
   return(true);
  }

Véase también

ChartIndicatorDelete(), ChartIndicatorName(), ChartIndicatorsTotal(), iCustom(), IndicatorCreate()