Existe alguma forma de obter volume de agressão

 
Boa tarde,

Será que alguém conhece uma forma de obter o volume de agressão de compra e de venda separados?

A forma que pensei em fazer é utilizar a função CopyTicks e analisar cada um dos ticks, mas isso me parece muito custoso do ponto de vista computacional e um tanto complexo de implementar também.
 

Boa tarde,

não existe uma função pronta para isso, mas a ideia é essa mesmo, utilizar a CopyTicks e analisar tick a tick.

O delta ou qualquer indicador que utiliza agressão, será mais custoso que a grande maioria dos indicadores encontrados por aqui, não tem jeito.

De qualquer forma tem como você otimizar isso sim.

Abs.

 
Romeu Bertho:

Boa tarde,

não existe uma função pronta para isso, mas a ideia é essa mesmo, utilizar a CopyTicks e analisar tick a tick.

O delta ou qualquer indicador que utiliza agressão, será mais custoso que a grande maioria dos indicadores encontrados por aqui, não tem jeito.

De qualquer forma tem como você otimizar isso sim.

Abs.

Muito obrigado pela contribuição, como eu já suspeitava, não tem pra onde fugir, ao trabalho então.

 

acho que esse código é um bom inicio...Se rodar e achar alguma melhoria nos de um feedback.


Obs.: ele busca a informação dos ultimos 10 ticks, por questões de teste/performance. Para o uso real eu vejo que deve ser consolidado dentro de um tempo delta, porem isso pode ser um pouco demorado, mas uma outra alternativa é implementar um Walk Forward no momento de receber esses ticks.  

imagine:

0,1,2,3,4,5,6,7,8,9

  0,1,2,3,4,5,6,7,8,9

    0,1,2,3,4,5,6,7,8,9

      0,1,2,3,4,5,6,7,8,9 

      .....

ulong start=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double x;
   start=0;
   
   start=GetMicrosecondCount();
   funcX(x);
   Print("Time (MicroSecond): ",GetMicrosecondCount()-start);

//---
  }
//+------------------------------------------------------------------+
void funcX(double &net_volume)
  {

   MqlTick ticks[];
   int size = CopyTicks(_Symbol, ticks, COPY_TICKS_TRADE, 0, 10);
   if(size > 0)
     {
      for(int i=0; i<size; i++)
        {
         if((ticks[i].flags & TICK_FLAG_BUY) == TICK_FLAG_BUY)
           {
            net_volume += ticks[i].volume_real;
           }
         else
            if((ticks[i].flags & TICK_FLAG_SELL) == TICK_FLAG_SELL)
              {
               net_volume -= ticks[i].volume_real;
              }
        }
     }
  }
 
Pessoal implementei o meu código com base no disponibilizado pelo Jonathan.
No meu caso acabou sendo suficiente calcular a agressão somente para o último candle de um timeframe, segue o código da função que retorna o volume acumulado da agressão de compra.

double GetAgressionVolumeBuy(ENUM_TIMEFRAMES timeframe = PERIOD_M1) {
  double volumeBuy = 0;
  MqlTick ticks[];
  int size = CopyTicksRange(_Symbol, ticks, COPY_TICKS_TRADE, iTime(_Symbol, timeframe, 0) *1000, TimeCurrent()*1000);
  if(size > 0) {
    for(int i = 0; i < size; i++) {
      if((ticks[i].flags & TICK_FLAG_BUY) == TICK_FLAG_BUY)
        volumeBuy += ticks[i].volume_real;
    }
  }
  return volumeBuy;
}
 
Abraao Moreira:
Pessoal implementei o meu código com base no disponibilizado pelo Jonathan.
No meu caso acabou sendo suficiente calcular a agressão somente para o último candle de um timeframe, segue o código da função que retorna o volume acumulado da agressão de compra.

Apenas uma sugestão, no último parâmetro você pode colocar 0 para simplificar.

 
Carlos Ignacio Rincones Pons:

Apenas uma sugestão, no último parâmetro você pode colocar 0 para simplificar.

Vlw cara.
Deixei desse jeito porque seria mais conveniente na hora, mas é melhor colocar 0 mesmo.

 

veja se ajuda

https://www.mql5.com/en/articles/3708

sds

Developing stock indicators featuring volume control through the example of the delta indicator
Developing stock indicators featuring volume control through the example of the delta indicator
  • www.mql5.com
The article deals with the algorithm of developing stock indicators based on real volumes using the CopyTicks() and CopyTicksRange() functions. Some subtle aspects of developing such indicators, as well as their operation in real time and in the strategy tester are also described.
 

Fala pessoal tudo bem com vocês?

Publiquei agora há pouco no CodeBase um indicador que fiz com base nesse e outros tópicos. Acredito que já sirva de ponto de partida pra muita gente.

Sinceramente adoraria ver esse projeto crescendo e se tornando robusto aqui na comunidade.

Link: https://www.mql5.com/pt/code/32914

Salvar Agressões em CSV
Salvar Agressões em CSV
  • www.mql5.com
Captura de dados de agressão, salva em csv, e plota em forma de histograma.
 

Pessoal,

E no caso, de eu querer trabalhar dentro de uma janela.

Basicamente, dentro de uma janela de X segundos se subir acumulado X ticks, abre uma posição.
O mesmo para ticks de queda.

No caso ele contaria dentro de uma janela somente os ticks de uma mesma direção, alguem teria alguma dica?

 
Michael Rodrigues:

Pessoal,

E no caso, de eu querer trabalhar dentro de uma janela.

Basicamente, dentro de uma janela de X segundos se subir acumulado X ticks, abre uma posição.
O mesmo para ticks de queda.

No caso ele contaria dentro de uma janela somente os ticks de uma mesma direção, alguem teria alguma dica?

Usa a função CopyTicksRange. 

Razão: