Discussão do artigo "MQL5: Crie o seu próprio indicador" - página 5

 
okwh #:

for(int i=1;i<rates_total;i++)
{
MTMBuffer[i]=price[i]-price[i-1];
AbsMTMBuffer[i]=fabs(MTMBuffer[i]);
}

Por que usar [i-1] para calcular [i] e iniciar i=1 ? não [0] ?

MTMBuffer[i]=price[i]-price[i-1];


Olá.

Em termos gerais, se você usar uma das funções nativas do indicador mql5 que começa com "i", não precisará prestar atenção à rota. O copybuffer fará isso por você.

Por outro lado, se você passar por um desvio específico, terá de prestar atenção ao número de barras, especialmente na primeira passagem, pois, caso contrário, corre o risco de ficar fora do intervalo


Veja o código desse rsi que usa o Irsi, sem posição para o curso e tudo corre bem.

Por outro lado, esse Rsi não passa pela função.

Tudo é calculado manualmente, por assim dizer, e você precisa fazer o posicionamento bem feito para que tudo corra bem.

Rsi code for beginners by William210
Rsi code for beginners by William210
  • www.mql5.com
Rsi beginner tutorial to learn how to code in MQL5
 
//+------------------------------------------------------------------+
//|Índice de força real.mq5
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot TSI
#property indicator_label1  "TSI"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Blue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- parâmetros de entrada
input int      r=25;
input int      s=13;
//--- buffers de indicadores
double         TSIBuffer[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mapeamento de buffers de indicadores

   SetIndexBuffer(0,TSIBuffer,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizado|
//+------------------------------------------------------------------+
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[])
  {
//---
//--- valor de retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }
//+------------------------------------------------------------------+

Por que no oninit
ele precisa retornar 0?

 
ziyang2048 #:

Por que no oninit
ele precisa retornar 0?

Na MQL5, a função OnInit() é chamada quando o indicador, o consultor especialista (EA) ou o script é inicializado. Espera-se que ela retorne um valor inteiro para sinalizar o sucesso ou a falha do processo de inicialização.

Quando OnInit() retorna 0, isso indica que a inicialização foi bem-sucedida. Se você precisar sinalizar que algo deu errado durante a inicialização, poderá retornar um valor diferente de zero, o que impedirá que o indicador, o EA ou o script seja executado corretamente.