Obrigado por mais um bom artigo. Tradicionalmente, os artigos da Comunidade MQL se tornaram uma maneira de eu obter uma educação pós-secundária (ou seja, o guia do editor MQL embutido)
Sobre o ponto, notei uma pequena falha no código. De acordo com a ideia do autor, a
//--- sinalizador para saída única de valores price[]variável
bool printed=false;deve ser movida para fora da função OnCalculate(), caso contrário, a impressão da matriz ocorrerá em todos os eventos.
Também há um erro de impressão aqui
Правило передачи PLOT_DRAW_BEGIN в параметр begin: Значение входного параметра begin в OnCalculate(), при расчетах пользовательского индикатора A на данных другого (базового) индикатора B, всегда равно значению свойства PLOT_DRAW_BEGIN нулевого графического построения базового индикатора B.
Assim, se criamos um indicador RSI (indicador A) com um período de 14 e, em seguida, construímos nosso indicador personalizado True Strength Index (indicador B) nos dados do indicador RSI(14), então:
A julgar pela regra e pela lógica, o indicador A é o TSI personalizado e o indicador B (básico) é o RSI.
- www.mql5.com
Este artigo contém o conhecimento detalhado.
Obrigado.
Hi,
Esse artigo é realmente interessante e abre novas oportunidades para gerenciar indicadores.
Como sou iniciante em MQL5, tentei implementar a possibilidade de aplicar um indicador a outro. Escrevi um pequeno código que apenas duplica
uma média móvel adaptativa na esperança de usá-la em qualquer indicador do gráfico.
Infelizmente, na lista de parâmetros que aparece quando você inicia o indicador, não tenho o caso "apply to: previuos indicator's data".
Como o código deve ser organizado para ter a possibilidade de aplicá-lo a outro indicador?
Aqui está meu código:
#property indicator_separate_window #property indicator_minimum 1.3 #property indicator_maximum 1.35 //#property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 1 //--- plotar dMA #property indicator_label1 "dAMA" #property indicator_type1 DRAW_LINE #property indicator_color1 Red #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- parâmetros de entrada input int AMAPeriod=9; input int FastEMA=2; input int SlowEMA=20; //--- buffers de indicadores double AMABuffer[]; double dAMABuffer[]; int h_dAMA; int h_AMA; //+------------------------------------------------------------------+ //| Função de inicialização do indicador personalizado //+------------------------------------------------------------------+ int OnInit() { //--- mapeamento de buffers de indicadores SetIndexBuffer(0,dAMABuffer,INDICATOR_DATA); SetIndexBuffer(1,AMABuffer,INDICATOR_CALCULATIONS); //PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MAPeriod+1); h_AMA=iAMA(_Symbol,PERIOD_CURRENT,AMAPeriod,FastEMA,SlowEMA,0,PRICE_CLOSE); if(h_AMA == INVALID_HANDLE) { Print("AMA indicator initialization error, Code = ", GetLastError()); return(-1); } ArraySetAsSeries(AMABuffer,true); ArraySetAsSeries(dAMABuffer,true); PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MathMax(AMAPeriod,SlowEMA)); //--- return(0); } //+------------------------------------------------------------------+ //| Função de iteração de indicador personalizado| //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // tamanho da matriz price[] const int prev_calculated,// número de barras processadas na chamada anterior const int begin, // onde os dados significativos começam const double &price[] // matriz para cálculo ) { if(BarsCalculated(h_AMA)<rates_total) return(0); //--- podemos copiar nem todos os dados int to_copy; if(prev_calculated>rates_total || prev_calculated<=0) { to_copy=rates_total; if(CopyBuffer(h_AMA,0,0,to_copy,AMABuffer)<=0) return(0); for (int i=0;i<to_copy-MathMax(AMAPeriod,SlowEMA);i++) { dAMABuffer[i]=AMABuffer[i]; } } else { to_copy=rates_total-prev_calculated+MathMax(AMAPeriod,SlowEMA)-1; //--- o último valor é sempre copiado to_copy++; if(CopyBuffer(h_AMA,0,0,to_copy,AMABuffer)<=0) return(0); for (int i=0;i<to_copy;i++) { dAMABuffer[i]=AMABuffer[i]; } } //--- tente copiar Print(dAMABuffer[0]); //para ver se vamos até o fim //--- valor de retorno de prev_calculated para a próxima chamada //--- //--- valor de retorno de prev_calculated para a próxima chamada return(rates_total); } //+------------------------------------------------------------------+
Hi,
Entendi o problema: você só pode aplicar um indicador a outro que esteja na mesma janela.
Você tem alguma ideia de como aplicar um indicador (e exibi-lo em uma janela separada) a outro que esteja na janela principal?
Obrigado
Bests
Existe alguma possibilidade de criar um indicador programaticamente (por meio do iCustom, por exemplo) e dizer a ele para receber dados de outro indicador como entrada? Ou, melhor ainda, fornecer a ele uma matriz direta de dados sobre a qual ele deve ser construído.
Existe alguma possibilidade de criar um indicador programaticamente (por meio do iCustom, por exemplo) e dizer a ele para receber dados de outro indicador como entrada? Ou, melhor ainda, fornecer diretamente a ele uma matriz de dados sobre a qual ele deve ser construído.
Consulte a função iCustom:
Se a primeira forma de chamada for usada no indicador, ao iniciar um indicador personalizado na guia "Parameters" (Parâmetros), você poderá especificar adicionalmente em quais dados ele será calculado. Se o parâmetro "Apply to" (Aplicar a) não for selecionado explicitamente, então, por padrão, o cálculo será realizado pelos valores de "Close" (Fechar).
Ao chamar um indicador personalizado de um programa mql5, o parâmetro Applied_Price ou o identificador de outro indicador deve ser passado por último, depois de todas as variáveis de entrada fornecidas pelo indicador personalizado.
Hi,
Esse artigo é muito bom, mas tenho algumas perguntas.
1. somente os indicadores que usam a forma curta da chamada da funçãoOnCalculate() podem ser aplicados a outro indicador ou os indicadores que usam a forma longa da chamada da funçãoOnCalculate() também podem ser aplicados? Em caso afirmativo, como pode ser aplicado um indicador com a forma longa da chamada da funçãoOnCalculate() a outro indicador?
2. A aplicação de um indicador a outro (TSI sobre RSI) gera alguns problemas de exibição (veja a imagem anexa). Enquanto o RSI é plotado de 0 a 100, o segundo indicador (TSI) também tem valores abaixo de 0, valores que não são visíveis no gráfico. Qual é o problema e por que o gráfico não se ajusta adequadamente para exibir corretamente os dois indicadores? Podemos resolver esse problema ou é um bug do MetaTrader????
Decidi criar um indicador a partir de um indicador e me deparei com uma confusão.
Ambos os indicadores são construídos com base em um indicador.
int OnCalculate (const int rates_total, // tamanho da matriz price[] const int prev_calculated, // barras processadas na chamada anterior const int begin, // índice a partir do qual os dados significativos começam в массиве price[] const double& price[] // matriz para cálculo );
Dessa forma, o usuário pode definir o campo applied_price nos parâmetros.
Minha dificuldade é como passar o campo applied_price para o indicador interno (a partir do qual o indicador externo é criado)?
A solução mais simples é criar uma entrada e avisar ao usuário que a entrada applied_price e o parâmetro applied_price devem ser os mesmos, mas isso é um pouco complicado.
Você já deu uma olhada no exemplo de OnCalculate()?
Для получения значений пользовательского индикатора из других mql5-программ используется функция iCustom(), возвращающая хэндл индикатора для последующих операций. При этом также можно указать необходимый массив price[] или хэндл другого индикатора. Этот параметр должен передаваться последним в списке входных переменных пользовательского индикатора.
Пример:
void OnStart() { //--- string terminal_path=StatusInfoString(STATUS_TERMINAL_PATH); int handle_customMA=iCustom(Symbol(),PERIOD_CURRENT, "Custom Moving Average",13,0, MODE_EMA,PRICE_TYPICAL); if(handle_customMA>0) Print("handle_customMA = ",handle_customMA); else Print("Cannot open or not EX5 file '"+terminal_path+"\\MQL5\\Indicators\\"+"Custom Moving Average.ex5'"); }
Nesse exemplo, o último parâmetro passado é o valor PRICE_TYPICAL (da enumeração ENUM_APPLIED_PRICE ), que indica que o indicador personalizado será construído por preços típicos obtidos como (High+Low+Close)/3. Se o parâmetro não for especificado, o indicador será construído pelos valores PRICE_CLOSE, ou seja, pelos preços de fechamento de cada barra.
Sim, dei,
int handle_customMA=iCustom(Symbol(),PERIOD_CURRENT, "Custom Moving Average",13,0, MODE_EMA,PRICE_TYPICAL);
applied_price é especificado explicitamente quando iCustom é chamado, mas no indicador do qual iCustom é chamado, onde obtê-lo?
Porque o usuário o define nos parâmetros, não nas entradas.
int OnInit() { //--- mapeamento de buffers de indicadores SetIndexBuffer(0,Buffer,INDICATOR_DATA); hndl=iCustom(_Symbol,_Period,"MyInd",param_ind,???? вот тут нужно указать аплиед_прайс который будет задавать пользователь); //--- return(0); } //+------------------------------------------------------------------+ //| Função de iteração de indicador personalizado //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //... return(rates_total); }
PS: o truque é que o usuário, depois de definir uma vez o parâmetro applied_price e não mais se incomodar, esse valor passou por toda a pirâmide de chamadas.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Novo artigo Aplicar um indicador a outro foi publicado:
Ao escrever um indicador que usa a forma curta da solicitação de função OnCalculate(), você pode deixar passar o fato de que um indicador pode ser calculado, não apenas pelos dados de preço, mas também pelos dados de algum outro indicador (não importando se for incorporado ou um personalizado). Você quer melhorar um indicador para sua aplicação correta a outros dados do indicador? Vamos analisar neste artigo todas as etapas necessárias para tal modificação.
Autor: MetaQuotes Software Corp.