Qual o Parametro esta errado ?

 

O objetivo do indicador e tracar linhas de resistencia mas nao estou

encotrando o erro alguem pode me ajudar

Desde Ja Agradeço

//+------------------------------------------------------------------+
//|                                                          S_R.mq5 |
//|                                      Bruno Goncalves Mascarenhas |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Bruno Goncalves Mascarenhas"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window

#property indicator_buffers 0;
#property  indicator_plots 0;

#define d_NomObjSub "SR_Sub_"
#define d_NomObjRes "SR_Res_"

input int I_TamCanTic = 1; // Tamanho do Canal em Tiks
     double U_TamCanCot; // Tamando do Canal em Cotacao

input int I_Met_A_Tot = 22; //Metodo A: Periodos
input int I_Met_A_Val = 5; // Metodo A :itens no Canal 
input int I_Met_A_Min = 6; // Metoda A :Minuto de itens

input int I_Met_B_Tot = 12; //Metodo B: Periodos
input int I_Met_B_Val = 6; // Metodo B :itens no Canal 
input int I_Met_B_Min = 3; // Metoda B :Minuto de itens

      int S_BarIniCal; //Barra onde se inicia o calculo para o primerio pivot 

int OnInit()
  {
   
   S_BarIniCal = MathMax(I_Met_A_Tot,I_Met_B_Tot); //inicio comeca onde tem barras suficientes para vereficacao
   S_BarIniCal = MathMax(1,          S_BarIniCal); // nunca iniciar antes de barra 1 (Segunda Barra)
   
   U_TamCanCot = MathMax(1,I_TamCanTic) * SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE   );
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int P_TotBarGra, //Total de barras no grafico
                const int P_TotBarCal, //Total de barras calculadas
                const datetime &P_BarHorAbe[], //Horario de inicio
                const double &P_BarPreAbe[],// Preco de abertura
                const double &P_BarPreMax[],// Preco Maxima
                const double &P_BarPreMin[],//Preco Minima
                const double &P_BarPreFec[],// Preco de Fechamento
                const long &P_BarVolTik[],//Volume em tick
                const long &P_BarPreRea[],//Volume Real
                const int &_BarAskBid[])//Spread
  {
//---
   int F_NumBarIni = MathMax(S_BarIniCal,P_TotBarCal); //numero de barras inicial para esta secao de calculo
   int F_UltBarCal = P_TotBarGra-1; //Ultima barra de calculo no grafico
   int F_NumBarCal = 0; //Numero de barras de Calculo atualmente trabalhada
   
   int F_PivBarIni = 0;// Pivot horario barra onde inicia a linha
   int F_PivBarTer = 0; // Pivot horario barra onde termina a linha
   int F_PivBarVal = 0;//Pivot total de barras valida (Dentro de Canal)
   int F_PivBarLim = 0;// Pivot total de barras limetes (Abaixo da Canal)
   double F_PivPreTra = 0; //Preco de trabalho (valor do pivot pra desenhar a barra)
   
   bool F_ExiPivBar = false; // Existe pivot na barra
   
   for(F_NumBarCal=F_NumBarIni;F_NumBarCal<F_UltBarCal;F_NumBarCal++) {
      if(P_BarHorAbe[F_NumBarCal] == D'2018.10.2 17:45:00')
      DebugBreak();
     
     F_ExiPivBar = ExisteResistencia(P_BarPreMax,U_TamCanCot,
                                     I_Met_A_Tot,I_Met_A_Val,I_Met_A_Min,
                                     F_NumBarCal,
                                     F_PivBarIni,F_PivBarTer,F_PivBarVal,F_PivBarLim,F_PivPreTra);
     
     if(F_ExiPivBar){
       DesenhaLinha(d_NomObjRes,P_BarHorAbe[F_PivBarIni],P_BarHorAbe[F_PivBarTer],F_PivPreTra,clrBlue);
       } else {
       F_ExiPivBar = ExisteResistencia(P_BarPreMax,U_TamCanCot,
                                        I_Met_B_Tot,I_Met_B_Val,I_Met_B_Min,
                                        F_NumBarCal,
                                        F_PivBarIni,F_PivBarTer,F_PivBarVal,F_PivBarLim,F_PivPreTra);
     if(F_ExiPivBar){
       DesenhaLinha(d_NomObjRes,P_BarHorAbe[F_PivBarIni],P_BarHorAbe[F_PivBarTer],F_PivPreTra,clrAqua);
       }
          }
            }
//--- return value of prev_calculated for next call
   return(P_TotBarGra);
  }
//+------------------------------------------------------------------+
 bool ExisteResistencia(
     const double &P_MatAmoTra[], // Matriz amostra para trabalho
           double P_TamCanCot,    // Tamanho do cancal de cotacao
                                  //----------------------------------------------------
           int    P_MetTraTot,    //Metodo de trabalho periodos
           int    P_MetTraVal,    //Metedo de trabalho maximo de itens no canal
           int    P_MetTraMin,    //Metodo de trabalho minimo de itens no canal
                                  //----------------------------------------------------
           int    P_IteAtuTra,    // Itens de atual trabalho
                                  //----------------------------------------------------
           int   &P_PivBarIni,    //Pivot barras de inicio
           int   &P_PivBarTer,    //Pivot barras de termino
           int   &P_PivTotCan,    //Pivot total de barras no canal
           int   &P_PivTotLib,     //Total de barras liberadoras (Abaixo da Canal)
           double &P_PivValTra      //Pivot preo de trabalho
           ){
           
           bool F_ValRetFun = false; //Valor de Retorno da Funcao
           bool F_LinSupAti = false; //Limite Superior atingido passou da maxima
           int  F_ItePriBar = P_IteAtuTra; //item primeira barra de pesquisa
           int  F_IteUltBar = P_IteAtuTra - P_MetTraTot;
           int  F_IteBarTra = 0;
           double F_LinSupCan = P_MatAmoTra[P_IteAtuTra] + P_TamCanCot;
           double F_LinInfCan = P_MatAmoTra[P_IteAtuTra] - P_TamCanCot;
           int  F_TotBarEnt = 0;
           #ifdef  _DEBUG
           Retangulo(F_ItePriBar,F_LinSupCan,F_IteUltBar,F_LinInfCan);
           #endif 
           P_PivTotCan = 0;
           P_PivTotLib = 1;
           P_PivBarIni = F_ItePriBar;
           P_PivValTra = P_MatAmoTra[P_IteAtuTra];
           for(F_IteBarTra=F_ItePriBar;F_ItePriBar>=F_IteUltBar;F_IteBarTra--){
            //Verifica se passou da maxima
            F_LinSupAti = P_MatAmoTra[P_IteAtuTra]>F_LinSupCan;
               //Verifica se passou fora da verificao
               if(F_LinSupAti)
               break;
               //Verifica se esta dentro do canal do pivot
               if((F_LinInfCan<=P_MatAmoTra[F_IteBarTra]) && (P_MatAmoTra[F_IteBarTra<=F_LinSupCan])){
                  P_PivTotCan++;//Incrementa a contagem de precos no canal do pivot
                  P_PivTotLib = P_PivTotLib + F_TotBarEnt;//Atualiza o Numero de Barras Abaixo
                  F_TotBarEnt = 0; //Recomeca a contagem de barras
                  P_PivBarTer = F_IteBarTra;
                }
                F_TotBarEnt++;
                }
                F_ValRetFun = (P_PivTotCan>=P_MetTraVal)
                            &&(P_PivTotLib>=P_MetTraMin);
       return(F_ValRetFun);
                 
   }
                 
void DesenhaLinha(
      string   P_ObjNomIde,//Nome Do objeto
      datetime P_ObjHorIni,//Horario
      datetime P_ObjHorTer,//Horario Termino
      double   P_ObjPreDes,
      color    P_ObjCorDes
      )
      {
      string F_NomObjTra = P_ObjNomIde + TimeToString(P_ObjHorIni);
      
      if(!ObjectFind(0,F_NomObjTra))
         ObjectDelete(0,F_NomObjTra);
         
         ObjectCreate(0,F_NomObjTra,OBJ_TREND,0,P_ObjHorIni,P_ObjPreDes,P_ObjHorTer,P_ObjPreDes);
         
         ObjectSetInteger(0,F_NomObjTra,OBJPROP_BACK,false);
         ObjectSetInteger(0,F_NomObjTra,OBJPROP_WIDTH,1);
         ObjectSetInteger(0,F_NomObjTra,OBJPROP_STYLE,STYLE_SOLID);
         ObjectSetInteger(0,F_NomObjTra,OBJPROP_SELECTED,false);
         ObjectSetInteger(0,F_NomObjTra,OBJPROP_SELECTABLE,false);
         ObjectSetInteger(0,F_NomObjTra,OBJPROP_COLOR,clrAntiqueWhite);
         ObjectSetInteger(0,F_NomObjTra,OBJPROP_RAY_LEFT,false);
         ObjectSetInteger(0,F_NomObjTra,OBJPROP_RAY_RIGHT,false);
         
         return;
  }
  
#ifdef _DEBUG
void Retangulo(int P_ItePriBar, double P_LimSupCan, int P_IteUltBar, double P_LimInfCan)
{
   string F_NomObjTra = "Linha";
   datetime F_HorIniTra[];
   datetime F_HorTerTra[];
   int F_TotBarGra = Bars (_Symbol,_Period);
   double F_PreCenCan = (P_LimSupCan+P_LimInfCan)/2.0;
   
   CopyTime(_Symbol,_Period,F_TotBarGra - P_ItePriBar - 1,1,F_HorIniTra);
   CopyTime(_Symbol,_Period,F_TotBarGra - P_IteUltBar - 1,1,F_HorTerTra);
   
   if(!ObjectFind(0,F_NomObjTra))
      ObjectDelete(0,F_NomObjTra);
      
      ObjectCreate(0,F_NomObjTra,OBJ_TREND,0,F_HorIniTra[0],F_PreCenCan,F_HorTerTra[0],F_PreCenCan);
      
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_BACK,false);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_WIDTH,1);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_STYLE,STYLE_SOLID);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_COLOR,clrOrange);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_RAY_LEFT,false);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_RAY_RIGHT,false);
      
      F_NomObjTra = "Retangulo";
      F_HorIniTra[0] += PeriodSeconds(_Period);
      F_HorTerTra[0] -= PeriodSeconds(_Period);
      
      if(ObjectFind(0,F_NomObjTra))
      ObjectDelete(0,F_NomObjTra);
      
      ObjectCreate(0,F_NomObjTra,OBJ_RECTANGLE,0,F_HorIniTra[0],P_LimSupCan,F_HorTerTra[0],P_LimInfCan);
       
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_BACK,false);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_WIDTH,1);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_STYLE,STYLE_SOLID);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_COLOR,clrYellow);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_RAY_LEFT,false);
      ObjectSetInteger(0,F_NomObjTra,OBJPROP_RAY_RIGHT,false);
      }
      #endif         
             
     
                 
               
                 
                  
                 
             
              
             
           


 

 
Isso pra mim é novidade :
#endif  
Entendo pouco de código, so quis deixar aqui meu espanto.
Caso você queira comentar o que tem acontecido de errado, posso tentar ajudar.
 
Bruno Gonçalves:

O objetivo do indicador e tracar linhas de resistencia mas nao estou

encotrando o erro alguem pode me ajudar

Desde Ja Agradeço


 

Ola amigo, 


Está dando erro de array out of range na linha 138,53


      if((F_LinInfCan<=P_MatAmoTra[F_IteBarTra]) && (P_MatAmoTra[F_IteBarTra<=F_LinSupCan]))
        {
         P_PivTotCan++;//Incrementa a contagem de precos no canal do pivot
         P_PivTotLib=P_PivTotLib+F_TotBarEnt;//Atualiza o Numero de Barras Abaixo
         F_TotBarEnt=0; //Recomeca a contagem de barras
         P_PivBarTer= F_IteBarTra;
        }
 
Lucas Tavares:
Isso pra mim é novidade :
Entendo pouco de código, so quis deixar aqui meu espanto.
Caso você queira comentar o que tem acontecido de errado, posso tentar ajudar.

Isso é um tipo de condição especial para o compilador. Você pode ver mais na documentação abaixo.


https://www.mql5.com/pt/docs/basis/preprosessor/conditional_compilation

Documentação sobre MQL5: Elementos Básicos da Linguagem / Preprocessador / Conditional Compilation (#ifdef, #ifndef, #else, #endif)
Documentação sobre MQL5: Elementos Básicos da Linguagem / Preprocessador / Conditional Compilation (#ifdef, #ifndef, #else, #endif)
  • www.mql5.com
As diretivas do pré-processador são usadas ​​pelo do compilador para pré-processamento do código fonte antes de sua compilação. A diretiva sempre começa com o Cada diretiva é descrita por um registro separado e opera antes da mudança de linha. Não se podem utilizar várias diretivas num só registro. Se o registro da diretiva for muito grande...
 

Você não está contando certo os números de elementos do vetor...

Teu índice está dando -1 em determinado momento...


for(F_IteBarTra=F_ItePriBar;F_ItePriBar>=F_IteUltBar;F_IteBarTra--)

;)

 

Ponha um Print() no FOR que você verá...


Print(ArraySize(P_MatAmoTra)," - ", F_IteBarTra);
               if((F_LinInfCan<=P_MatAmoTra[F_IteBarTra]) && (P_MatAmoTra[F_IteBarTra<=F_LinSupCan])){
Razão: