Indicadores: iGDR_Fractal_Levels

 

iGDR_Fractal_Levels:

O indicador iGDR_Fractal_Levels exibe os valores médios dos fractais sobre um determinado período de tempo. O indicador mostra apenas três níveis no gráfico mostrando-os em cores diferentes. Os mesmos níveis são plotados à direita dos rótulos de texto, considerando a variação utilizada para o cálculo do valor médio.

O indicador funciona da seguinte maneira. O intervalo de tempo gráfico do fim para o começo é selecionado, mas um número estritamente limitado de barras especificadas nos parâmetros do indicador são tomadas ao mesmo tempo. A busca por fractais é realizada neste intervalo. Três níveis de preços com o maior número de fractais são calculados depois do preço de cada fractal ser determinado. Então, o preço médio é encontrado entre eles. Este preço médio é exibido pelo indicador, enquanto que o spread dos preços de outros fractais ampliam o tamanho da linha, já que esta propagação é o nível mais poderoso.

Apenas três níveis de preços são formados, de todos os fractais, pelo indicador. Cada um dos três possui sua própria cor, dependendo do número de fractais inclusos na formação desse nível. O nível mais forte está em vermelho, do meio está em amarelo, enquanto que o mais fraco está em verde, sendo que este último também deve ser levado em conta.

iGDR_Fractal_Levels

Autor: Nikolay Kositsin

 
Por que há apenas um limite de 200 barras?
 
Bom indicador... Bom trabalho...
 
Automated-Trading:

iGDR_Fractal_Levels:

Autor: Nikolay Kositsin

O indicador não funciona
 
Infelizmente, sim. Ele não funciona. 4 erros de compilação, e erros estúpidos. Mas o indicador é interessante.
 

Obteve um erro durante a compilação

como corrigi-lo

 
não é possível compilar devido a erros
 
Benkele Goitsemodimo # não é possível compilar devido a erros

Corrigido.

Arquivos anexados:
 

//Código corrigido

      //+------------------------------------------------------------------+
//|iGDR_Fractal_Levels.mq5
//| Direitos autorais © 2008-2009, GreenDog, Rússia
//|krot@inbox.ru |
//+------------------------------------------------------------------+
//---- indicator authorship
#property copyright "Direitos autorais © 2008-2009, GreenDog."
//---- link para o site do autor
#property link      "krot@inbox.ru"
//---- número da versão do indicador
#property version   "1.00"
//---- desenhar indicador na janela principal
#property indicator_chart_window 
#property indicator_buffers  1
#property indicator_plots    1
//+----------------------------------------------+
//|| Declaração de uma enumeração
//+----------------------------------------------+
enum FRACTAL_MODE
  {
   MODE_HIGH_LOW=0, // por extrema
   MODE_LOW,        // por vértice
   MODE_HIGH        // por calhas
  };
//+----------------------------------------------+
//|| Declaração de uma enumeração
//+----------------------------------------------+
enum FRACTAL_TYPE
  {
   TYPE1=0, // rigoroso
   TYPE2    // não restrito
  };
//+----------------------------------------------+
//|| Parâmetros de entrada do indicador
//+----------------------------------------------+
input uint frNum_=2;                      // Número de barras do fractal, 2 = fractal de 5 barras, 3 = fractal de 7 barras etc.
input FRACTAL_TYPE frType= TYPE2;         // Tipo de definição fractal 0=estrito, 1=não estrito
input FRACTAL_MODE frMode =MODE_HIGH_LOW; // Modo 
input double dlt_=0.24;                   // Erro da altura média da barra
input uint sBars_=200;                    // Número de barras (máx. 200)
//----
input color  BG1_Color = PaleGreen;  // Cor de fundo dos primeiros níveis
input color  TL1Color  = Green;      // Cor das linhas do primeiro nível
input color  BG2_Color = Yellow;     // Cor de fundo dos segundos níveis
input color  TL2Color  = DarkOrange; // Cor das linhas dos segundos níveis
input color  BG3_Color = Pink;       // Cor de fundo dos terceiros níveis
input color  TL3Color  = Red;        // Cor das linhas de terceiro nível
//+----------------------------------------------+
uint lastBars=0;
uint frNum,sBars;
datetime lastTime=0;
color BGColor[3],TLColor[3];
double aData[240][2],aRes[3][2];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado
//+------------------------------------------------------------------+ 
void OnInit()
  {
//---- inicialização de constantes
   frNum=frNum_;
   if(frNum_<2) frNum=2;
   sBars=sBars_;
   if(sBars_>200) sBars=200;
   if(sBars_<10) sBars=10;
   BGColor[0]=BG1_Color;
   BGColor[1]=BG2_Color;
   BGColor[2]=BG3_Color;
   TLColor[0]=TL1Color;
   TLColor[1]=TL2Color;
   TLColor[2]=TL3Color;
//----
  }
//+------------------------------------------------------------------+
//| Criação de um rótulo de texto|
//+------------------------------------------------------------------+
void CreateTextLabel(long     chart_id,   // identificador de gráfico
                     string   name,       // nome do objeto
                     int      nwin,       // índice da janela
                     datetime time1,      // tempo de 1 nível de preço
                     double   price1,     // 1 nível de preço
                     color    Color,      // cor da linha
                     string   text,       // texto
                     string   font,       // fonte 
                     int      fontsize)   // tamanho da fonte
  {
//----
   ObjectCreate(chart_id,name,OBJ_TEXT,nwin,time1,price1);
   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
   ObjectSetInteger(chart_id,name,OBJPROP_BACK,true);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true);
   ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true);
   ObjectSetString(chart_id,name,OBJPROP_FONT,font);
   ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
   ObjectSetInteger(chart_id,name,OBJPROP_FONTSIZE,fontsize);
//----
  }
//+------------------------------------------------------------------+
//|| Redefinição do rótulo de texto|
//+------------------------------------------------------------------+
void SetTextLabel(long     chart_id,    // identificador de gráfico
                  string   name,        // nome do objeto
                  int      nwin,        // índice da janela
                  datetime time1,       // tempo de 1 nível de preço
                  double   price1,      // 1 nível de preço
                  color    Color,       // cor da linha
                  int      style,       // estilo de linha
                  int      width,       // espessura da linha
                  string   text,        // texto
                  string   font,        // fonte
                  int      fontsize)    // tamanho da fonte
  {
//----
   if(ObjectFind(chart_id,name)==-1)
     {
      CreateTextLabel(chart_id,name,nwin,time1,price1,Color,text,font,fontsize);
     }
   else
     {
      ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
      ObjectMove(chart_id,name,0,time1,price1);
      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
     }
//----
  }
//+------------------------------------------------------------------+
//| Criação de um canal|
//+------------------------------------------------------------------+
void CreateChannel(long     chart_id,      // identificador de gráfico
                   string   name,          // nome do objeto
                   int      nwin,          // índice da janela
                   datetime time1,         // tempo de 1 nível de preço
                   double   price1,        // 1 nível de preço
                   datetime time2,         // hora do nível de preço 2
                   double   price2,        // 2 nível de preços
                   datetime time3,         // hora do nível de preço 3
                   double   price3,        // 3 nível de preços
                   color    Color,         // cor da linha
                   int      style,         // estilo de linha
                   int      width,         // espessura da linha
                   string   text)          // texto
  {
//----
   ObjectCreate(chart_id,name,OBJ_CHANNEL,nwin,time1,price1,time2,price2);
   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
   ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style);
   ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width);
   ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
   ObjectSetInteger(chart_id,name,OBJPROP_FILL,true);
   ObjectSetInteger(chart_id,name,OBJPROP_BACK,true);
   ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true);
   ObjectSetInteger(chart_id,name,OBJPROP_RAY,true);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true);
   ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true);
//----
  }
//+------------------------------------------------------------------+
//|| Reinstalação do canal|
//+------------------------------------------------------------------+
void SetChannel(long     chart_id,    // identificador de gráfico
                string   name,        // nome do objeto
                int      nwin,        // índice da janela
                datetime time1,       // tempo de 1 nível de preço
                double   price1,      // 1 nível de preço
                datetime time2,       // hora do nível de preço 2
                double   price2,      // 2 nível de preços
                datetime time3,       // hora do nível de preço 3
                double   price3,      // 3 nível de preços
                color    Color,       // cor da linha
                int      style,       // estilo de linha
                int      width,       // espessura da linha
                string   text)        // texto
  {
//----
   if(ObjectFind(chart_id,name)==-1)
     {
      CreateChannel(chart_id,name,nwin,time1,price1,time2,price2,time3,price3,Color,style,width,text);
     }
   else
     {
      ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
      ObjectMove(chart_id,name,0,time1,price1);
      ObjectMove(chart_id,name,1,time2,price2);
      ObjectMove(chart_id,name,2,time3,price3);
      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
     }
//----
  }
//+------------------------------------------------------------------+
//| Criação de uma linha de tendência|
//+------------------------------------------------------------------+
void CreateTline(long     chart_id,    // identificador de gráfico
                 string   name,        // nome do objeto
                 int      nwin,        // índice da janela
                 datetime time1,       // tempo de 1 nível de preço
                 double   price1,      // 1 nível de preço
                 datetime time2,       // hora do nível de preço 2
                 double   price2,      // 2 nível de preços
                 color    Color,       // cor da linha
                 int      style,       // estilo de linha
                 int      width,       // espessura da linha
                 string   text)        // texto
  {
//----
   ObjectCreate(chart_id,name,OBJ_TREND,nwin,time1,price1,time2,price2);
   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
   ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style);
   ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width);
   ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
   ObjectSetInteger(chart_id,name,OBJPROP_BACK,false);
   ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true);
   ObjectSetInteger(chart_id,name,OBJPROP_RAY,true);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true);
   ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true);
//----
  }
//+------------------------------------------------------------------+
//|| Redefinição da linha de tendência|
//+------------------------------------------------------------------+
void SetTline(long     chart_id,    // identificador de gráfico
              string   name,        // nome do objeto
              int      nwin,        // índice da janela
              datetime time1,       // tempo de 1 nível de preço
              double   price1,      // 1 nível de preço
              datetime time2,       // hora do nível de preço 2
              double   price2,      // 2 nível de preços
              color    Color,       // cor da linha
              int      style,       // estilo de linha
              int      width,       // espessura da linha
              string   text)        // texto
  {
//----
   if(ObjectFind(chart_id,name)==-1)
     {
      CreateTline(chart_id,name,nwin,time1,price1,time2,price2,Color,style,width,text);
     }
   else
     {
      ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
      ObjectMove(chart_id,name,0,time1,price1);
      ObjectMove(chart_id,name,1,time2,price2);
      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
     }
//----
  }
//+------------------------------------------------------------------+
//| Encontrando o fractal superior|
//+------------------------------------------------------------------+ 
bool upFrac(int cnt,const double &High[])
  {
//----
   for(int i=1; i<=int(frNum); i++)
     {
      if(frType==TYPE1)
        {
        //---- se a condição for rigorosa e as barras posteriores ou anteriores estiverem acima do valor do vizinho - sem fractal
         if(High[cnt+i]>=High[cnt+i-1] || High[cnt-i]>=High[cnt-i+1]) return(false);
        }
      else
        { 
        //---- se a condição não for rigorosa e as barras posteriores ou anteriores estiverem acima do centro - sem fractal
         if(High[cnt+i]>High[cnt] || High[cnt-i]>High[cnt]) return(false);
        }
     }
//----
   return(true);
  }
//+------------------------------------------------------------------+
//| Encontrando o fractal inferior|
//+------------------------------------------------------------------+ 
bool dwFrac(int cnt,const double &Low[])
  {
//----
   for(int i=1; i<=int(frNum); i++)
     {
      if(frType==TYPE1)
        { 
         //---- se a condição estrita e as barras posteriores ou anteriores forem inferiores às do vizinho - sem fractal
         if(Low[cnt+i]<=Low[cnt+i-1] || Low[cnt-i]<=Low[cnt-i+1]) return(false);
        }
      else
        { 
         //---- se a condição não for rigorosa e as barras posteriores ou anteriores estiverem abaixo do centro - sem fractal
         if(Low[cnt+i]<Low[cnt] || Low[cnt-i]<Low[cnt]) return(false);
        }
     }
//----
   return(true);
  }
//+------------------------------------------------------------------+
//| Função de desinicialização do indicador personalizado
//+------------------------------------------------------------------+ 
void OnDeinit(const int reason)
  {
//----
   Comment("");
   for(int i=0; i<3; i++)
     {
      string name="IPGDR_Lv"+string(i);
      ObjectDelete(0,name);
      ObjectDelete(0,name+"Up");
      ObjectDelete(0,name+"Dw");
      ObjectDelete(0,name+"Tx");
     }
//----
  }
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizado
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,    // quantidade de histórico em barras no tique atual
                const int prev_calculated,// quantidade de histórico em barras no tique anterior
                const datetime &time[],
                const double &open[],
                const double& high[],     // array de preços máximos para o cálculo do indicador
                const double& low[],      // matriz de preços mínimos para o cálculo do indicador
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---- verificar se o número de barras é suficiente para o cálculo
   if(rates_total<int(sBars)) return(0);

//---- indexação de elementos em matrizes, como em séries temporais 
   ArraySetAsSeries(time,true);
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);

   lastBars=rates_total;

//---- busca por fractais, coloca-os na matriz, mas não mais do que o número permitido de fractais.
   int sh=0;
   ArrayInitialize(aData,0);
   double lastExt=0;
   int total=int(sBars-2*frNum);
   int start=int(frNum+1);

   for(int i=start; i<total; i++)
     {
    // se(frMode!=MODE_LOW && upFrac(i,high))
    if(frMode!=FRACTAL_MODE::MODE_LOW && upFrac(i,high))
        { 
         //---- adicionar vértices [exceto no modo de canal]
         //---- pular vértices vizinhos duplicados em condições não restritas
         if(!(frType!=TYPE1 && lastExt>0 && lastExt==high[i]))
           {
            aData[sh][0]=high[i];
            lastExt=high[i];
            sh++;
           }
        }

      if(sh>=240) break;

     // se(frMode!=MODE_HIGH && dwFrac(i,low))
     if(frMode!=FRACTAL_MODE::MODE_HIGH && dwFrac(i,low))
        { 
         //---- adicionar depressões [exceto no modo de vértice]
         //---- pular calhas vizinhas duplicadas em condições não restritas
         if(!frType!=TYPE1 && lastExt>0 && lastExt==low[i])
           {
            aData[sh][0]=low[i];
            lastExt=low[i];
            sh++;
           }
        }
      if(sh>=240) break;
     }

//---- determinar o spread médio da vela e a tolerância correspondente
   double dlt,sHL=0;
   for(int i=1; i<=int(sBars); i++) sHL+=(high[i]-low[i]);
   sHL/=sBars;
   dlt=sHL*dlt_;

//---- definir classificações para cada nível
   for(int i=0; i<sh; i++)
      for(int j=i+1; j<sh; j++)
         if(aData[j][0]>aData[i][0]-dlt && aData[j][0]<aData[i][0]+dlt)
           {
            aData[i][1]+=1;
            aData[j][1]+=1;
           }

//---- identificar os três níveis mais fortes
   double cur[2],tmp[2];
   aRes[0][0]=aData[0][0];
   aRes[0][1]=aData[0][1];

   for(int i=1; i<sh; i++)
     {
      cur[0]=aData[i][0];
      cur[1]=aData[i][1];

      if(cur[1]>aRes[0][1])
        { 
         //---- se a classificação for maior que a classificação 1, então a classificação 1 se torna a atual
         tmp[0]=aRes[0][0];
         tmp[1]=aRes[0][1];
         aRes[0][0]=cur[0];
         aRes[0][1]=cur[1];
         cur[0]=tmp[0];
         cur[1]=tmp[1];
        }

      //---- se a classificação for maior que o 2º lugar e ainda assim não pertencer ao 1º lugar, substitua o 2º lugar
      if(cur[1]>aRes[1][1] && (cur[0]<aRes[0][0]-dlt || cur[0]>aRes[0][0]+dlt))
        {
         tmp[0]=aRes[1][0]; tmp[1]=aRes[1][1]; aRes[1][0]=cur[0]; aRes[1][1]=cur[1]; cur[0]=tmp[0]; cur[1]=tmp[1];
        }
      //---- se a classificação for maior do que o 3º lugar e ainda assim não pertencer ao 1º e 2º lugares, substitua o 3º lugar
      if(cur[1]>aRes[2][1] && (cur[0]<aRes[0][0]-dlt || cur[0]>aRes[0][0]+dlt) && (cur[0]<aRes[1][0]-dlt || cur[0]>aRes[1][0]+dlt))
        {
         aRes[2][0]=cur[0];
         aRes[2][1]=cur[1];
        }
     }

   for(int i=0; i<3; i++)
     {
      double dwL=aRes[i][0]-dlt,upL=aRes[i][0]+dlt;
      string name="IPGDR_Lv"+string(i);

      SetChannel(0,name,0,time[24],upL,time[1],upL,time[24],dwL,BGColor[i],STYLE_SOLID,1,name);
      SetTline(0,name+"Up",0,time[24],upL,time[1],upL,TLColor[i],STYLE_SOLID,1,name+"Up");
      SetTline(0,name+"Dw",0,time[24],dwL,time[1],dwL,TLColor[i],STYLE_SOLID,1,name+"Dw");
      SetTextLabel(0,name+"Tx",0,time[32],upL+2*_Point,TLColor[i],STYLE_SOLID,1,DoubleToString(aRes[i][0],_Digits),"tahoma",14);
     }

//---- exibir comentários
   string rem1="",rem2="";
   if(frType==TYPE2) rem1=rem1+"Clássico";
   else rem1=rem1+"Estritamente";

   rem1=rem1+string(frNum*2+1)+"-Fractais de barra".;
  // se(frMode==MODE_LOW) rem1=rem1+", troughs";
 if(frMode==FRACTAL_MODE::MODE_LOW) rem1=rem1+", fundos.";
   //caso contrário, se (frMode==MODE_HIGH) rem1=rem1+", vertex";
else if(frMode==FRACTAL_MODE::MODE_HIGH) rem1=rem1+", parte superior.";
   rem1=rem1+"\nEncontrado."+string(sh)+" fractal(s) \n Níveis mais fortes ";

   StringConcatenate(rem2,aRes[0][0],"[",aRes[0][1],"], ",
                     aRes[1][0],"[",aRes[1][1],"], ",aRes[2][0],"[",aRes[2][1],
                     "], error ±",NormalizeDouble(dlt/_Point,1),"parágrafo(s)");
   Comment(rem1+rem2);

//----
   ChartRedraw(0);
//---- 
   return(rates_total);
  }
//+------------------------------------------------------------------+