Barra de volumes não são mostradas no gráfico

 
Boa noite senhores, estou com um problema e gostaria que me ajudasse se fosse possível, desde já agradeço a disponibilidade de vocês.

Tive acesso a um código em mql5 de volume financeiro, o qual estou tentando aplicar no grafico do mini indice no tempo M15.

Originalmente, o indicador plotava as barras em uma espécie de escala de cores, que iniciava em vermelho e ia mudando, para laranja, amarelo, até chegar no verde. Para a estratégia que vou utilizar, só preciso que ele fique verde ou vermelho, e ao aplicar essas modificações, mesmo aparecendo 0 erros após compilar, quando adicionado ao gráfico, ele me mostra apenas a MA e não aparece mais as barras de volume. Poderiam dar uma olhada e me ajudar a identificar onde está o problema?

//------------------------------------------------------------------
#property copyright "© mladen, 2018"
#property link      "mladenfx@gmail.com"
#property version   "1.00"
//------------------------------------------------------------------
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   2
#property indicator_label1  "Volume"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrGreen, clrRed
#property indicator_width1  2
#property indicator_label2  "Average"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkGray
//---
enum enMaTypes
  {
   ma_sma,    // Simple moving average
   ma_ema,    // Exponential moving average
   ma_smma,   // Smoothed MA
   ma_lwma    // Linear weighted MA
  };
//---
enum enVolumeType
  {
   vol_ticks, // Use ticks
   vol_volume // Use real volume
  };
//--- input parameters  
input enVolumeType inpVolumeType      = vol_volume; // Volume type to use
input int          inpAveragePeriod   = 21;        // Average period
input enMaTypes    inpAverageMethod   = ma_sma;    // Average method
input double       inpBreakoutPercent = 50;        // Breakout percentage
//--- buffers
double  val[],valc[],average[];
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
void OnInit()
  {
//---- indicator buffers mapping
   SetIndexBuffer(0,val,INDICATOR_DATA);
   SetIndexBuffer(1,valc,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,average,INDICATOR_DATA);
   string _avgNames[]={"SMA","EMA","SMMA","LWMA"};
   IndicatorSetString(INDICATOR_SHORTNAME,"Volume "+_avgNames[inpAverageMethod]+" average ("+(string)inpAveragePeriod+")");
  }
//+------------------------------------------------------------------+ 
//| 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[])
{
    if (Bars(_Symbol, _Period) < rates_total) return (-1);
    int i = (int)MathMax(prev_calculated - 1, 0);
    for (; i < rates_total && !_StopFlag; i++)
    {
        double _volume = double((inpVolumeType == vol_ticks) ? tick_volume[i] : volume[i]);
        average[i] = iCustomMa(inpAverageMethod, _volume, inpAveragePeriod, i, rates_total);
        val[i] = _volume;
        valc[i] = 0;
        if (i > 0) 
{
    if (close[i] > close[i - 1]) 
        valc[i] = clrGreen; // Verde (compradora)
    else if (close[i] < close[i - 1]) 
        valc[i] = clrRed; // Vermelho (vendedora)
}
    }
    return (i);
}
//+------------------------------------------------------------------+
//| Custom functions                                                 |
//+------------------------------------------------------------------+
#define _maInstances 1
#define _maWorkBufferx1 1*_maInstances
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double iCustomMa(int mode,double price,double length,int r,int bars,int instanceNo=0)
  {
   switch(mode)
     {
      case ma_sma   : return(iSma(price,(int)length,r,bars,instanceNo));
      case ma_ema   : return(iEma(price,length,r,bars,instanceNo));
      case ma_smma  : return(iSmma(price,(int)length,r,bars,instanceNo));
      case ma_lwma  : return(iLwma(price,(int)length,r,bars,instanceNo));
      default       : return(price);
     }
  }
double workSma[][_maWorkBufferx1];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double iSma(double price,int period,int r,int _bars,int instanceNo=0)
  {
   if(ArrayRange(workSma,0)!=_bars) ArrayResize(workSma,_bars);
   workSma[r][instanceNo]=price;
   double avg=price;
   int k=1;
   for(; k<period && (r-k)>=0; k++) avg+=workSma[r-k][instanceNo];
   return(avg/(double)k);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double workEma[][_maWorkBufferx1];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double iEma(double price,double period,int r,int _bars,int instanceNo=0)
  {
   if(ArrayRange(workEma,0)!=_bars) ArrayResize(workEma,_bars);
   workEma[r][instanceNo]=price;
   if(r>0 && period>1)
      workEma[r][instanceNo]=workEma[r-1][instanceNo]+(2.0/(1.0+period))*(price-workEma[r-1][instanceNo]);
   return(workEma[r][instanceNo]);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double workSmma[][_maWorkBufferx1];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double iSmma(double price,double period,int r,int _bars,int instanceNo=0)
  {
   if(ArrayRange(workSmma,0)!=_bars) ArrayResize(workSmma,_bars);
   workSmma[r][instanceNo]=price;
   if(r>1 && period>1)
      workSmma[r][instanceNo]=workSmma[r-1][instanceNo]+(price-workSmma[r-1][instanceNo])/period;
   return(workSmma[r][instanceNo]);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double workLwma[][_maWorkBufferx1];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double iLwma(double price,double period,int r,int _bars,int instanceNo=0)
  {
   if(ArrayRange(workLwma,0)!=_bars) ArrayResize(workLwma,_bars);

   workLwma[r][instanceNo] = price; if(period<1) return(price);
   double sumw = period;
   double sum  = period*price;
   for(int k=1; k<period && (r-k)>=0; k++)
     {
      double weight=period-k;
      sumw  += weight;
      sum   += weight*workLwma[r-k][instanceNo];
     }
   return(sum/sumw);
  
}
//+------------------------------------------------------------------+
Desde já agradeço!
Visualize isto! Biblioteca gráfica em linguagem MQL5 como equivalente a plot de R
Visualize isto! Biblioteca gráfica em linguagem MQL5 como equivalente a plot de R
  • www.mql5.com
A exibição visual usando gráficos desempenha um importante papel na exploração e estudo de padrões regulares. Nas populares linguagens de programação entre a comunidade científica, tais como R e Python, a função especial plot é destinada para visualização. Com ela você pode desenhar linhas, gráficos de dispersão e histogramas para visualizar padrões. Em linguagem MQL5 você pode fazer a mesma coisa usando a classe CGraphics.
 
Apenas para registro, as linhas que editei foram:
#property indicator_color1 clrGreen, clrRed

if (close[i] > close[i - 1]) 
        valc[i] = clrGreen; // Verde (compradora)
    else if (close[i] < close[i - 1]) 
        valc[i] = clrRed; // Vermelho (vendedora)
 
Por favor não criar tópicos aleatoriamente sem ter em conta a secção adequada. O seu tópico foi movido para a secção: Indicadores técnicos
 
Fernando Carreiro #:
Por favor não criar tópicos aleatoriamente sem ter em conta a secção adequada. O seu tópico foi movido para a secção: Indicadores técnicos

Peço desculpas, não me atentei a segmentação das dúvidas.

 
Anderson Pedrucci Filho: Originalmente, o indicador plotava as barras em uma espécie de escala de cores, que iniciava em vermelho e ia mudando, para laranja, amarelo, até chegar no verde.
Pode indicar um atalho para o indicador original para comparação, por favor?
 

Lembre-se que terá de usar o índice da cor e não a cor em si ...

#property indicator_color1 clrGreen, clrRed

if (close[i] > close[i - 1]) 
   valc[i] = 0; // Verde (compradora)
else if (close[i] < close[i - 1]) 
   valc[i] = 1; // Vermelho (vendedora)
 
Anderson Pedrucci FilhoBoa noite senhores, estou com um problema e gostaria que me ajudasse se fosse possível, desde já agradeço a disponibilidade de vocês. Tive acesso a um código em mql5 de volume financeiro, o qual estou tentando aplicar no grafico do mini indice no tempo M15. Originalmente, o indicador plotava as barras em uma espécie de escala de cores, que iniciava em vermelho e ia mudando, para laranja, amarelo, até chegar no verde. Para a estratégia que vou utilizar, só preciso que ele fique verde ou vermelho, e ao aplicar essas modificações, mesmo aparecendo 0 erros após compilar, quando adicionado ao gráfico, ele me mostra apenas a MA e não aparece mais as barras de volume. Poderiam dar uma olhada e me ajudar a identificar onde está o problema? Desde já agradeço!

Bom dia!! É possível que você tenha alterado mais alguma coisa no código original e esqueceu, porque eu alterei apenas as linhas destacadas abaixo e funcionou aqui:

//------------------------------------------------------------------
#property copyright "© mladen, 2018"
#property link      "mladenfx@gmail.com"
#property version   "1.00"
//------------------------------------------------------------------
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   2
#property indicator_label1  "Volume"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrDarkGray,clrGreen,clrRed
#property indicator_width1  2
#property indicator_label2  "Average"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkGray
//---
enum enMaTypes
  {
   ma_sma,    // Simple moving average
   ma_ema,    // Exponential moving average
   ma_smma,   // Smoothed MA
   ma_lwma    // Linear weighted MA
  };
//---
enum enVolumeType
  {
   vol_ticks, // Use ticks
   vol_volume // Use real volume
  };
//--- input parameters
input enVolumeType inpVolumeType      = vol_ticks; // Volume type to use
input int          inpAveragePeriod   = 50;        // Average period
input enMaTypes    inpAverageMethod   = ma_ema;    // Average method
input double       inpBreakoutPercent = 50;        // Breakout percentage
//--- buffers
double  val[],valc[],average[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//---- indicator buffers mapping
   SetIndexBuffer(0,val,INDICATOR_DATA);
   SetIndexBuffer(1,valc,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,average,INDICATOR_DATA);
   string _avgNames[]= {"SMA","EMA","SMMA","LWMA"};
   IndicatorSetString(INDICATOR_SHORTNAME,"Volume "+_avgNames[inpAverageMethod]+" average ("+(string)inpAveragePeriod+")");
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   if(Bars(_Symbol,_Period)<rates_total)
      return(-1);
   int i=(int)MathMax(prev_calculated-1,0);
   for(; i<rates_total && !_StopFlag; i++)
     {
      double _volume=double((inpVolumeType==vol_ticks) ? tick_volume[i]: volume[i]);
      average[i] = iCustomMa(inpAverageMethod,_volume,inpAveragePeriod,i,rates_total);
      val[i]     = _volume;
      valc[i]    = 0;
      if(i>0 && close[i] > close[i-1])
         valc[i] = 1;
      if(i>0 && close[i] < close[i-1])
         valc[i] = 2;
     }
   return(i);
  }
//+------------------------------------------------------------------+
//| Custom functions                                                 |
//+------------------------------------------------------------------+
#define _maInstances 1
#define _maWorkBufferx1 1*_maInstances
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double iCustomMa(int mode,double price,double length,int r,int bars,int instanceNo=0)
  {
   switch(mode)
     {
      case ma_sma   :
         return(iSma(price,(int)length,r,bars,instanceNo));
      case ma_ema   :
         return(iEma(price,length,r,bars,instanceNo));
      case ma_smma  :
         return(iSmma(price,(int)length,r,bars,instanceNo));
      case ma_lwma  :
         return(iLwma(price,(int)length,r,bars,instanceNo));
      default       :
         return(price);
     }
  }
double workSma[][_maWorkBufferx1];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double iSma(double price,int period,int r,int _bars,int instanceNo=0)
  {
   if(ArrayRange(workSma,0)!=_bars)
      ArrayResize(workSma,_bars);
   workSma[r][instanceNo]=price;
   double avg=price;
   int k=1;
   for(; k<period && (r-k)>=0; k++)
      avg+=workSma[r-k][instanceNo];
   return(avg/(double)k);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double workEma[][_maWorkBufferx1];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double iEma(double price,double period,int r,int _bars,int instanceNo=0)
  {
   if(ArrayRange(workEma,0)!=_bars)
      ArrayResize(workEma,_bars);
   workEma[r][instanceNo]=price;
   if(r>0 && period>1)
      workEma[r][instanceNo]=workEma[r-1][instanceNo]+(2.0/(1.0+period))*(price-workEma[r-1][instanceNo]);
   return(workEma[r][instanceNo]);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double workSmma[][_maWorkBufferx1];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double iSmma(double price,double period,int r,int _bars,int instanceNo=0)
  {
   if(ArrayRange(workSmma,0)!=_bars)
      ArrayResize(workSmma,_bars);
   workSmma[r][instanceNo]=price;
   if(r>1 && period>1)
      workSmma[r][instanceNo]=workSmma[r-1][instanceNo]+(price-workSmma[r-1][instanceNo])/period;
   return(workSmma[r][instanceNo]);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double workLwma[][_maWorkBufferx1];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double iLwma(double price,double period,int r,int _bars,int instanceNo=0)
  {
   if(ArrayRange(workLwma,0)!=_bars)
      ArrayResize(workLwma,_bars);

   workLwma[r][instanceNo] = price;
   if(period<1)
      return(price);
   double sumw = period;
   double sum  = period*price;
   for(int k=1; k<period && (r-k)>=0; k++)
     {
      double weight=period-k;
      sumw  += weight;
      sum   += weight*workLwma[r-k][instanceNo];
     }
   return(sum/sumw);
  }
//+------------------------------------------------------------------+



 

Também, tem a certeza que quer compara os preços de fecho?

Será que a sua intenção é comparar os volumes e não o fecho?

if (val[i] > val[i - 1]) 
   valc[i] = 0; // Verde (compradora)
else if (val[i] < val[i - 1]) 
   valc[i] = 1; // Vermelho (vendedora)
 
Vinicius Pereira De Oliveira #:

Bom dia!! É possível que você tenha alterado mais alguma coisa no código original e esqueceu, porque eu alterei apenas as linhas destacadas abaixo e funcionou aqui:



Muito estranho, provavelmente eu fiz alguma besteira aqui, rs. Copiei o código que voce colocou, compilei e funcionou. Muito Obrigado!

 
Fernando Carreiro #:

Também, tem a certeza que quer compara os preços de fecho?

Será que a sua intenção é comparar os volumes e não o fecho?

Sim, a ideia é comparar os volumes. A Lógica está errada?

 
Anderson Pedrucci Filho #: Sim, a ideia é comparar os volumes. A Lógica está errada?

Sim! Tal como salientei, estava a comparar os preços de fecho ...

if (close[i] > close[i - 1]) 
   valc[i] = 0; // Verde (compradora)
else if (close[i] < close[i - 1]) 
   valc[i] = 1; // Vermelho (vendedora)

em vez do volume ...

if (val[i] > val[i - 1]) 
   valc[i] = 0; // Verde (compradora)
else if (val[i] < val[i - 1]) 
   valc[i] = 1; // Vermelho (vendedora)
Razão: