MqlTick.flags zerado - página 3

 
Flavio Jarabeck:

Posta sim!  Vamos esclarecer esse assunto e deixar gravado aqui pra outros não passarem pelo que estamos passando hoje...

;)

Acho que agora resolveu, com o CopyTicks, segundo o Trader_Patinhas sugeriu, segue o código:

         MqlTick ticks[];
         
         // Primeira execução, recupera a data atual
         if (PLastTickUpdate_msc == 0)
         {
            // Inicia com 10 segundos antes do horário atual
            PLastTickUpdate_msc = (TimeCurrent() - 10) * 1000;
         }

         // Efetua a cópia dos ticks a partir da último time executado
         if (CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, PLastTickUpdate_msc, 0) != -1)
         {
            // Guarda segundo e milésimo para validar próxima consulta
            PLastTickUpdate_msc = ticks[ArraySize(ticks) - 1].time_msc;
            
            // Trata ticks recuperados
            for (int i = 0; i < ArraySize(ticks); i++) 
            {
               if (ticks[i].time_msc < PLastTickUpdate_msc)
               {
                  if ((ticks[i].flags & TICK_FLAG_BUY ) == TICK_FLAG_BUY)
                  {
                     // Trata Tick de Compra
                  }
                  if ((ticks[i].flags & TICK_FLAG_SELL) == TICK_FLAG_SELL)
                  {
                     // Trata Tick de Venda
                  }
               }
            }
         }

Obrigado pessoal.

Jhoni Carlos da Silva.

 
Flavio Jarabeck:

Não li o artigo.

O que eu consegui deduzir - posso estar errado - pelos logs que interpretei da B3/DOL, é quando uma Venda ou Compra esbarra em um lote iceberg, que sai naquele mesmo instante, afinal a ordem continua na frente da fila do book até ser toda consumida... Mas todos os ticks são válidos, não são repetidos, muito pelo contrário, tratava-se de uma ordem grande que consumiu várias "Boletas" de uma ordem iceberg.

Posso estar errado...

;)

O que eu vejo frequentemente nos logs do dólar e do índice (tanto cheio quanto mini) é uma sequência longa de ticks, todos BUY (ou todos SELL) e todos no mesmo milissegundo (mesmo time_msc), com o nível de preço negociado (last) aumentando progressivamente (quando os ticks são BUY) ou diminuindo progressivamente (quando os ticks são SELL). 

No meu entendimento, essa observação é consistente com uma ordem a mercado "indo pra dentro da fila" (no jargão da galera que pratica "Tape Reading"), ou seja, uma ordem de mercado de volume grande "enxugando" de uma vez só as filas de vários níveis de preço consecutivos do book.

Se fosse ordem iceberg, não haveria essa variação progressiva de preço, pois a ordem iceberg fica recolocando a oferta sempre num mesmo nível de preço fixo, a cada vez que a fila desse nível de preço esvazia. E nesse caso os ticks não ocorreriam todos no mesmo milissegundo, pois a ordem iceberg é passiva, ela vai esperar alguma ordem a mercado consumir o volume que ela acabou de ofertar, antes de colocar nova oferta.  

 
Flavio Jarabeck:

Obrigado pelas informações!


Acho que vou seguir com SymbolTickInfo() por agora... É um experimento e ele pode ser imperfeito... Eu só preciso de Compras e Vendas... E segundo a documentação do MQL5 os Flags que uso são os corretos mesmo... Acabei de checar...


Tentei analisar um trecho breve de logs dos ticks e passo a acreditar que, já que não encontrei nenhum padrão visível, os UNKNOWNS (os Flags Zerados) são os diretos...

;)

Só posso te dizer que, nos históricos de índice e dólar que eu baixo usando CopyTicks(), NUNCA aparecem flags zerados. Já baixei dezenas de milhões de ticks e não aparece nenhum zerado. Só aparecem 6 combinações: BID, ASK, BID+ASK, LAST+VOLUME+BUY, LAST+VOLUME+SELL e LAST+VOLUME+BUY+SELL (este último é o que eu acredito que possa ser o "negócio direto" e geralmente é 1% ou menos do volume total do dia). Quando eu tiver um tempo posto aqui uma estatística.

 
cat0l0n:

Muito interessante essa discussão!

Aproveito para compartilhar um artigo que corrobora com o que o Trader_Patinhas disse sobre o problema de virem dois ou mais ticks com mesmo timestamp.


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

Legal esse arquivo!

Flavio, talvez os flags zerados correspondam aos registros verdes que aparecem na janela do DOM quando o servidor da corretora não está atualizado, conforme informa o artigo.

Os ticks zerados estão ocorrendo em qual corretora? 

ps: o testemunho que dei acima sobre não ter encontrado nenhum campo flags zerado em dezenas de milhões de ticks foi com ticks baixados da Modal.

 
jdayanami:

Acho que agora resolveu, com o CopyTicks, segundo o Trader_Patinhas sugeriu, segue o código:

Obrigado pessoal.

Jhoni Carlos da Silva.

Oi Jhoni.

O código que eu uso utiliza exatamente essa lógica que você codificou, só que, além dos 2 casos que o seu código trata (BUY e SELL), eu trato também os caso que vêm com os flags BUY e SELL acesos simultaneamente, de uma forma equivalente a esta abaixo:

if ((ticks[i].flags & ( TICK_FLAG_SELL | TICK_FLAG_BUY ) ) == TICK_FLAG_SELL | TICK_FLAG_BUY )
{
    // Trata tick com agressor indeterminado (talvez seja "negócio direto")
}

Eu faço isso porque, se eu ignorasse esses ticks que vêm com BUY e SELL acesos, que geralmente perfazem em algo em torno de 1% do volume total, alguns cálculos que eu faço com base no volume total negociado ficariam inconsistentes. 

 
Trader_Patinhas:

Só posso te dizer que, nos históricos de índice e dólar que eu baixo usando CopyTicks(), NUNCA aparecem flags zerados. Já baixei dezenas de milhões de ticks e não aparece nenhum zerado. Só aparecem 6 combinações: BID, ASK, BID+ASK, LAST+VOLUME+BUY, LAST+VOLUME+SELL e LAST+VOLUME+BUY+SELL (este último é o que eu acredito que possa ser o "negócio direto" e geralmente é 1% ou menos do volume total do dia). Quando eu tiver um tempo posto aqui uma estatística.

Sim, o flag BUY+SELL é o famoso Direto... A pessoa da thread americana confirmou isso...

;)


Os ticks zerados eu só pego via SymbolInfoTick(), na Modal... CopyTicks não tem esse problema.

Não fiz uma comparação logando o resultado de ambos os processos porque já estou cansado de me debater com as inconsistências do MQL... Uma rotina simples que levaria 30min pra codificar levou o dia inteiro...

Torço pra que o Pine Script evolua muito, e rápido, e/ou que o Ninja Trader entre com tudo no Brasil...

;)

 
Trader_Patinhas:

Oi Jhoni.

O código que eu uso utiliza exatamente essa lógica que você codificou, só que, além dos 2 casos que o seu código trata (BUY e SELL), eu trato também os caso que vêm com os flags BUY e SELL acesos simultaneamente, de uma forma equivalente a esta abaixo:

Eu faço isso porque, se eu ignorasse esses ticks que vêm com BUY e SELL acesos, que geralmente perfazem em algo em torno de 1% do volume total, alguns cálculos que eu faço com base no volume total negociado ficariam inconsistentes. 

Entendi, vou incluir esse tratamento também.

Obrigado.

 

Olá,

Alguém sabe se TICK_FLAG pode ter um valor maior de 252?

Usando CopyTicksRange eu recebo TICKS_FLAGS que tem 256 a mais(somados) no flag.

Exemplo: TICK_FLAG 312 em vez de 56.

TICK_FLAG 376 em vez de 120

TICK_FLAG 344 em vez de 88

Isso está correto?

Mais detalhes no print abaixo.


Usando essa mesma Array do tipo MQLtick para atualizar um simbolo customizado com CustomTicksReplace(), o simbolo customizado fica com os flags diferente do simbolo de origem (deduzido 256).

O grande problema é que o backtest do simbolo real é diferente do simbolo customizado, sendo a única diferença seja o valor do Flag.

Realmente faz falta um histórico longo de Ticks reais que seja confiável.


Um agradecimento: Obrigado a todos pelas informações. Muito úteis!

 
dvd:

Olá,

Alguém sabe se TICK_FLAG pode ter um valor maior de 252?

Usando CopyTicksRange eu recebo TICKS_FLAGS que tem 256 a mais(somados) no flag.

Exemplo: TICK_FLAG 312 em vez de 56.

TICK_FLAG 376 em vez de 120

TICK_FLAG 344 em vez de 88

Isso está correto?

Mais detalhes no print abaixo.


Usando essa mesma Array do tipo MQLtick para atualizar um simbolo customizado com CustomTicksReplace(), o simbolo customizado fica com os flags diferente do simbolo de origem (deduzido 256).

O grande problema é que o backtest do simbolo real é diferente do simbolo customizado, sendo a única diferença seja o valor do Flag.

Realmente faz falta um histórico longo de Ticks reais que seja confiável.


Um agradecimento: Obrigado a todos pelas informações. Muito úteis!

Sim, de um tempo pra cá os ticks de compra/venda passaram a vir com o flag 8 (valor 256) ativo. Esse flag aparentemente não está documentado e não tenho ideia do que se trata. Eu simplesmente o ignoro.

 
Trader_Patinhas:

Sim, de um tempo pra cá os ticks de compra/venda passaram a vir com o flag 8 (valor 256) ativo. Esse flag aparentemente não está documentado e não tenho ideia do que se trata. Eu simplesmente o ignoro.

Obrigado. Segundo o forum em inglês, parece que o bit-8 no flag é para uso interno no MetaTrader, já conhecido mas não documentado.

No entanto, para mim, isso tem gerado diferenças no resultado do BackTest com simbolo original para um simbolo customizado idêntico ao original.

Mais sobre essa discussão no tópico https://www.mql5.com/en/forum/316414

Does anyone know if TICK_FLAG can have a larger value of 252?
Does anyone know if TICK_FLAG can have a larger value of 252?
  • 2019.06.24
  • www.mql5.com
General: Does anyone know if TICK_FLAG can have a larger value of 252?
Razão: