Como calcular o volume de compra e o volume de venda, SEPARADAMENTE, usando as funções CopyTicks ou CopyTicksRange??

 

Olá pessoal. Em um assunto "Somatório do volume de compra e venda - medir agressão ao book", as respostas foram de que dava para obter o volume de compra e o volume de venda, SEPARADAMENTE, usando as funções  CopyTicks ou CopyTicksRange.

Minha dúvida é de como ficaria o código para obter os volumes de compra e os volumes de venda do ultimo candle corrente.

Se alguém poder ajudar fico grato.

Att. Lucas

 
massotti:

Olá pessoal. Em um assunto "Somatório do volume de compra e venda - medir agressão ao book", as respostas foram de que dava para obter o volume de compra e o volume de venda, SEPARADAMENTE, usando as funções  CopyTicks ou CopyTicksRange.

Minha dúvida é de como ficaria o código para obter os volumes de compra e os volumes de venda do ultimo candle corrente.

Se alguém poder ajudar fico grato.

Att. Lucas

Use o campo "flags" da estrutura MqlTick.

Se o bit TICK_FLAG_BUY estiver ativo, significa que foi agressão de compra. 

Se o bit TICK_FLAG_SELL estiver ativo, significa que foi agressão de venda.

Veja detalhes aqui.

No caso da B3, alguns registros vêm com esses 2 flags ativos simultaneamente. A princípio isso é interpretado como "negócio direto", que é quando a corretora fecha o negócio diretamente entre dois clientes dela (um querendo comprar e outro querendo vender o mesmo ativo) e notifica o negócio à B3, por obrigação legal. Nesses casos não há uma definição de quem agrediu quem. Aparentemente esses registros que vêm com os 2 flags ativos são os que aparecem de vez em quando em cor verde no histórico de negociação que é apresentado em tempo real na janela do DOM do MT5.

Uma observação: esses tick flags têm algumas imperfeições, pois já comprovamos algumas diferenças entre uma corretora e outra na marcação desses flags. Mas aparentemente esses erros são raros, de modo que provavelmente não influenciarão significativamente em decisões ou indicadores que se baseiem na análise de um grande número de registros.

 
Trader_Patinhas:

Use o campo "flags" da estrutura MqlTick.

Se o bit TICK_FLAG_BUY estiver ativo, significa que foi agressão de compra. 

Se o bit TICK_FLAG_SELL estiver ativo, significa que foi agressão de venda.

Veja detalhes aqui.

No caso da B3, alguns registros vêm com esses 2 flags ativos simultaneamente. A princípio isso é interpretado como "negócio direto", que é quando a corretora fecha o negócio diretamente entre dois clientes dela (um querendo comprar e outro querendo vender o mesmo ativo) e notifica o negócio à B3, por obrigação legal. Nesses casos não há uma definição de quem agrediu quem. Aparentemente esses registros que vêm com os 2 flags ativos são os que aparecem de vez em quando em cor verde no histórico de negociação que é apresentado em tempo real na janela do DOM do MT5.

Uma observação: esses tick flags têm algumas imperfeições, pois já comprovamos algumas diferenças entre uma corretora e outra na marcação desses flags. Mas aparentemente esses erros são raros, de modo que provavelmente não influenciarão significativamente em decisões ou indicadores que se baseiem na análise de um grande número de registros.

Olá @Trader_Patinhas. Ainda estou com dificuldade. Por exemplo: Se eu criar uma variável usando "MqlTick tick", na hora que eu digitar a variável "tick.flag=TICK_FLAG_BUY" saberei que será uma ação de compra. Mas como faço para somar o valor total de "compras' no candle corrente?

 
massotti:

Olá @Trader_Patinhas. Ainda estou com dificuldade. Por exemplo: Se eu criar uma variável usando "MqlTick tick", na hora que eu digitar a variável "tick.flag=TICK_FLAG_BUY" saberei que será uma ação de compra. Mas como faço para somar o valor total de "compras' no candle corrente?

Como o @Trader_Patinhas disse,tivemos uma breve thread sobre isso.

Nesta mesma linha ha outra thread que vale a leitura.

Sugiro que teste para ver se atende seus objetivos.

Tem também o artigo que aborda implementação do depth of market.

 
Joscelino Celso de Oliveira:

Como o @Trader_Patinhas disse,tivemos uma breve thread sobre isso.

Nesta mesma linha ha outra thread que vale a leitura.

Sugiro que teste para ver se atende seus objetivos.

Tem também o artigo que aborda implementação do depth of market.

Acontece que este assunto aborda a quantidade de ticks e não de volume. Em um momento a função acusa 1tick, só que nesse tick pode ter um volume de 50 contratos, por exemplo.

Meu objetivo é calcular o volume de operações de compra e o volume de operações que vieram de vendas.

 
massotti:

Acontece que este assunto aborda a quantidade de ticks e não de volume. Em um momento a função acusa 1tick, só que nesse tick pode ter um volume de 50 contratos, por exemplo.

Meu objetivo é calcular o volume de operações de compra e o volume de operações que vieram de vendas.

Você não leu todos os links que te enviei.

Aborda volume sim.

 
massotti:

Olá @Trader_Patinhas. Ainda estou com dificuldade. Por exemplo: Se eu criar uma variável usando "MqlTick tick", na hora que eu digitar a variável "tick.flag=TICK_FLAG_BUY" saberei que será uma ação de compra. Mas como faço para somar o valor total de "compras' no candle corrente?

Não é bem assim que vc tem que fazer a comparação. Tratam-se de flags. Vários deles podem estar ativos simultaneamente. Vc tem que fazer o OU lógico do campo "ticks" com a posição do flag pra ver se está "aceso" ou não. Leia as threads que o @Joscelino Celso de Oliveira indicou que tem exemplos de código-fonte lá.

Quanto a somar o valor total de agressões de compra (ou de venda), basta somar o conteúdo do campo "volume" da mesma estrutura, de todos os registros que estiverem com o flag de compra (ou de venda) aceso dentro do período correspondente ao candle.

 
valeu pessoal. Depois de muito quebrar a cabeça consegui montar o código para capturar o volume de compra separado do volume de vendas.
 
Lucas:
valeu pessoal. Depois de muito quebrar a cabeça consegui montar o código para capturar o volume de compra separado do volume de vendas.
Poderia disponibilizar o código ?
 
Lucas:
valeu pessoal. Depois de muito quebrar a cabeça consegui montar o código para capturar o volume de compra separado do volume de vendas.
  Olá Lucas, você pode disponibilizar o código?
 
richbsb:
  Olá Lucas, você pode disponibilizar o código?
void OnTick()
{
   MqlTick tick;
   if (SymbolInfoTick(Symbol(), tick)) 
     {
      if ((tick.flags &TICK_FLAG_BUY) == TICK_FLAG_BUY){Print("Compra");}
         
      if ((tick.flags &TICK_FLAG_SELL) == TICK_FLAG_SELL){Print("Venda");}
         
     }
}

Basicamente é isso. Voce pode usar a funcao CopyTicks ou copyticksrange (em vez de SymbolInfoTicks) para copiar o historico e colocar num indicador para ver o histórico de agressão. Ou colocar num robo.

Razão: