iCustom

A função retorna o manipulador de um indicador personalizado especifico.

int  iCustom(
   string           symbol,     // símbolo nome
   ENUM_TIMEFRAMES  period,     // período
   string           name        // folder/nome_do_indicador_personalizado
   ...                          // lista de parâmetros de entrada do indicador
   );

Parâmetros

symbol

[in] O nome do símbolo de segurança, os dados que devem ser usados para calcular o indicador. O valor NULL significa o símbolo atual.

period

[in] O valor do período pode ser um dos valores ENUM_TIMEFRAMES, 0 (zero) significa o prazo corrente.

name

[in]  Nome do indicador personalizado. Se antes do nome for indicada uma barra invertida '\', o arquivo EX5 do indicador será procurado em relação à pasta raíz MQL5. Assim, ao chamar iCustom(Symbol(), Period(), "\FirstIndicator"...) o indicador será carregado como MQL5\FirstIndicator.ex5. Se não houver arquivo nesse caminho, ocorrerá o erro 4802 (ERR_INDICATOR_CANNOT_CREATE).

Se o caminho não começar com '\', o indicador será pesquisado e carregado na seguinte sequência:

  • Primeiro, o arquivo EX5 do indicador é pesquisado na mesma pasta em que localizado o arquivo EX5 do programa de chamada. Por exemplo, o EA CrossMA.EX5 está localizado na pasta MQL5\Experts\MyExperts e contém a chamada iCustom(Symbol(), Period(), "SecondIndicator"...), neste caso, a pesquisa do indicador é realizada com base no caminho MQL5\Experts\MyExperts\SecondIndicator.ex5.
  • Se o indicador não for encontrado no mesmo diretório, a pesquisa será realizada em relação ao diretório raiz dos indicadores MQL5\Indicators. Em outras palavras, é procurado o arquivo MQL5\Indicators\SecondIndicator.ex5. Se o indicador não for encontrado nos dois caminhos, a função retornará NVALID_HANDLE e será gerado o erro 4802 (ERR_INDICATOR_CANNOT_CREATE).

Se o caminho do indicador estiver definido num subdiretório, por exemplo, como MyIndicators\ThirdIndicator, a pesquisa será realizada pela primeira vez na pasta do programa de chamada (o EA está localizado na pasta MQL5\Experts\MyExperts) com base no caminho MQL5\Experts\MyExperts\MyIndicators\ThirdIndicator.ex5 e, em seguida, em caso de falha, é procurado o arquivo MQL5\Indicators\MyIndicators\ThirdIndicator.ex5. Além disso, com ajuda de um separador no caminho é necessário especificar uma barra invertida dupla '\\', por exemplo, iCustom(Symbol(), Period(), "MyIndicators\\ThirdIndicator"...).

...

[in] entrada-parâmetros de um indicador personalizado, separados por vírgulas. Tipo e ordem dos parâmetros devem coincidir. Se não há parâmetros específicos, então valores padrões serão usados.

Valor de retorno

Retorna o manipulador de um indicador técnico especifico, em caso de falha de retorna INVALID_HANDLE. A memória do computador pode ser liberada a partir de um indicador que não é mais utilizado, usando a função IndicatorRelease(), onde o manipulador de indicador é transmitido.

Observação

Um indicador personalizado deve ser compilado (com extensão EX5) e localizado no diretório MQL5/Indicadores do terminal do cliente ou seu subdiretório.

Indicadores que requerem teste são definidos automaticamente a partir da chamada da função iCustom(), se o correspondente parâmetro for definido através de um string constante. Para todos os outros casos (uso da função IndicatorCreate() ou uso de uma string não-constante no parâmetro de define o nome do indicador) a propriedade #property tester_indicator é requerida:

#property tester_indicator "indicator_name.ex5"

Se o primeiro formulário de chamada é usado no indicador, então na inicialização do indicador, na aba "Parâmetros", você pode escolher dados adicionais para cálculo. Se a opção "Aplicar para" do parâmetro não é selecionada, o cálculo padrão baseia-se nos valores "Fechamento" dos preços.

Selecionando timeseries para calcular um indicador

Quando você chama um indicador personalizado a partir do programa MQL5, o parâmetro Applied_Price ou um manipulador de outro indicador deve ser passado por último, depois de todas as variáveis de entrada do indicador personalizado.

Também Veja

Propriedades de Programa, Séries Temporais e Acesso a Indicadores,IndicatorCreate(), IndicatorRelease()

Exemplo:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- Plotar Etiqueta1
#property indicator_label1  "Etiqueta1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- parâmetros de entrada
input int MA_Period=21;
input int MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMA;
//--- buffers do indicador
double         Label1Buffer[];
//--- Manipulador do indicador personalizado Moving Average.mq5
int MA_handle;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado                 |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mapeamento de buffers do indicador
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ResetLastError();
   MA_handle=iCustom(NULL,0,"Examples\\Custom Moving Average",
                     MA_Period,
                     MA_Shift,
                     MA_Method,
                     PRICE_CLOSE // usando o fechamento de preços
                     );
   Print("MA_handle = ",MA_handle,"  error = ",GetLastError());
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado                      |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- Copiar os valores do indicador Custom Moving Average para o nosso buffer do indicador
   int copy=CopyBuffer(MA_handle,0,0,rates_total,Label1Buffer);
   Print("copy = ",copy,"    rates_total = ",rates_total);
//--- Se a nossa tentativa falhou - Reportar isto
   if(copy<=0)
      Print("Uma tentativa de obter os valores se houve falha do Custom Moving Average");
//--- valor retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }
//+------------------------------------------------------------------+