Indicador sem defeito aparente no IF

 

Prezadíssimos,


Tentando montar combinados RSF e MFI (economia de espaço), estou com o seguinte problema. O comando if que estou utilizando para minimizar contas desnecessárias faz com que tudo nele não funcione e não estou conseguindo achar a causa. Para mim está tudo ok. Tenho certeza que alguém, batendo o olho, resolve. (não quero fritar mais com a aprendizagem da linguagem hoje - XD). Muito Obrigado! Aceito sujeitos para lidar melhor com o problema em questão - de evitar repetição de cálculos no OnCalculate.

Grato 


//+------------------------------------------------------------------+
//|                                                  RSI and MFI.mq5 |
//|                                                  Daniel Bandeira |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Daniel Bandeira"

#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   2


//--- plot RSI and MFI
#property indicator_label1  "RSI"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "MFI"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrLime
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1




//--- indicator buffers
double         RaeBufferA[]; //RSI e MFI buffers
double         RaeBufferB[]; 


input   int       Periodos = 14;
bool              primeiraVez=true;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
  
   IndicatorSetString(INDICATOR_SHORTNAME,"RSI (dogde blue) and MFI (lime) : (dual graph)"); 
   SetIndexBuffer(0,RaeBufferA,INDICATOR_DATA);
   SetIndexBuffer(1,RaeBufferB,INDICATOR_DATA);

  IndicatorSetInteger(INDICATOR_LEVELS,3);
  IndicatorSetDouble(INDICATOR_LEVELVALUE,0,30);
  IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
  IndicatorSetDouble(INDICATOR_LEVELVALUE,2,70);
  
  IndicatorSetDouble(INDICATOR_MINIMUM,0); 
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
  
  IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,1);
  IndicatorSetInteger(INDICATOR_LEVELWIDTH,1,1);
  IndicatorSetInteger(INDICATOR_LEVELWIDTH,2,1);
  
  IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_DASH);
  IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_DASH);
  IndicatorSetInteger(INDICATOR_LEVELSTYLE,2,STYLE_DASH);
      
  IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrTomato); 
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrAqua); 
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrTomato); 

  IndicatorSetString(INDICATOR_LEVELTEXT,0,"Compra"); 
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Espera"); 
   IndicatorSetString(INDICATOR_LEVELTEXT,2,"Vender") ;
    IndicatorSetInteger(INDICATOR_DIGITS,0);

   if( ArraySetAsSeries(RaeBufferA,true) && ArraySetAsSeries(RaeBufferB,true))
            printf("Both arrays set as time series");

Comment("GetLastError() ",GetLastError() );

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
  
    
    if(primeiraVez)
     
     {
          
  CopyBuffer(iRSI(_Symbol,_Period,Periodos,PRICE_WEIGHTED),0,0,rates_total,RaeBufferA);
   
   
   CopyBuffer(iMFI(_Symbol,_Period,Periodos,VOLUME_REAL),0,0,rates_total,RaeBufferB) ;
  
  primeiraVez = false;
  
            }
  
  
  
  CopyBuffer(iRSI(_Symbol,_Period,Periodos,PRICE_WEIGHTED),0,0,1,RaeBufferA);
   
   
   CopyBuffer(iMFI(_Symbol,_Period,Periodos,VOLUME_REAL),0,0,1,RaeBufferB) ;
  
   
//--- return value of prev_calculated for next call
   return(rates_total);
   }
//+------------------------------------------------------------------+
 
AnarcoPhysic:

Prezadíssimos,


Tentando montar combinados RSF e MFI (economia de espaço), estou com o seguinte problema. O comando if que estou utilizando para minimizar contas desnecessárias faz com que tudo nele não funcione e não estou conseguindo achar a causa. Para mim está tudo ok. Tenho certeza que alguém, batendo o olho, resolve. (não quero fritar mais com a aprendizagem da linguagem hoje - XD). Muito Obrigado! Aceito sujeitos para lidar melhor com o problema em questão - de evitar repetição de cálculos no OnCalculate.

Grato 



Bom, 

do jeito que está,  precisa do else do if.


   if(primeiraVez)
     {
      CopyBuffer(iRSI(_Symbol,_Period,Periodos,PRICE_WEIGHTED),0,0,rates_total,RaeBufferA);
      CopyBuffer(iMFI(_Symbol,_Period,Periodos,VOLUME_REAL),0,0,rates_total,RaeBufferB);
      primeiraVez=false;
     }
   else
     {
      CopyBuffer(iRSI(_Symbol,_Period,Periodos,PRICE_WEIGHTED),0,0,1,RaeBufferA);
      CopyBuffer(iMFI(_Symbol,_Period,Periodos,VOLUME_REAL),0,0,1,RaeBufferB);
     }
 
Rogerio Giannetti Torres:


Bom, 

do jeito que está,  precisa do else do if.


Obrigado pela milésima vez, Rogério. Mas, mais uma pergunta: por que a necessidade do else? O programa corre de qualquer jeito. Aliás, do jeito que está, a parte que não é lida é justamente a parte do if (e não a que esta fora dele). Ainda não entendi. 


Mas novamente, muito obrigado pela ajuda!!!

 
AnarcoPhysic:

Obrigado pela milésima vez, Rogério. Mas, mais uma pergunta: por que a necessidade do else? O programa corre de qualquer jeito. Aliás, do jeito que está, a parte que não é lida é justamente a parte do if (e não a que esta fora dele). Ainda não entendi. 


Mas novamente, muito obrigado pela ajuda!!!

Testei a proposta e não deu certo.


Daí pensei em mais uma coisa: Já que o else é o padrão, vale mais a pena inverter o conteúdo do if com o else e,juntamente a variável booleana, não? (mas reforçando, não deu certo!)

Não dá certo significou dar na mesma
 
AnarcoPhysic:

Testei a proposta e não deu certo.


Daí pensei em mais uma coisa: Já que o else é o padrão, vale mais a pena inverter o conteúdo do if com o else e,juntamente a variável booleana, não? (mas reforçando, não deu certo!)

Não dá certo significou dar na mesma

Bom dia,

a verdade é que não testei nada, só foquei se a lógica do IF estaria correta ou não, enfim segue o programa com correções.

//+------------------------------------------------------------------+
//|                                                  RSI and MFI.mq5 |
//|                                                  Daniel Bandeira |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Daniel Bandeira"

#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   2


//--- plot RSI and MFI
#property indicator_label1  "RSI"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "MFI"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrLime
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1




//--- indicator buffers
double         RaeBufferA[]; //RSI e MFI buffers
double         RaeBufferB[];

input   int       Periodos=14;

int rsiHandle,mfiHandle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

   IndicatorSetString(INDICATOR_SHORTNAME,"RSI (dogde blue) and MFI (lime) : (dual graph)");
   SetIndexBuffer(0,RaeBufferA,INDICATOR_DATA);
   SetIndexBuffer(1,RaeBufferB,INDICATOR_DATA);

   IndicatorSetInteger(INDICATOR_LEVELS,3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,30);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,70);

   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);

   IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,1);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1,1);
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,2,1);

   IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_DASH);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_DASH);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,2,STYLE_DASH);

   IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrTomato);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrAqua);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrTomato);

   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Compra");
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Espera");
   IndicatorSetString(INDICATOR_LEVELTEXT,2,"Vender");
   IndicatorSetInteger(INDICATOR_DIGITS,1);

   if(ArraySetAsSeries(RaeBufferA,true) && ArraySetAsSeries(RaeBufferB,true))
    printf("Both arrays set as time series");

   Comment("GetLastError() ",GetLastError());
   
   rsiHandle=iRSI(_Symbol,_Period,Periodos,PRICE_WEIGHTED);
   mfiHandle=iMFI(_Symbol,_Period,Periodos,VOLUME_REAL);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   if(prev_calculated==0)
     {
      if(CopyBuffer(rsiHandle,0,0,rates_total,RaeBufferA)<rates_total) return(0);
      if(CopyBuffer(mfiHandle,0,0,rates_total,RaeBufferB)<rates_total) return(0);
     }
     
   CopyBuffer(rsiHandle,0,0,1,RaeBufferA);
   CopyBuffer(mfiHandle,0,0,1,RaeBufferB);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Rogerio Giannetti Torres:

Bom dia,

a verdade é que não testei nada, só foquei se a lógica do IF estaria correta ou não, enfim segue o programa com correções.

Rogério,


Obrigado pela atenção e paciência. Eu já tinha quebrado a cabeça e já tinha corrigido. Mas valeu, achei a solução que você deu melhor e simples. Agradeço a paciência e boa vontade. No futuro, espero poder vir com dúvidas relevantes. 


Obrigado mesmo!

Razão: