ChartIndicatorAdd

Adiciona um indicador com o identificador especificado para uma janela de gráfico especificado. Indicador e gráfico devem ser gerados sobre o mesmo símbolo e prazo.

bool  ChartIndicatorAdd(
   long  chart_id,                 // ID Gráfico
   int   sub_window                // número da sub-janela
   int   indicator_handle          // manipulador do indicador
   );

Parâmetros

chart_id

[in]  ID Gráfico. Significa o gráfico atual.

sub_window

[in]  O número de sub-janelas do gráfico. 0 (zero) significa a principal janela do gráfico. Para adicionar um indicador em uma nova janela,o parâmetro obrigatoriamente deve ser maior do que o índice da última janela existente, isto é, igual a CHART_WINDOWS_TOTAL. Se o valor do parâmetro é maior que CHART_WINDOWS_TOTAL, uma nova janela não será criada, e o indicador não será adicionado.

indicator_handle

[in]  O identificador do indicador.

Valor do Retorno

A função retorna verdadeira (true) em caso de sucesso, caso contrário ela retorna false. A fim de obter informação sobre erro, chama a função GetLastError(). Erro 4114 significa que o gráfico e um indicador adicionado difere pelo seus símbolos ou prazo.

Observação

Se um indicador deve ser elaborado numa sub-janela separada (por exemplo, construindo um iMACD ou um indicador personalizado com propriedade especificada #property indicator_separate_window) é aplicada à janela de gráfico principal,não pode ser visível embora ainda estará presente na lista de indicadores. Isto significa que a escala do indicador é diferente da escala do gráfico de preço, e aplicado ao valor do indicador não se enquadra na faixa visualizada do gráfico de preço. Neste caso, GetLastError() retorna código zero indicando a ausência de um erro. Os valores de tal indicador "invisível" pode ser visto na Janela de Dados (Data Window) e recebidos a partir de outras aplicações MQL5.

Exemplo:

#property description "Expert Advisor demonstrando o trabalho com a função ChartIndicatorAdd()."
#property description "Após o lançamento no gráfico (e receber o erro no Jornal), abrir"
#property description "Propriedades do Expert Advisor e especificar <símbolo> correto e os parâmetros do <período>."
#property description "Indicador MACD sera adicionado no grafico."
 
//--- parâmetros de entrada
input string          symbol="AUDUSD";    // nome do símbolo
input ENUM_TIMEFRAMES period=PERIOD_M12;  // time frame
input int    fast_ema_period=12;          // período rápido MACD
input int    slow_ema_period=26;          // período lento MACD
input int      signal_period=9;           // período de sinal
input ENUM_APPLIED_PRICE apr=PRICE_CLOSE// tipo de preço para cálculo do iMACD
 
int indicator_handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Função de inicialização do Expert                                |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
//--- tentar adicionar o indicador no gráfico
   if(!AddIndicator())
     {
      //--- Função AddIndicator() recusou acrescentar o indicador no gráfico
      int answer=MessageBox("Você quer adicionar MACD do gráfico de qualquer maneira?",
                            "Símbolo e/ou prazo de tempo incorreto para adicionar o indicador",
                            MB_YESNO // "Sim" e "Não" botões de seleção será mostrado
                            );
      //--- se um usuário ainda insiste no uso incorreto de ChartIndicatorAdd()
      if(answer==IDYES)
        {
         //--- em primeiro lugar, uma entrada jornal será publicado sobre isso
         PrintFormat("Atenção! %s: Tentando adicionar indicador MACD(%s/%s) em gráfico %s/%s. Recebendo erro 4114",
                     __FUNCTION__,symbol,EnumToString(period),_Symbol,EnumToString(_Period));
         //---receber o número de uma nova sub-janela, para a qual vamos tentar adicionar o indicador.
         int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
         //--- agora faz uma tentativa fadada a falhar
         if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
            PrintFormat("Falha ao adicionar o indicador MACD %d na janela do gráfico. Código de erro %d",
                        subwindow,GetLastError());
        }
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função tick (ponto) de um Expert                                 |
//+------------------------------------------------------------------+
void OnTick()
  {
// Assessor especialista (expert advisor) não executa nada
  }
//+------------------------------------------------------------------+
//| Função para verificar e adicionar o indicador no gráfico         |
//+------------------------------------------------------------------+
bool AddIndicator()
  {
//--- mensagem exibida
   string message;
//--- verificar se o símbolo do indicador e símbolo do gráfico combinam entre si
   if(symbol!=_Symbol)
     {
      message="Exibindo o uso da função Demo_ChartIndicatorAdd():";
      message=message+"\r\n";
      message=message+"Não é possível adicionar o indicador calculado com outro símbolo no gráfico.";
      message=message+"\r\n";
      message=message+"Especifique o símbolo gráfico na propriedade do Expert Advisor - "+_Symbol+".";
      Alert(message);
      //---saída prematura, o indicador não será adicionado no gráfico
      return false;
     }
//--- verificar se o indicador e prazo do gráfico combinam entre si
   if(period!=_Period)
     {
      message="Não é possível adicionar o indicador calculado em outro prazo de tempo no gráfico.";
      message=message+"\r\n";
      message=message+"Especifique o prazo de tempo do gráfico na propriedades do Expert Advisor - "+EnumToString(_Period)+".";
      Alert(message);
      //---saída prematura, o indicador não será adicionado no gráfico
      return false;
     }
//--- todas verificações completadas, simbolo e prazo do indicador corresponde ao gráfico
   if(indicator_handle==INVALID_HANDLE)
     {
      Print(__FUNCTION__,"  Criando indicador MACD");
      indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
      if(indicator_handle==INVALID_HANDLE)
        {
         Print("Falha para criar indicador MACD. Código de erro ",GetLastError());
        }
     }
//--- redefine o código de erro
   ResetLastError();
//--- aplicar o indicador para o gráfico
   Print(__FUNCTION__,"  Adicionando indicador MACD no gráfico");
   Print("MACD é gerada em ",symbol,"/",EnumToString(period));
//---receber o número de uma nova sub-janela, para o qual é adicionado o indicador MACD
   int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   PrintFormat("Adicionado indicador MACD na janela do gráfico %d",subwindow);
   if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
     {
      PrintFormat("Falha para adicionar indicador MACD na janela do gráfico %d. Código de erro %d",
                  subwindow,GetLastError());
     }
//--- indicador adicionado com sucesso
   return(true);
  }

Veja também

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