Acumular volume por período.

 

Boa noite.

Estou tentando acumular o volume de 5 períodos para usar como cálculo de porcentagem sobre o volume do período atual.

Problema que essa soma está retornando sempre o mesmo valor, não consegui descobrir como poderia zerar a soma para sempre recalcular de 5 em 5.

Fiz uma função separada, porque tentei com um while() dentro do for principal e não funcionou, erro de lógica minha.

Creio que falta algum pequeno ajuste, ou alguma dica para melhorar o cálculo também será bem vinda.


//+------------------------------------------------------------------+
//|                                                         Bars.mq5 |
//|                                                             Neto |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Bars"
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots   1
#property indicator_type1   DRAW_COLOR_CANDLES
#property indicator_width1  1
#property indicator_style1  STYLE_SOLID
#property indicator_label1  "bars"

color  ColorOf[8]={CLR_NONE,clrPaleVioletRed,clrOrange,clrYellow};
double colorBuffer[];
double openBuffer[];
double highBuffer[];
double lowBuffer[];
double closeBuffer[];

//----- Variáveis
input int periodo = 5;
input double alto = 40; //Pintar barra acima de 40
input double medio = 20;
input double baixo = 5;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,openBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,highBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,lowBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,closeBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,colorBuffer,INDICATOR_COLOR_INDEX);
   PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,4);

   for(int i = 1; i < 4; i++)
      PlotIndexSetInteger(0,PLOT_LINE_COLOR,i,ColorOf[i]);
      IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
int bars;
if(prev_calculated == 0) bars = 0;
else bars = prev_calculated-1;

   for(bars = periodo; bars < rates_total; bars++)
     {
      openBuffer[bars] = open[bars];
      highBuffer[bars] = high[bars];
      lowBuffer[bars] = low[bars];
      closeBuffer[bars] = close[bars];
      double soma = total(volume,periodo);
      double res = 0;
       
        if(bars > periodo-1)
         {
            res = (volume[bars]*100)/soma; // Cálculo para obter porcentagem da barra atual sobre acumulo de volume anterior.
         }
         // Condições para pintar as barras
        if(res > alto)
        {
           colorBuffer[bars] = 1;
        }
        else if(res > medio)
        {
           colorBuffer[bars] = 2;
        }
        else if(res > baixo)
        {
           colorBuffer[bars] = 3;
        }
         else
        {
           colorBuffer[bars] = 0;
        }
        soma = 0; //Tentativa de zerar a soma
     }
   return(rates_total-1);
}
//+------------------------------------------------------------------+
// Função para somar o volume de 5 períodos
long total( const long &array[], int period) {
    long sum = 0;
    for (int i = 0; i < period; i++) {
        sum += array[i];
    }
    return sum;
}
 

Bom dia.

Estive tentando arrumar meu indicador e notei que da forma que está com um for auxiliar ele fica repetindo o mesmo candle 5x.

Então tentei com o cálculo de resto de divisão, onde a condição seria.

if(bars % periodo != 0){
        somar os candles
}
else{
        resultado = (Cálculo junto a soma)
}

Nesse caso preciso iniciar o for principal dando o valor de i ou bars que é o meu caso com o valor de 1.

Aparentemente funciona, a cada 5 períodos ele vai acumulando, mas o que ocorre é que de um dia para o outro, os candles mudam de cor, não sendo mais o mesmo tipo de volume coletado anteriormente.

Ex: Candle teve valor de resultado acima de 40, ficou no valor da configuração "alto",  e pintou de Vermelho, no outro dia já não é mais Vermelho, fica outra cor.

Ou seja, não está confiável este cálculo e não estou entendendo porque essa alteração, onde usei justo número primo que resulta no resto "zero" apenas de 5 em 5.

Coloquei o cálculo dentro do for principal, eliminei a função por enquanto.

 

Consegui achar uma forma eficiente para somar, na verdade 2 formas.

Única coisa que precisei alterar foi ciclo for para um ciclo while por questão de desempenho, no while ficou mais rápido sem lag para colorir os candles, no for dava lag.

 
prsc:

Consegui achar uma forma eficiente para somar, na verdade 2 formas.

Única coisa que precisei alterar foi ciclo for para um ciclo while por questão de desempenho, no while ficou mais rápido sem lag para colorir os candles, no for dava lag.

Conseguiste finalizar?

 
matheus3254:

Conseguiste finalizar?

Sim, finalizei.

Razão: