DRAW_SECTION

DRAW_SECTION desenha seções da cor específica pelos valores do buffer do indicador. A largura, cor e estilo da linha podem ser especificadas como para o estilo DRAW_LINE - 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 para outro valor não vazio do buffer de indicador, valores vazios são ignorados. Para especificar qual o valor que deve ser considerado como "vazio", defina esse valor na propriedade PLOT_EMPTY_VALUE: Por exemplo, se o indicador deve ser desenhado como uma seqüência de seções sobre valores diferentes de zero, então você precisa definir o valor zero como um vazio:

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

Sempre preencha explicitamente nos valores dos buffers do indicador, defina um valor vazio num buffer para os elementos que não devem ser plotados.

O número de buffers requeridos para plotagem de DRAW_SECTION é 1.

Um exemplo do indicador que desenha seções entre os preços de Alta (high) e de Baixa (low). A cor, a largura, e o estilo de todas seções mudam aleatoriamente a cada N ticks.

Um exemplo de DRAW_SECTION

Note que para inicializar plot1 com DRAW_SECTION, as propriedades são definidas usando a diretiva do compilador #property, e então na função OnCalculate(), estas três 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_SECTION.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_SECTION"
#property description "Desenha seções em linha reta para cada barra"
#property description "A cor, a largura eo estilo de seções são alteradas aleatoriamente"
#property description "depois de cada N ticks"
 
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plotar Seção
#property indicator_label1  "Seção"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- parâmetros de entrada
input int      bars=5;           // O comprimento das seções nas barras
input int      N=5;              // O número de ticks para mudar o estilo das seções
//--- Um buffer do indicador para plotar
double         SectionBuffer[];
//--- Uma variável auxiliar para calcular extremidades das seções
int            divider;
//--- 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()
  {
//--- Ligando um array e um buffer de indicador
   SetIndexBuffer(0,SectionBuffer,INDICATOR_DATA);
//--- O valor 0 (vazio) não vai participar no desenho
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- Verifica o parâmetro do indicador
   if(bars<=0)
     {
      PrintFormat("Valor invalido do parâmetro da barra=%d",barras);
      return(INIT_PARAMETERS_INCORRECT);
     }
   else divider=2*bars;
//---+
   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 crítico de ticks tem sido acumulado
   if(ticks>=N)
     {
      //--- Alterar as propriedades da linha
      ChangeLineAppearance();
      //--- Redefinir o contador de ticks para zero
      ticks=0;
     }
 
//--- O número de barra a partir da qual o cálculo dos valores do indicador inicia
   int start=0;
//--- Se o indicador foi calculado antes, então definir o início na barra anterior
   if(prev_calculated>0) start=prev_calculated-1;
//--- Aqui estão todos os cálculos dos valores do indicador
   for(int i=start;i<rates_total;i++)
     {
      //--- Obter um resto da divisão do número de barra por 2*Barras
      int rest=i%divider;
      //--- Se o número de barra é divisível por 2*Barras
      if(rest==0)
        {
         //--- Definir o final da seção na alta de preço desta barra
         SectionBuffer[i]=high[i];
        }
      //---Se o resto da divisão é igual para barras, 
      else
        {
         //--- Definir o final da seção na alta de preço desta barra
         if(rest==bars) SectionBuffer[i]=low[i];
         //--- Se nada aconteceu, ignore a barra - definir 0
         else SectionBuffer[i]=0;
        }
     }
//--- Retorna o valor de prev_calculated para a próxima chamada da função
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Alterar a aparência das seções no indicador                      |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Uma string para a formação de informações sobre as propriedades de linha
   string comm="";
//--- Um bloco de mudança da cor da linha
   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 largura
   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;
//--- define o estilo da linha
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Escrever o estilo de linha
   comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- Mostrar a informação no gráfico usando um comentário
   Comment(comm);
  }