- LEILÃO DOS ATIVOS
- Operando durante leilão de pré-abertura
- Como posso checar o status de negociação? Normal ou em leilão
Não existe nenhum atributo em SYMBOL que identifique que está em leilão. Mas é possível "contornar" essa situação executando dois testes
1) Na fase de pregoamento pode ocorrer: bid >= ask return;
2) Como não há negociação na fase de leilão: last == ultimoLast return;
acho que se tiver em leilão não terá tick novo, se sua estrategia estiver em OnTick talvez não precise fazer nada, mas precisa testar é palpite
Me parece que antes mesmo da abertura ou do leilão, ocorrem alguns ticks (no caso XP). Mas talvez pelo volume desses ticks (!= 0) consiga identificar...
Esses ticks com flags 2, 4 e 6 aí no início são movimentações do book durante o leilão de abertura.
2 é o TICK_FLAG_BID (indica que o preço BID mudou)
4 é o TICK_FLAG_ASK (indica que o preço ASK mudou)
6 são os dois combinados (ambos os preços BID e ASK mudaram)
obs: todos estão com volume em branco, nenhum tem volume != 0, pois não há negociação (talvez vc tenha se confundido pq o editor de texto desalinhou a exibição do campo <FLAGS>)
Veja o significado dos flags aqui: https://www.mql5.com/en/docs/constants/structures/mqltick
- www.mql5.com
Esses ticks com flags 2, 4 e 6 aí no início são movimentações do book durante o leilão de abertura.
2 é o TICK_FLAG_BID (indica que o preço BID mudou)
4 é o TICK_FLAG_ASK (indica que o preço ASK mudou)
6 são os dois combinados (ambos os preços BID e ASK mudaram)
obs: todos estão com volume em branco, nenhum tem volume != 0, pois não há negociação (talvez vc tenha se confundido pq o editor de texto desalinhou a exibição do campo <FLAGS>)
Veja o significado dos flags aqui: https://www.mql5.com/en/docs/constants/structures/mqltick
Não consegui através do link sugerido identificar a que corresponde cada tick, mas talvez pelo volume seja outra forma também de diferenciar ticks pré-abertura/leilão:
void OnTick() { MqlTick last_tick; if(SymbolInfoTick(Symbol(),last_tick)) { if (last_tick.volume == 0) { Print("Pré-abertura / Leilão"); } else if (last_tick.volume != 0) { Print("Mercado em negociação"); } } }
- www.mql5.com
Seu lógica de verificar se o volume é zero vai funcionar perfeitamente para identificar os ticks de movimento do book que ocorrem durante o leilão de abertura, pois os ticks de movimento do book repetem o volume negociado no último tick de trade, de modo que, realmente, somente no leilão de abertura haverá ticks com volume == 0.
Mas lembre-se de que há também o leilão de fechamento, que começa às 17:55h e, em dias de grande volatilidade, pode haver leilões no meio do pregão também.
Sugiro vc testar ( last_tick.volume == 0 || last_tick.bid >= last_tick.ask ), pois assim vc detectará também o leilão de encerramento e eventuais leilões extraordinários que ocorram durante o pregão.
Seu lógica de verificar se o volume é zero vai funcionar perfeitamente para identificar os ticks de movimento do book que ocorrem durante o leilão de abertura, pois os ticks de movimento do book repetem o volume negociado no último tick de trade, de modo que, realmente, somente no leilão de abertura haverá ticks com volume == 0.
Mas lembre-se de que há também o leilão de fechamento, que começa às 17:55h e, em dias de grande volatilidade, pode haver leilões no meio do pregão também.
Sugiro vc testar ( last_tick.volume == 0 || last_tick.bid >= last_tick.ask ), pois assim vc detectará também o leilão de encerramento e eventuais leilões extraordinários que ocorram durante o pregão.
Salvo engano, até onde pude verificar, qualquer outro movimento de tick que não seja negociação (em mercado aberto), tem volume = 0 (talvez a edentação na imagem do post tenha misturado a coluna volume com a de flags) e portanto, mesmo que ocorram outros leilões durante o dia, a idéia é a mesma. Até mesmo no leilão de fechamento, os ticks tem volume = 0, entretanto após o leilão de fechamento, são disparadas todos os ticks de uma só vez (no mesmo horário/minuto/segundo), mas aí já cabe a EA ter outras funcionalidades para evitar a negociação nesse horário. De qualquer forma, obrigado pela dica do bid >= ask, já tá anotado também!
Sim, vc tem razão. Somente ticks de trade têm volume diferente de zero. Portanto, a condição (volume > 0) sozinha já distingue perfeitamente os ticks de trade dos ticks de book.
A condição (bid >= ask) seria para detectar os períodos de leilão, para evitar que o robô negocie nesses momentos.
Ao chegar um tick com bid >= ask, isso significa que o ativo entrou em leilão. Na hora que chegar o primeiro tick com volume > 0, acabou o leilão.
Os leilões de abertura e de fechamento têm horários conhecidos. O teste dessa condição seria para detectar os leilões disparados por volatilidade no meio do pregão (estes leilões são perigosos, pois a sua posição fica presa e o mercado pode voltar a negociar num preço muito além do seu stop-loss de proteção, trazendo prejuízos muito além dos tolerados pela sua estratégia de gerenciamento de risco). Geralmente é muito raro isso acontecer no índice futuro, mas nestes últimos meses da crise covid-19 aconteceu algumas vezes.
Olá pessoal,
No meu caso estou testando um EA para Swing Trade e no testador de estratégia percebo que há fechamentos no leilão. Criel esse double SL e TP para fechar. Como posso usar uma condiçao para nao executar no leilao??
//+------------------------------------------------------------------+ //| LOGICA DE ROTEAMENTO | //+------------------------------------------------------------------+ //--- zerado ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); if( !comprado && !vendido && HoraNegociacao() ) { //--- sinal de compra if( sinalCompra ) { double SL = ask -L; double TP = ask +G; trade.Buy(LOTE,_Symbol,0,SL, TP ,"Compra a mercado"); } //--- sinal de venda if( sinalVenda ) { double SL = bid +L; double TP = bid -G; trade.Sell(LOTE,_Symbol,0 , SL, TP,"Venda a mercado"); }
Salvo engano, até onde pude verificar, qualquer outro movimento de tick que não seja negociação (em mercado aberto), tem volume = 0 (talvez a edentação na imagem do post tenha misturado a coluna volume com a de flags) e portanto, mesmo que ocorram outros leilões durante o dia, a idéia é a mesma. Até mesmo no leilão de fechamento, os ticks tem volume = 0, entretanto após o leilão de fechamento, são disparadas todos os ticks de uma só vez (no mesmo horário/minuto/segundo), mas aí já cabe a EA ter outras funcionalidades para evitar a negociação nesse horário. De qualquer forma, obrigado pela dica do bid >= ask, já tá anotado também!
Estou tentando implementar a sua solução de olhar o volume do último tick pra verificar se o mercado está em leilão.
Mas quando olho o last_tick.volume ele sempre tem volume != 0, mesmo quando o mercado está fechado. Não sei se é um problema da corretora (RICO), mas sempre vem o volume da última negociação.
Será que estou fazendo alguma coisa errada? O código abaixo até funciona, mas por causa do ask e do bid não por causa do volume do last_tick. Mas observei que nem sempre no leilão o ask é menor ou igual ao bid.
bool Leilao() { MqlTick last_tick; if(!SymbolInfoTick(Symbol(),last_tick)) { Print("Erro ao buscar SymbolInfoTick da função Leilao()"); return(true); } if(last_tick.volume == 0 || last_tick.ask <= last_tick.bid) { Print("Pré-abertura / Leilão"); Print("Volume: "+last_tick.volume); Print("Ask :"+last_tick.ask); Print("bid :"+last_tick.bid); return(true); } else if(last_tick.volume != 0 && last_tick.ask > last_tick.bid) { Print("Mercado em negociação"); Print("Volume: "+last_tick.volume); Print("Ask :"+last_tick.ask); Print("bid :"+last_tick.bid); return(false); } else { Print("Erro na função Leilao()"); return(true); } }
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso