MqlTick.flags zerado

 

Fala pessoal, tudo certo?

Estou desenvolvendo um código para avaliar os ticks, mas alguns deles estão vindo com o flags zerado, segue o meu código:

void OnTick()
{
   MqlTick tick;
   if (SymbolInfoTick(Symbol(), tick)) {
      string print = tick.time_msc + " " + tick.volume + " " + tick.bid + " " + tick.time + " " + IntegerToString(tick.flags, 3, '0') + " ";
      
      // Print(EnumToString(TICK_FLAG_ASK));
      
      if ((tick.flags &TICK_FLAG_BUY) == TICK_FLAG_BUY)
         print += " TICK_FLAG_BUY  ";
      if ((tick.flags &TICK_FLAG_SELL) == TICK_FLAG_SELL)
         print += " TICK_FLAG_SELL ";
      if ((tick.flags &TICK_FLAG_ASK) == TICK_FLAG_ASK)
         print += " TICK_FLAG_ASK ";
      if ((tick.flags &TICK_FLAG_BID) == TICK_FLAG_BID)
         print += " TICK_FLAG_BID ";
      if ((tick.flags &TICK_FLAG_LAST) == TICK_FLAG_LAST)
         print += " TICK_FLAG_LAST ";
      if ((tick.flags &TICK_FLAG_VOLUME) == TICK_FLAG_VOLUME)
         print += " TICK_FLAG_VOLUME ";

      Print(print);
   }
}

E segue o resultado:

Resultado


Como é apenas um teste está dando alguns avisos de conversão de dados numéricos para string na compilação, mas não estou me preocupando com isso no momento.

As corretoras onde fiz o teste são Modal e XP.


Obrigado.

Jhoni Carlos da Silva.

 
jdayanami:

Fala pessoal, tudo certo?

Estou desenvolvendo um código para avaliar os ticks, mas alguns deles estão vindo com o flags zerado, segue o meu código:

E segue o resultado:



Como é apenas um teste está dando alguns avisos de conversão de dados numéricos para string na compilação, mas não estou me preocupando com isso no momento.

As corretoras onde fiz o teste são Modal e XP.


Obrigado.

Jhoni Carlos da Silva.

É um EA?


E, os ticks são de Forex?


uma vez vi um post onde uma pessoa recebia 2 tick flags ao mesmo tempo. Essa estrutura é com operação de bits... Dá uma olhada nesta thread:

https://www.mql5.com/en/forum/212349

TICK_FLAG_BUY and TICK_FLAG_SELL simultaneously set in MqlTick structure
TICK_FLAG_BUY and TICK_FLAG_SELL simultaneously set in MqlTick structure
  • 2017.07.31
  • www.mql5.com
Hi all, When I use CopyTicks(), I often get some ticks with flags = 96 in their MqlTick structure...
 
Flavio Jarabeck:

É um EA?


E, os ticks são de Forex?


uma vez vi um post onde uma pessoa recebia 2 tick flags ao mesmo tempo. Essa estrutura é com operação de bits... Dá uma olhada nesta thread:

https://www.mql5.com/en/forum/212349

Boa tarde Flávio, obrigado por responder.


Sim, é um EA, e não, não é Forex. É Mini contrato de dólar.

Com relação a thread, ele fala sobre os valores estarem divergentes em um buy\sell, não é o meu caso, no meu caso, a propriedade flags não identifica que tipó de tick é.

Olhando para o histórico de negociações, aparentemente estes com a flag zerada são buy, pois identifiquei uns com volume alto e foi possível distinguir, mas não sei se é regra.


Obrigado.

Jhoni Carlos da Silva.

 
jdayanami:

Boa tarde Flávio, obrigado por responder.


Sim, é um EA, e não, não é Forex. É Mini contrato de dólar.

Com relação a thread, ele fala sobre os valores estarem divergentes em um buy\sell, não é o meu caso, no meu caso, a propriedade flags não identifica que tipó de tick é.

Olhando para o histórico de negociações, aparentemente estes com a flag zerada são buy, pois identifiquei uns com volume alto e foi possível distinguir, mas não sei se é regra.


Obrigado.

Jhoni Carlos da Silva.

Coincidentemente estou passando pelo mesmo perrengue.

O que descobri é que o SymbolInfoTick() tem 2 bizarrices, Flag zerado e que NÃO entrega os FLAGS de BUY e SELL, ao contrário do CopyTicks(), que te dá tudo direitinho.

Abri uma thread no Forum americano... vamos ver...

Tem que ter um saco gigantesco pra programar em MQL5...

:(





https://www.mql5.com/en/forum/304098

TICK_FLAG_BUY / TICK_FLAG_SELL - CopyTicks() and SymbolInfoTick() difference
TICK_FLAG_BUY / TICK_FLAG_SELL - CopyTicks() and SymbolInfoTick() difference
  • 2019.02.19
  • www.mql5.com
While CopyTicks() give me the TICK_FLAG_BUY / TICK_FLAG_SELL flags, SymbolInfoTick() does not...
 
Flavio Jarabeck:

Coincidentemente estou passando pelo mesmo perrengue.

O que descobri é que o SymbolInfoTick() tem 2 bizarrices, Flag zerado e que NÃO entrega os FLAGS de BUY e SELL, ao contrário do CopyTicks(), que te dá tudo direitinho.

Abri uma thread no Forum americano... vamos ver...

Tem que ter um saco gigantesco pra programar em MQL5...

:(





https://www.mql5.com/en/forum/304098

Verdade. A solução paliativa que eu encontrei é procurar por aquele price no book de ofertas, e comparar criando um histórico, mas é muito trabalhoso e consome muito processamento que não precisaria se tivesse a informação no MqlTick.
 
jdayanami:
Verdade. A solução paliativa que eu encontrei é procurar por aquele price no book de ofertas, e comparar criando um histórico, mas é muito trabalhoso e consome muito processamento que não precisaria se tivesse a informação no MqlTick.

Consegui fazer fia SymbolInfoTick(), rastreando is bits dos Flags. Parece bizarro, mas é o que a B3/Corretora nos fornece. Provavelmente vai dar pau em corretoras Forex, portanto cuidado...


Código:

   if (!SymbolInfoTick( _Symbol, curTick ))  { Print("Tick NOT received!"); return 0; }
    /*
    //DEBUG: TICK_FLAG_BID | TICK_FLAG_ASK = 6  // TICK_FLAG_LAST | TICK_FLAG_VOLUME = 24 //  BUY=56 / SELL=88 -->TICK_FLAG_LAST+TICK_FLAG_VOLUME+TICK_FLAG_BUY,idem
        string o = TimeToString(curTick.time) + "    bid: " + (string)curTick.bid + "   ask:" + (string)curTick.ask + "   last: " + (string)curTick.last + "    vol:" + (string)curTick.volume_real;
        if      ((curTick.flags &TICK_FLAG_BID)==TICK_FLAG_BID)       { o += "    -BID- " + (string)curTick.flags; }
        else if ((curTick.flags &TICK_FLAG_ASK)==TICK_FLAG_ASK)       { o += "    -ASK- " + (string)curTick.flags; }
        else if ((curTick.flags &TICK_FLAG_LAST)==TICK_FLAG_LAST)     { o += "    -LAST- " + (string)curTick.flags; }
        else if ((curTick.flags &TICK_FLAG_BUY)==TICK_FLAG_BUY)       { o += "    -BUY- " + (string)curTick.flags; }
        else if ((curTick.flags &TICK_FLAG_SELL)==TICK_FLAG_SELL)     { o += "    -SELL- " + (string)curTick.flags; }
        else if ((curTick.flags &TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME) { o += "    -VOLUME- " + (string)curTick.flags; }
        else                                                          { o += "    -UNKNOWN- " + (string)curTick.flags; } 
        Print( o );
    */
   
    if      (curTick.flags == TICK_FLAG_LAST+TICK_FLAG_VOLUME+TICK_FLAG_BUY)  { bufferBUY[0] +=curTick.volume_real; }
    else if (curTick.flags == TICK_FLAG_LAST+TICK_FLAG_VOLUME+TICK_FLAG_SELL) { bufferSELL[0] -=curTick.volume_real; }
 

Já passei por isso.

A solução que encontrei foi jogar no lixo a função SymbolInfoTick() e passar a usar somente a CopyTicks() ou a CopyTicksRange(), mesmo quando a intenção é ler apenas o tick mais recente (nesse caso uso a CopytTicks com from=0 e count=1, que é equivalente ao SymbolInfoTick sem o problema dos flags).

Como atualmente uso algoritmos que processam tick a tick, tenho usado mais a CopyTicksRange().

 
Trader_Patinhas:

Já passei por isso.

A solução que encontrei foi jogar no lixo a função SymbolInfoTick() e passar a usar somente a CopyTicks() ou a CopyTicksRange(), mesmo quando a intenção é ler apenas o tick mais recente (nesse caso uso a CopytTicks com from=0 e count=1, que é equivalente ao SymbolInfoTick sem o problema dos flags).

Como atualmente uso algoritmos que processam tick a tick, tenho usado mais a CopyTicksRange().

MQL é uma linguagem forrada de exceções e inconsistências... Não me admira vários projetos gerarem atrasos inesperados...

Perdi horas hoje só pra adivinhar que diabos o MQL estava fazendo com os flags...

Torço para o que o Pine Script ande a passos gigantescos... esses russos da Metaquotes precisam de um chacoalhão...

Como se não bastasse os updates Goela-Abaixo de versões beta em sistemas na produção - sim, somos todos cobaias - desligaram o suporte, cabendo à comunidade se virar...

:(

 
Flavio Jarabeck:


Código:

if      (curTick.flags == TICK_FLAG_LAST+TICK_FLAG_VOLUME+TICK_FLAG_BUY)  { bufferBUY[0] +=curTick.volume_real; }
    
else if (curTick.flags == TICK_FLAG_LAST+TICK_FLAG_VOLUME+TICK_FLAG_SELL) { bufferSELL[0] -=curTick.volume_real; }

Flávio, na B3 muitos ticks vêm com os flags BUY e SELL acesos simultaneamente.

Acredito que sejam os chamados "negócios diretos": a corretora junta ofertas de compra e de venda de clientes seus e, em vez de enviar as ordens pro mercado, manda apenas a notificação de "negócio direto" para a B3 (isso é obrigatório por lei, pois não pode haver negócio fora do pregão).

Fiz uns estudos há tempos atrás e vi que no mini-índice essas situações de BUY e SELL acesos simultaneamente chegavam a mais de 1% do volume total dos negócios em alguns dias.

Nesse teu código aí em cima, os volumes dos ticks que vierem com BUY e SELL acesos simultaneamente não serão somados nem no bufferBuy nem no bufferSell, de modo que, no fim do dia, a soma bufferBuy + bufferSell vai ficar um pouquinho menor que o volume total de negócios. Não sei se isso é relevante para a sua estratégia, mas é bom vc estar ciente de que essa soma não vai bater e o motivo disso.

Na minha versão do teu código acima (eu também faço isso), no caso dos flags com BUY e SELL acesos ao mesmo tempo, eu somo metade do volume pra BUY e metade pra SELL. Desta forma a soma bate. Mas se vc for criar indicadores baseados na proporção entre agressão de compra e de venda, tipo BUY/(BUY+SELL) e SELL/(BUY+SELL), aí já fica meio discutível como deveriam ser contabilizados os ticks "biagressores". Descartá-los, como você faz, talvez não seja uma solução ruim. Eles são 1% ou menos do volume total, então talvez essa discussão seja preciosismo excessivo.

O pior é que já constatei que esses flags às vezes variam de corretora pra corretora (uma diz que é BUY e outra diz que é SELL, pro mesmo tick). São muito raros os ticks cujos flags BUY/SELL variam entre corretoras, mas no mini-dolar e no mini-indice todos os dias tem alguns.

Isso me faz me perguntar(*) se essa informação dos flags BUY e SELL (quem foi a parte agressora) vem mesmo da bolsa ou se é o MT5 que tenta inferir esses flags comparando LAST com BID e ASK. Neste último caso, se os ticks chegarem fora da ordem (lembrar que o protocolo TCP/IP usado na internet não garante que os pacotes cheguem na mesma ordem em que foram enviados), cada instância de MT5 pode fazer uma inferência diferente, o que explicaria a existência de algumas raras discrepâncias entre corretoras (se a informação viesse da bolsa, deveria ser rigorosamente a mesma em todas as corretoras, pois o TCP/IP garante a entrega de todos os pacotes a todos os destinos, embora não necessariamente na mesma ordem).

(*) lembrei do Led Zeppelin quando escrevi isso ... "hmmm, it makes me wonder..."

 
Flavio Jarabeck:

MQL é uma linguagem forrada de exceções e inconsistências... Não me admira vários projetos gerarem atrasos inesperados...

Perdi horas hoje só pra adivinhar que diabos o MQL estava fazendo com os flags...

Torço para o que o Pine Script ande a passos gigantescos... esses russos da Metaquotes precisam de um chacoalhão...

Como se não bastasse os updates Goela-Abaixo de versões beta em sistemas na produção - sim, somos todos cobaias - desligaram o suporte, cabendo à comunidade se virar...

:(

Nem me fala. Se aqueles mais experimentados em desenvolvimento sofrem, imagina marinheiros de primeira viagem como eu.

Baita perrengue para colocar para rodar e, quando se supera o problema da linguagem, vem a parte nebulosa com as corretoras, inclusive no que menciona o @Trader_Patinhas.

Hoje, em minhas observações, vejo com mais grave o ponto de sincronização. Como cai essa mer...

[ ]'s

 
Flavio Jarabeck:

É um EA?


E, os ticks são de Forex?


uma vez vi um post onde uma pessoa recebia 2 tick flags ao mesmo tempo. Essa estrutura é com operação de bits... Dá uma olhada nesta thread:

https://www.mql5.com/en/forum/212349

O autor desse tópico aí é um velho conhecido meu. Um dia ele perdeu a senha da conta e um feitiço o transformou em pato ;-)  

Razão: