Longo Spread entre ask/bid e last price no MqlTick e Times and Trades - página 2

 
Rogerio Giannetti Torres:

Agora não entendo mais nada,  como é que pode?

A exportação de os ticks pela tela de "ATIVOS" mostra um preço e exportação de ticks pelo Time and Sales mostra outros preços!

Alguém responde?

Raciocinem comigo e me digam se estou viajando na maionese ... imagino que haja somente 1 único repositório onde o histórico de ticks fica gravado, certo? ... seria muito surreal ter mais de um (seria um desperdício absurdo de espaço)  ....

Sendo assim, se a exportação de ticks gera resultados diferentes quando acionada em lugares diferentes da plataforma, então só pode ser porque um desses lugares faz algum tipo de processamento a posteriori que o outro não faz (talvez seja justamente algum tipo de correção de distorções como essa que o OP está relatando).

Vc chegou a comparar o resultado dessas duas exportações com o resultado retornado por um script chamando copyticksrange() no período em torno do fenômeno relatado pelo OP ?

Seria interessante fazer essa comparação pra ver qual exportação coincide com o resultado de copyticksrange() ... a que coincidir deve ser a mais confiável (mero palpite) ... já pensou se vier um terceiro resultado diferente dos dois anteriores??? 

 
DanielStreet:
Entendi. @Trader_Patinhas

Isso é meio perigoso pros usuários não?? O fato de o preço real estar tão longe do bid e ask (que estão errados efetivamente, não?).

Acredito que possa induzir muitos usuários ao erro, caso estes não verifiquem a relação bid/ask/last, não?

Eu fui olhar no CSV e percebi que a situação só se estabilizou quase 4 segundos depois (uma eternidade para um robô).

O que acham dessa situação?? Há uma maneira de revertê-la? Obter só as informações de maneira "sincronizada" (last x bid x ask)?

Outra pergunta seria: como observar uma situação dessa ocorrendo? Como saber que alguém consumiu o book com uma grande ordem??

Ví que o book tem uma propriedade TYPE_SELL_MARKET (que eu não entendi muito bem, para ser sincero). Seria o caso de verificar se as últimas ordens foram do tipo???

Obrigado pelas respostas!! Grande abraço!

Oi Daniel.

Eu trato isso comparando sempre BID e ASK com LAST.

Eu parto da premissa de que o LAST tá sempre mais atualizado que o BID/ASK (não sei se isso é verdade sempre, mas é o que costumo observar nos logs nesses momentos de movimento intenso, como esse que vc descreveu).

Então, sempre que LAST < BID, eu considero o LAST como sendo o verdadeiro valor do BID naquele momento ... e sempre que LAST > ASK, eu considero o LAST como sendo o verdadeiro ASK ... meus algoritmos de scalping seguem sempre essa lógica ... se ocorrer o oposto, pelo menos eu fico sempre do lado mais conservador (na hora da volatilidade, prefiro que o robô tome decisões considerando o cenário pessimista em que o preço real está pior que o indicado no BID/ASK do que se iludir achando o contrário).  

Quanto ao TYPE_SELL_MARKET, isso só acontece durante os leilões, quando a negociação está suspensa. Todos os dias tem leilão na abertura e no fechamento do mercado. E às vezes, em momentos de altíssima volatilidade, rola também leilão no meio do pregão, em momentos imprevisíveis.

Quando alguém manda ordem a mercado durante um leilão (seja na abertura, no fechamento, ou no meio da sessão), a ordem fica pendurada no book com o tipo TYPE_BUY_MARKET ou TYPE_SELL_MARKET.

Durante o leilão, como a negociação está suspensa, é comum o preço BID (melhor oferta de compra) ultrapassar o preço ASK (melhor oferta de venda).

Na hora que o mercado reabre, essas ordens a mercado TYPE_BUY_MARKET e TYPE_SELL_MARKET e as ordens limite (ofertas) com preço melhor que o preço de fechamento do leilão são todas executadas simultaneamente, umas contra as outras, pelo preço de fechamento do leilão (também chamado de "preço teórico").

É importante que o algoritmo do seu robô saiba como lidar com a situação de leilão, pois ela pode ocorrer a qualquer momento, de modo que até mesmo uma ordem a mercado pode ficar "presa" durante o leilão (você fica impedido de cancelá-la se ela tiver preço melhor que o preço teórico que estiver vigorando no momento). A lógica do seu robô tem que saber lidar com BID > ASK, com ordem a mercado ficando pendente e podendo ser executada por um preço MUITO longe daquele que estava quando vc enviou a ordem, etc.).

Robô de scalping não é pra amador não! Tem que estudar muito e pensar em todas as possibilidades! kkk!

 

Trader_Patinhas... Me dá uma luz?!


Eu não entendo as linguagens de programação usadas no MQL5. Porém tenho uma noção de lógica e gostaria de entender se o que eu fiz está correto.


Tenho um robo que já operei em conta real e a lógica funciona.   Mas voltei para os testes porque perdi grana.


Em testes estou tendo um problema e depois de muito pesquisar,a chei esse seu texto que está falando justamente do problema que to tendo agora e não consigo resolver.


Opero mini contratos de índice e dolar. Todo o fonte do meu robo é feito em cima de ASK e BID. Mas nos dias de muita volatilidade (essas ultimas semanas por exemplo) em testes, vi que as vezes toda as ordens eram disparadas/executadas sem que a cotação minima/maxima fossem atingidas e isso me dava um desanimo pensando que o robo era falho.   E como na baixa volatilidade, isso não acontecia, ficava difícil de pegar o "erro". Porém esses dias em leilão, vi que as ordens estavam sendo disparadas sem que a negociação estivesse aberta.


Foi aí que vi o problema...


Em fim,   peguei meu código e troquei tudo que era ASK e BID e coloquei LAST.    Obs: Como opero muitas ordens, não me preocupo com a melhor oferta de venda ou compra, mas me preocupo com a cotação atual do ativo.


O que eu fiz está certo? (lembrando que não programo aqui, apenas fuço e não sei mexer com funções mais complexas)


O que preciso é que o meu robo somente opere com mercado em negociação (fora de leilão).


Obrigado! 

 
LE08061979:

Trader_Patinhas... Me dá uma luz?!


Eu não entendo as linguagens de programação usadas no MQL5. Porém tenho uma noção de lógica e gostaria de entender se o que eu fiz está correto.


Tenho um robo que já operei em conta real e a lógica funciona.   Mas voltei para os testes porque perdi grana.


Em testes estou tendo um problema e depois de muito pesquisar,a chei esse seu texto que está falando justamente do problema que to tendo agora e não consigo resolver.


Opero mini contratos de índice e dolar. Todo o fonte do meu robo é feito em cima de ASK e BID. Mas nos dias de muita volatilidade (essas ultimas semanas por exemplo) em testes, vi que as vezes toda as ordens eram disparadas/executadas sem que a cotação minima/maxima fossem atingidas e isso me dava um desanimo pensando que o robo era falho.   E como na baixa volatilidade, isso não acontecia, ficava difícil de pegar o "erro". Porém esses dias em leilão, vi que as ordens estavam sendo disparadas sem que a negociação estivesse aberta.


Foi aí que vi o problema...


Em fim,   peguei meu código e troquei tudo que era ASK e BID e coloquei LAST.    Obs: Como opero muitas ordens, não me preocupo com a melhor oferta de venda ou compra, mas me preocupo com a cotação atual do ativo.


O que eu fiz está certo? (lembrando que não programo aqui, apenas fuço e não sei mexer com funções mais complexas)


O que preciso é que o meu robo somente opere com mercado em negociação (fora de leilão).


Obrigado! 

A razão do seu problema é que, quando o ativo entra em leilão, o ASK e o BID podem ficar invertidos (o BID pode ficar mais alto que o ASK) e a diferença pode ficar muito grande (BID muito acima do ASK), de modo que nenhum dos dois, nem BID nem ASK, serão um indicador confiável do preço de mercado.

Eu recomendo fortemente vc evitar os leilões, ou seja, quando o ativo entrar em leilão, não compre nem venda. Para isso, basta condicionar suas ordens de compra/venda dentro de um "if (BID < ASK)".  

Leilões estão associados a movimentos muito bruscos de mercado, com altíssimo risco para especuladores pequenos como nós, pois durante um leilão nosso stop-loss de proteção será ignorado e, se estivermos posicionados na direção errada, podemos sair com um prejuízo muito além do máximo admitido pelo nosso gerenciamento de risco.

Mesmo condicionando as ordens a (BID < ASK), existe o risco de o leilão ocorrer num momento em que vc já está posicionado (ai lascou, pq vc só vai conseguir zerar a posição qdo o leilão acabar, pelo preço que estiver, independente do stop-loss).

Por isso, o ideal é vc verificar no site da B3 o "túnel de negociação" do seu ativo (variação máxima percentual de preço antes de disparar leilão) e inserir uma lógica no EA para zerar posição ANTES que o ativo entre em leilão.

Por exemplo, o túnel de negociação do mini-índice é de 7,5%. Vc pode se proteger de ficar preso num leilão inserindo uma lógica no EA para zerar posição e ficar quieto (sem comprar nem vender) tão logo a variação de preço atinja 6 ou 7%, por exemplo.

 

É possível enviar uma ordem sell/buy stop, através de um expert, sem verificar a posição do ask/bid no terminal?

Pergunto isso porque a minha corretora tem um delay significativo entre ask/bid e last.

Obs: Eu tenho pouco conhecimento em programação, o máximo que eu consegui fazer 

foi adicionar a função sleep entre o sinal e a ordem, mas eu não quero ficar trabalhando

com uma "gambiarra", pois a partir de então, todas as ordens terão sleep, mesmo com a

maioria não precisando.

Razão: