DRAW_ZIGZAG

O estilo DRAW_ZIGZAG desenha segmentos da cor especifica baseada nos valor de dois buffers do indicador. Este estilo é muito similar ao DRAW_SECTION, mas ao contrário deste último, permite desenhar segmentos verticais dentro de uma barra, se os valores de ambos os buffers do indicador são definidos para este barra. Os segmentos são plotados a partir de um valor no primeiro buffer para um valor no segundo buffer do indicador. Nenhum dos buffers pode conter somente valores vazios, uma vez que neste caso nada é plotado.

A largura, cor e estilo da linha podem ser especificadas como para o estilo DRAW_SECTION - usando as diretivas de compilação ou dinamicamente usando a função PlotIndexSetInteger(). Mudanças dinâmicas das propriedades de plotagem permitem "avivar" os indicadores, de modo que suas aparências sejam alteradas dependendo da situação corrente.

Seções são desenhadas a partir de um valor não vazio de um buffer para um valor não vazio de outro buffer do indicador. Para especificar o valor que deve ser considerado como "vazio", defina esse valor na propriedade PLOT_EMPTY_VALUE:

//--- O valor 0 (vazio) não vai participar no desenho
   PlotIndexSetDouble(index_of_plot_DRAW_ZIGZAG,PLOT_EMPTY_VALUE,0);

Sempre preencher explicitamente os valores dos buffers do indicador, definir um valor vazio num buffer para ignorar barras.

O número de buffers requeridos para plotagem DRAW_ZIGZAG é 2.

Um exemplo de indicador de que plota uma serra com base nos altas e baixas dos preços. A cor, a largura eo estilo das linhas zigzag alteram aleatoriamente a cada N ticks.

Um exemplo de DRAW_ZIGZAG

Note que para inicializar plot1 com DRAW_ZIGZAG, as propriedades são definidas usando a diretiva de compilar #property, e então na função OnCalculate() estas propriedades são definidas aleatoriamente. O parâmetro N é definido nos parâmetros externos do indicador para a possibilidade de configuração manual (o guia Parâmetros na janela Propriedades do indicador).

//+------------------------------------------------------------------+
//|                                                  DRAW_ZIGZAG.mq5 |
//|                         Copyright 2000-2024, MetaQuotes Ltd. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property description "Um indicador para demonstrar DRAW_ZIGZAG"
#property description "Ele desenha uma \"serra\" como segmentos de reta, ignorando as barras de um dia"
#property description "O dia a ignorar é selecionado aleatoriamente durante a inicialização do indicador"
#property description "A cor, a largura e tamanho dos segmentos são alterados aleatoriamente"
#property description " a cada N ticks"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plotar ZigZag
#property indicator_label1  "ZigZag"
#property indicator_type1   DRAW_ZIGZAG
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- parâmetros de entrada
input int      N=5;              // Número de ticks para alterar 
//--- buffers do indicador
double         ZigZagBuffer1[];
double         ZigZagBuffer2[];
//--- O dia da semana, em que o indicador não é plotado
int invisible_day;
//--- Um array para armazenar as cores
color colors[]={clrRed,clrBlue,clrGreen};
//--- Um array para armazenar os estilos de linha
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado                 |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Arrays de ligação e buffers do indicador
   SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA);
//--- Obter um valor aleatório de 0 para 6, para este dia o indicador não é plotado
   invisible_day=MathRand()%6;
//--- O valor 0 (vazio) não vai participar no desenho
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- O valor 0 (vazio) não vai participar no desenho
   PlotIndexSetString(0,PLOT_LABEL,"ZigZag1;ZigZag2");
//---
   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[])
  {
   static int ticks=0;
//--- Calcule ticks para mudar o estilo, cor e largura da linha
   ticks++;
//--- Se um número suficiente de ticks foi acumulado
   if(ticks>=N)
     {
      //--- Alterar as propriedades da linha
      ChangeLineAppearance();
      //--- Redefinir o contador de ticks para zero
      ticks=0;
     }
 
//--- A estrutura de tempo é necessário para obter o dia da semana de cada barra
   MqlDateTime dt;
 
//--- A posição inicial dos cálculos
   int start=0;
//--- Se o indicador foi calculado com o tick anterior, então inicia o cálculo com o passado, mas de um tick
   if(prev_calculated!=0) start=prev_calculated-1;
//--- Calculando loop
   for(int i=start;i<rates_total;i++)
     {
      //--- Escreva o tempo de abertura da barra na estrutura
      TimeToStruct(time[i],dt);
      //--- Se o dia da semana desta barra é igual para invisible_day
      if(dt.day_of_week==invisible_day)
        {
         //--- Escrever valores vazios de buffers para este barra
         ZigZagBuffer1[i]=0;
         ZigZagBuffer2[i]=0;
        }
      //--- Se o dia da semana é OK, preencha os buffers
      else
        {
         //--- Se o número de barra é o mesmo
         if(i%2==0)
           {
            //---  Escrever High (alta) no primeiro buffer a Low (baixa) no segundo
            ZigZagBuffer1[i]=high[i];
            ZigZagBuffer2[i]=low[i];
           }
         //--- O número da barra é impar
         else
           {
            //--- Preenchimento da barra na ordem inversa
            ZigZagBuffer1[i]=low[i];
            ZigZagBuffer2[i]=high[i];
           }
        }
     }
//--- valor retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Alterar a aparência dos segmentos zigzag                         |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Uma string para a formação de informações sobre as propriedades de ZigZag
   string comm="";
//--- Um bloco para mudar a cor do ziguezague
   int number=MathRand(); // Obter um número aleatório
//--- O divisor é igual ao tamanho do array colors[]
   int size=ArraySize(colors);
//--- Obter o índice para selecionar uma nova cor como o restante da divisão inteira
   int color_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Escrever a cor da linha
   comm=comm+"\r\n"+(string)colors[color_index];
 
//--- Um bloco para alterar a largura da linha
   number=MathRand();
//--- Obter a largura do restante da divisão inteira
   int width=number%5;   // A largura é definida de 0 a 4
//--- Definir a cor com a propriedade PLOT_LINE_WIDTH
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Escrever a largura da linha
   comm=comm+"\r\nWidth="+IntegerToString(width);
 
//--- Um bloco para mudar o estilo da linha
   number=MathRand();
//--- O divisor é igual ao tamanho do array de estilos
   size=ArraySize(styles);
//--- Obter o índice para selecionar um novo estilo como o resto da divisão inteira
   int style_index=number%size;
//--- Definir a cor com a propriedade PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Escrever o estilo de linha
   comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- Adiciona informação sobre o dia que é omitido nos cálculos
   comm="\r\nDia não plotado - "+EnumToString((ENUM_DAY_OF_WEEK)invisible_day)+comm;
//--- Mostrar a informação no gráfico usando um comentário
   Comment(comm);
  }