Como plotar (via código) objeto gráfico na janela separada do indicador?

 

Boa tarde,


Criei um indicador super básico, só pra me mostrar a amplitude das velas através de um histograma. Não procurei um pronto, com certeza deve existir um desses na base de código, mas resolvi fazer o meu próprio, pra me desafiar na aprendizagem, pois não sou programador, mas levo o estudo a sério. Chega de enrolação, enfim, não estou conseguindo plotar um linha horizontal na janela do indicador, ou seja, em cima do histograma e não da janela principal. Alguém pode me dar uma luz? Grato

No caso, eu gostaria que existisse essa linha pontilhada como mostrado acima, inserida no próprio código.

Segue meu código:

#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
//---especificar quantidade de buffers e e de plotagens
#property indicator_buffers 2
#property indicator_plots   2
//--- plotar Histograma
#property indicator_label1  "Amplitude"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrGreen
#property indicator_width1  5
#property indicator_style1  STYLE_SOLID
//--- plotar Média Móvel
#property indicator_label2  "MA_Amplitude"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDeepPink
#property indicator_width2  3
#property indicator_style2  STYLE_SOLID
//+------------------------------------------------------------------+
//|                            BIBLIOTECAS                           |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>
//+------------------------------------------------------------------+
//|                              CLASSES                             |
//+------------------------------------------------------------------+
CChartObjectHLine nivel;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
//---variáveis globais
input int MA_Period = 110;
input double nivelValue = 3000;//Valor do Nível
//--- buffers do indicador
double HSTGR_Buffer[];
double MA_Buffer[];
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,HSTGR_Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,MA_Buffer,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
  
  
//---nível

/* MEU PROBLEMA ESTÁ LOGO ABAIXO
               |
               |
               |
               V
               
nivel.Create(0,"Nível",?,nivelValue);
nivel.Style(STYLE_DASH);

*/


//---
   if(prev_calculated==0)//calcula o indicador (menos a derradeira barra) apenas na primeira passagem.
     {
      for(int i=0; i<rates_total; i++)
        {
         HSTGR_Buffer[i]=high[i]-low[i];//amplitude de 1 vela
        }
     }
   else
      HSTGR_Buffer[rates_total-1]=high[rates_total-1]-low[rates_total-1];//calcula o restante do indicador para cada nova barra.
//---
if(prev_calculated==0)
  {
   for(int i=MA_Period-1; i<rates_total; i++)
     {
      double MA = 0;
      for(int j=0; j<MA_Period; j++)
        {
         MA = MA + (high[i-j]-low[i-j]) / MA_Period;
        }
      MA_Buffer[i] = MA;
     }
  }
  else
    {
   for(int i=rates_total-MA_Period; i<rates_total; i++)//situação em que rates_total é igual ao período da média móvel
     {
      double MA = 0;
      for(int j=0; j<MA_Period; j++)
        {
         MA = MA + (high[i-j]-low[i-j]) / MA_Period;
        }
      MA_Buffer[i] = MA;
     }
    }
    
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Daniel D.:

Boa tarde,


Criei um indicador super básico, só pra me mostrar a amplitude das velas através de um histograma. Não procurei um pronto, com certeza deve existir um desses na base de código, mas resolvi fazer o meu próprio, pra me desafiar na aprendizagem, pois não sou programador, mas levo o estudo a sério. Chega de enrolação, enfim, não estou conseguindo plotar um linha horizontal na janela do indicador, ou seja, em cima do histograma e não da janela principal. Alguém pode me dar uma luz? Grato

No caso, eu gostaria que existisse essa linha pontilhada como mostrado acima, inserida no próprio código.

Segue meu código:

Boa tarde!


A linha pontilhada a que você se refere é apenas uma linha de nível, não precisa codificar, você pode adicioná-la a partir das propriedades do indicador:



 
Vinicius de Oliveira:

Boa tarde!


A linha pontilhada a que você se refere é apenas uma linha de nível, não precisa codificar, você pode adicioná-la a partir das propriedades do indicador:



Boa tarde, Vinicius. Obg pela atenção.

Mas teria como estabelecer essa linha de nível pelo código, pra ela aparecer na aba 'Inputs' ?

 
Daniel D.:

Boa tarde, Vinicius. Obg pela atenção.

Mas teria como estabelecer essa linha de nível pelo código, pra ela aparecer na aba 'Inputs' ?

Entendi . . . Eu sou horrível com indicadores (ainda muito mais que com EAs 😃), mas acho que adicionando outro buffer você resolve fácil:

//---especificar quantidade de buffers e e de plotagens
#property indicator_buffers 3
#property indicator_plots   3
//--- plotar Histograma
#property indicator_label1  "Amplitude"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrGreen
#property indicator_width1  5
#property indicator_style1  STYLE_SOLID
//--- plotar Média Móvel
#property indicator_label2  "MA_Amplitude"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDeepPink
#property indicator_width2  3
#property indicator_style2  STYLE_SOLID
//--- plotar Nível
#property indicator_label3  "Nível"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrDodgerBlue
#property indicator_width3  2
#property indicator_style3  STYLE_DASH

. . .

//--- buffers do indicador
double HSTGR_Buffer[];
double MA_Buffer[];
double nivel_Buffer[];

. . .

//--- indicator buffers mapping
   SetIndexBuffer(0,HSTGR_Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,MA_Buffer,INDICATOR_DATA);
   SetIndexBuffer(2,nivel_Buffer,INDICATOR_DATA);

. . .

   if(prev_calculated==0)//calcula o indicador (menos a derradeira barra) apenas na primeira passagem.
     {
      for(int i=0; i<rates_total; i++)
        {
         HSTGR_Buffer[i]=high[i]-low[i];//amplitude de 1 vela
         nivel_Buffer[i]=nivelValue;
        }
     }
   else
     {
      HSTGR_Buffer[rates_total-1]=high[rates_total-1]-low[rates_total-1];//calcula o restante do indicador para cada nova barra.
      nivel_Buffer[rates_total-1]=nivelValue;
     }
 
Vinicius de Oliveira:

Entendi . . . Eu sou horrível com indicadores (ainda muito mais que com EAs 😃), mas acho que adicionando outro buffer você resolve fácil:

Show de bola!! E eu indo por um caminho nada a ver, usando biblioteca e classe. Grande aprendizado. Muito obrigado Vinicius!

 
Daniel D.:

Show de bola!! E eu indo por um caminho nada a ver, usando biblioteca e classe. Grande aprendizado. Muito obrigado Vinicius!

Bons negócios!!   👍

 
Vinicius de Oliveira:

Entendi . . . Eu sou horrível com indicadores (ainda muito mais que com EAs 😃), mas acho que adicionando outro buffer você resolve fácil:

Procure por:

IndicatorSetDouble( INDICATOR_LEVELVALUE,....)

Use isso no OnInit() e JAMAIS no OnCalculate()...


;)

 
Flavio Jarabeck:


Procure por:

IndicatorSetDouble( INDICATOR_LEVELVALUE,....)


;)


🤦‍♂️😂

Realmente, Flávio, sua solução é bem mais prática / adequada . . .


Valeu!!

 
Flavio Jarabeck:

Procure por:

Use isso no OnInit() e JAMAIS no OnCalculate()...


;)


Ok, obrigado!  👍



No caso, Daniel, bastaria apenas colocar o seguinte em OnInit(), ao invés das alterações que lhe sugeri antes:

//--- define níveis 
   IndicatorSetInteger(INDICATOR_LEVELS, 1); 
   IndicatorSetDouble(INDICATOR_LEVELVALUE, nivelValue);
 
Vinicius de Oliveira:


Ok, obrigado!  👍



No caso, Daniel, bastaria apenas colocar o seguinte em OnInit(), ao invés das alterações que lhe sugeri antes:

Perfeito, alterado e tudo certo. Vinicius, mais uma vez obrigado!

Flávio, obrigado pela contribuição.