Dúvida Programação com o IRVI

 

Olá amigos,

eu tenho um Robô que estou desenvolvendo,

ele já faz bastante coisa, abre e fecha ordens e posições, conforme uma série de parâmetros.


Resolvi colocar um indicador nele, para melhorar a indicação de colocar ordens.


Resolvi colocar o RVI, peguei o exemplo na página: https://www.mql5.com/pt/docs/indicators/irvi

Ele roda no robô, em janela extra, tudo direitinho.


Sou de TI, mas sou novo em MQL5.


Agora minha dúvida, como eu consigo "pegar" os valores calculados no RVI?


Estou batendo cabeça nesta questão, queria no OnTick() pegar o valor atual do RVIBuffer e do SignalBuffer, mas não entendi como programar isto.


Desde já agradeço, qualquer indicação.


Já procurei muito nos helps, no site e google, mas ainda não entendi como fazer isto.

Documentação sobre MQL5: Indicadores Técnicos / iRVI
Documentação sobre MQL5: Indicadores Técnicos / iRVI
  • www.mql5.com
Indicadores Técnicos / iRVI - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Cláudio Müller:

Olá amigos,

eu tenho um Robô que estou desenvolvendo,

ele já faz bastante coisa, abre e fecha ordens e posições, conforme uma série de parâmetros.


Resolvi colocar um indicador nele, para melhorar a indicação de colocar ordens.


Resolvi colocar o RVI, peguei o exemplo na página: https://www.mql5.com/pt/docs/indicators/irvi

Ele roda no robô, em janela extra, tudo direitinho.


Sou de TI, mas sou novo em MQL5.


Agora minha dúvida, como eu consigo "pegar" os valores calculados no RVI?


Estou batendo cabeça nesta questão, queria no OnTick() pegar o valor atual do RVIBuffer e do SignalBuffer, mas não entendi como programar isto.


Desde já agradeço, qualquer indicação.


Já procurei muito nos helps, no site e google, mas ainda não entendi como fazer isto.


Boa noite!

Você deve trabalhar com a função iCustom(). Dê uma olhada neste artigo detalhando o seu uso.

Abs.

 
Romeu Bertho:

Boa noite!

Você deve trabalhar com a função iCustom(). Dê uma olhada neste artigo detalhando o seu uso.

Abs.

Romeu, obrigado pela dica, já tinha chegado ali, mas não entendi como pegar os valores calculados a cada tick ou candle.


Peguei o fonte indicado no artigo, exatamente como ele está, rodou beleza, mas não entendi como pegar o valor calculado após cada tick, como fazer isto?


#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);
  }
//+------------------------------------------------------------------+

 
Cláudio Müller:

Romeu, obrigado pela dica, já tinha chegado ali, mas não entendi como pegar os valores calculados a cada tick ou candle.


Peguei o fonte indicado no artigo, exatamente como ele está, rodou beleza, mas não entendi como pegar o valor calculado após cada tick, como fazer isto?


#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);
  }
//+------------------------------------------------------------------+


Resolvi tb desta forma:

Boa noite, 

Segue a maneira que resolvi para pegar os valores das duas linhas:

//---Vetores

double         RVI_Green_Array[];//média de oscilações de preços verdes

double         RVI_Red_Array[];  //média de oscilações de preços vermelhos


//--- manipuladores dos indicadores


double         RVI_Green_Handle = INVALID_HANDLE;

double         RVI_Red_Handle = INVALID_HANDLE;


int OnInit()

  {

      ArraySetAsSeries(RVI_Green_Array,true);

      ArraySetAsSeries(RVI_Red_Array,true);

      

//--- atribuir p/ os manupuladores de média móvel

      RVI_Green_Handle     = iRVI(_Symbol,_Period,periodoCurta);

      RVI_Red_Handle       = iRVI(_Symbol,_Period,periodoCurta);

void OnTick()

  {     

      if(CopyBuffer(RVI_Green_Handle,1,0,3,RVI_Green_Array)<0)
         {
            Alert("Erro ao copiar dados da RVI_Green: ", GetLastError());
            return;
         }

      if(CopyBuffer(RVI_Red_Handle,0,0,3,RVI_Red_Array)<0)
         {
            Alert("Erro ao copiar dados da RVI_Red: ", GetLastError());
            return;



//---TESTES

   Print("Resultado do RVI GREEN 0 é:========     ",RVI_Green_Array[0]); 

   Print("Resultado do RVI RED 0 é: =========     ",RVI_Red_Array[0]); 



}



Razão: