Fractal - Ajuda para Atualizar Bill Williams

 

Boa Noite Pessoal, Tudo bem ?

Me chama Micheli, estou estudando a parte de programação para MQL5.

Hoje me deparei com um problema que só consegui resolver no EA e não pela prog do indicador.

Vamos lá, atualmente estou vendo o gráfico de "Mini Dolar" no tempo "M5", coloquei no gráfico o indicador Fractal de Bill, o mesmo segue a seguinte premissa, quando um candle tiver o high maior que os dois anteriores e os dois posteriores ele gera uma seta para cima, o mesmo porem invertido para baixo, segue o indicador dele que vem junto com o MetaTrader 5

//+------------------------------------------------------------------+
//|                                                     Fractals.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_ARROW
#property indicator_color1  Gray
#property indicator_color2  Gray
#property indicator_label1  "Fractal Up"
#property indicator_label2  "Fractal Down"
//---- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
  }
//+------------------------------------------------------------------+
//|  Accelerator/Decelerator Oscillator                              |
//+------------------------------------------------------------------+
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[])
  {
   int i,limit;
//---
   if(rates_total<5)
      return(0);
//---
   if(prev_calculated<7)
     {
      limit=2;
      //--- clean up arrays
      ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
      ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
     }
   else limit=rates_total-5;

   for(i=limit;i<rates_total-3 && !IsStopped();i++)
     {
      //---- Upper Fractal
      if(high[i]>high[i+1] && high[i]>high[i+2] && high[i]>=high[i-1] && high[i]>=high[i-2])
         ExtUpperBuffer[i]=high[i];
      else ExtUpperBuffer[i]=EMPTY_VALUE;

      //---- Lower Fractal
      if(low[i]<low[i+1] && low[i]<low[i+2] && low[i]<=low[i-1] && low[i]<=low[i-2])
         ExtLowerBuffer[i]=low[i];
      else ExtLowerBuffer[i]=EMPTY_VALUE;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }

//+------------------------------------------------------------------+


Gostaria de realizar a seguente alteração, ao invés de uma seta gerar uma linha de tendencia entre o high ( quando a seta for para cima ) e o low ( quando a seta for para baixo ), porem supondo que venha dois fractal high em sequencia, ele verifica qual é o maior para gerar a linha e o mesmo para quando vir dois fractal low, ele verifica qual é o menor para gerar a linha de tendencia.

Segue em anexo imagem de como seria o resultado final da programação.


Segue como fiz a programação no corpo do EA, porem não consigo para indicador, poderiam me ajudar a fazer essa implementação ?


if(ContaCandle > 6)             // Precisa de pelo menos 6 candle para começar pois ele compara o candle 3 com 1-2-4-5
     {
       if(                      // Se o candle 3 tiver o HIGH maior que os dois anteriores e os dois posteriores
            velas[3].high > velas[1].high &&
            velas[3].high > velas[2].high &&
            velas[3].high > velas[4].high &&
            velas[3].high > velas[5].high 
         )
         {   
             if(ContaFractal == 1 && velas[3].high > FractalUPValor[0])         // Se o candle 3 tiver um HIGH em sequencia utilizar apenas o com valor MAIOR
             {
              FractalUPValor[0] = velas[3].high; FractalUPTime[0] = velas[3].time;  
             }
             if(ContaFractal == 0 || ContaFractal == 2)                         // Se o candle 3 tiver um HIGH depois de um LOW
             {
              FractalUPValor[6]=FractalUPValor[5];FractalUPTime[6]=FractalUPTime[5];
              FractalUPValor[5]=FractalUPValor[4];FractalUPTime[5]=FractalUPTime[4];
              FractalUPValor[4]=FractalUPValor[3];FractalUPTime[4]=FractalUPTime[3];
              FractalUPValor[3]=FractalUPValor[2];FractalUPTime[3]=FractalUPTime[2];
              FractalUPValor[2]=FractalUPValor[1];FractalUPTime[2]=FractalUPTime[1];
              FractalUPValor[1]=FractalUPValor[0];FractalUPTime[1]=FractalUPTime[0];
           
              FractalUPValor[0] = velas[3].high; FractalUPTime[0] = velas[3].time;
              ContaFractal=1;
             }
         }
         
       if(              // Se o candle 3 tiver o LOW maior que os dois anteriores e os dois posteriores
            velas[3].low < velas[1].low &&
            velas[3].low < velas[2].low &&
            velas[3].low < velas[4].low &&
            velas[3].low < velas[5].low 
         )
         {
             if(ContaFractal == 2 && velas[3].low < FractalDOWNValor[0] )               // Se o candle 3 tiver um LOW em sequencia utilizar apenas o com valor MENOR
             {
              FractalDOWNValor[0] = velas[3].low; FractalDOWNTime[0] = velas[3].time; 
             }
             if(ContaFractal == 0 || ContaFractal == 1)                                 // Se o candle 3 tiver um LOW depois de um HIGH
               {
              FractalDOWNValor[6]=FractalDOWNValor[5];FractalDOWNTime[6]=FractalDOWNTime[5];
              FractalDOWNValor[5]=FractalDOWNValor[4];FractalDOWNTime[5]=FractalDOWNTime[4];
              FractalDOWNValor[4]=FractalDOWNValor[3];FractalDOWNTime[4]=FractalDOWNTime[3];
              FractalDOWNValor[3]=FractalDOWNValor[2];FractalDOWNTime[3]=FractalDOWNTime[2];
              FractalDOWNValor[2]=FractalDOWNValor[1];FractalDOWNTime[2]=FractalDOWNTime[1];
              FractalDOWNValor[1]=FractalDOWNValor[0];FractalDOWNTime[1]=FractalDOWNTime[0];
         
              FractalDOWNValor[0] = velas[3].low; FractalDOWNTime[0] = velas[3].time;
              ContaFractal=2;
             }
         }                
     }  


Agradeço a todos desde já.

Muito Obrigada comunidade :)

Arquivos anexados:
Duvida.png  162 kb
 
MicheliBarcello:

Boa Noite Pessoal, Tudo bem ?

Me chama Micheli, estou estudando a parte de programação para MQL5.

Hoje me deparei com um problema que só consegui resolver no EA e não pela prog do indicador.

Vamos lá, atualmente estou vendo o gráfico de "Mini Dolar" no tempo "M5", coloquei no gráfico o indicador Fractal de Bill, o mesmo segue a seguinte premissa, quando um candle tiver o high maior que os dois anteriores e os dois posteriores ele gera uma seta para cima, o mesmo porem invertido para baixo, segue o indicador dele que vem junto com o MetaTrader 5


Gostaria de realizar a seguente alteração, ao invés de uma seta gerar uma linha de tendencia entre o high ( quando a seta for para cima ) e o low ( quando a seta for para baixo ), porem supondo que venha dois fractal high em sequencia, ele verifica qual é o maior para gerar a linha e o mesmo para quando vir dois fractal low, ele verifica qual é o menor para gerar a linha de tendencia.

Segue em anexo imagem de como seria o resultado final da programação.


Segue como fiz a programação no corpo do EA, porem não consigo para indicador, poderiam me ajudar a fazer essa implementação ?



Agradeço a todos desde já.

Muito Obrigada comunidade :)

Cabeçadas Eternas, como te disse há meses atrás...

Você acha que consegue consultoria gratuita aqui no Fórum...