Indicador de Grandes Ordens (Ajuda)

 

Olá pessoal!

Criei este indicador simples, mas ele tem sido bastante útil pra mim.

Se trata de uma linha que mostra no gráfico Ordens por tick maiores que um valor configurado no Input.

Por exemplo, no dólar configuro para que ele me mostre ordens acima de 1000, pois pretendo saber as ordens diretas de grande vulto.


Tenho tido 2 problemas nele:

1 - Alguns ticks não são "percebidos" pelo código e ele falha em plotar na tela, pela compilação ele demora 1006 msec, então acredito que isso faça com que ele "pule" certos ticks, sei lá.

2 - Algumas vezes há um tipo de Reset automático, não sei se é por perda de conexão ou algo assim, mas ele deleta todos os dados plotados anteriormente


Alguém poderia dar uma ajuda ?


#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Purple
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

input double         BigVolume = 1000;     
//+------------------------------------------------------------------+
//| VARIÁVEIS INTERNAS DO CÓDIGO                                     |
//+------------------------------------------------------------------+
double               Buffer1[];
double               preco;


//+------------------------------------------------------------------+
//| INICIALIZAÇÃO DE VARIÁVEIS (Mapeamento de Buffers)               |
//+------------------------------------------------------------------+
int OnInit()
  {

SetIndexBuffer(0,Buffer1,INDICATOR_DATA);
ArrayInitialize(Buffer1,EMPTY_VALUE);
preco  = 0;

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| FUNÇÃO DE INTERAÇÃO DO INDICADOR                                 |
//+------------------------------------------------------------------+
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[])
  {

   MqlTick tick_array[];
   ArraySetAsSeries(tick_array,true);
   ArraySize(tick_array);
  
if(CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL)!=-1)
     {
     
     MqlTick tick; 
 
   if(SymbolInfoTick(Symbol(),tick)) 
     {     
    
      if(tick.volume >= BigVolume ){
      preco = tick.last;
      }
       
      }
      
     }
                      
//+------------------------------------------------------------------+
//| PLOTANDO BUFFERS                                                 |
//+------------------------------------------------------------------+  

Buffer1[rates_total-1] = preco;

   return(rates_total);
  }
Razão: