Estado do ativo - Leilão/Negociação

 
Estou criando um EA e preciso que o robô para de executar a lógica caso o ativo esteja em Leilão. Não encontrei um SYMBOL que me retorne com esta informação(em negociação, em leilão). Há alguma função?
 
Geslon Nascimento:

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
 
Eduardo Oliveira:
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

Documentation on MQL5: Constants, Enumerations and Structures / Data Structures / Price Data Structure
Documentation on MQL5: Constants, Enumerations and Structures / Data Structures / Price Data Structure
  • www.mql5.com
This is a structure for storing the latest prices of the symbol. It is designed for fast retrieval of the most requested information about current prices. The parameters of each tick are filled in regardless of whether there are changes compared to the previous tick. Thus, it is possible to find out a...
 
Trader_Patinhas:

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");
         }
     }
  }


Princípios básicos dos testes no MetaTrader 5
Princípios básicos dos testes no MetaTrader 5
  • www.mql5.com
A ideia da negociação automatizada é atraente devido ao fato de que o robô de negociação pode trabalhar por 24 horas por dia, sete dias por semana. O robô não se cansa, não fica em dúvida ou assustado, é totalmente livre de quaisquer problemas psicológicos. É o suficiente para claramente formalizar as regras de negociação e implementá-las nos...
 

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.

 
Trader_Patinhas:

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");
          }
 
Kl_ Urt:

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);      
     }
}
Razão: