OnTrade x OnTick | Dúvida Simples

 

Pessoal, bom dia

Acho que essa é bem fácil mas gostaria da confirmação dos universitários: estou utilizando a função OnTick num EA porém percebi que esse evento é chamado durante o leilão de abertura do mercado, ou seja, antes mesmo das 09h.

1. É isso mesmo? Essa função passa a coletar as variações antes mesmo da abertura propriamente dita do mercado?
2. O evento OnTrade trabalharia da mesma maneira ou somente após a primeira negociação ter ocorrido que se daria próximo das 09h?

Na prática, preciso exatamente de um evento que somente passe a ser chamado após a abertura do mercado, ou seja, não pode ser vinculado no leilão de abertura!

Muito obrigado

 

Felipe,

OnTrade() é chamado apenas quando ocorre os eventos abaixos:

  • envio, modificação e remoção de uma ordem pendente;
  • cancelamento de uma ordem pendente com ausência de dinheiro suficiente ou expiração;
  • ativação de uma ordem pendente;
  • abertura, acréscimo ou encerramento de uma posição (ou parte da posição);
  • modificação da posição aberta (alteração de stops - Stop Loss e/ou Take Profit).


Só que ele só é chamado quando esses eventos ocorrem feitos por você. Isso é, se você envia uma ordem ou modifica uma ordem pendente. Entendeu? Se você não enviar nada o dia todo, esse evento não será chamado.

Acredito que a melhor maneira para você fazer isso, é utilizar o método OnTick(), colocando um filtro de horário, tipo: HoraInicial : 09:00:01 e HoraFinal: 17:45:00 por exemplo.


 

Estou com esta mesma dúvida no meu Stop móvel. Na abertura ou no fechamento o meu stop ia lá pra cima e zerava a operação devido ao leilão, que dá ticks altíssimos, o que dá um resultado indesejável o algoritmo do stop movel. Então coloquei filtro de horário e até agora funcionou, por exemplo, das 10:00 hs às 17:00 hs, para evitar com 100% o leilão de abertura. Mas em dias em que a bolsa abre mais tarde, por exemplo, na quarta feira de cinzas, teria que fazer uma nova programação no EA, e todo ano muda este dia. Deveria ter uma forma de filtrar sem precisar fazer pelo horário.

 
Fernando Baratieri:

Felipe,

OnTrade() é chamado apenas quando ocorre os eventos abaixos:

  • envio, modificação e remoção de uma ordem pendente;
  • cancelamento de uma ordem pendente com ausência de dinheiro suficiente ou expiração;
  • ativação de uma ordem pendente;
  • abertura, acréscimo ou encerramento de uma posição (ou parte da posição);
  • modificação da posição aberta (alteração de stops - Stop Loss e/ou Take Profit).


Só que ele só é chamado quando esses eventos ocorrem feitos por você. Isso é, se você envia uma ordem ou modifica uma ordem pendente. Entendeu? Se você não enviar nada o dia todo, esse evento não será chamado.

Acredito que a melhor maneira para você fazer isso, é utilizar o método OnTick(), colocando um filtro de horário, tipo: HoraInicial : 09:00:01 e HoraFinal: 17:45:00 por exemplo.


Fernando, agradeço sua resposta mas como nosso amigo MetaLucson disse acima, o evento OnTick resolve parcialmente pois limitar com filtro de horário, em determinados momentos do ano (quarta-feira de cinzas, por exemplo), pode não funcionar ou ter exceções a mais no código.

Minha real necessidade é entrar com ordem no exato momento em que o mercado abrir, ou seja, o mais rápido possível. Não tem nada específico mesmo?

Grande abs,

 
Felipe Dourado Goncalves De Souza:

Fernando, agradeço sua resposta mas como nosso amigo MetaLucson disse acima, o evento OnTick resolve parcialmente pois limitar com filtro de horário, em determinados momentos do ano (quarta-feira de cinzas, por exemplo), pode não funcionar ou ter exceções a mais no código.

Minha real necessidade é entrar com ordem no exato momento em que o mercado abrir, ou seja, o mais rápido possível. Não tem nada específico mesmo?

Grande abs,

Felipe, boa noite.

Você pode trabalhar com a função Copyticks(), assim que houver a primeira negociação do dia você executa o que deve ser feito.

Abs,

Romeu Bertho.

 
Romeu Bertho:

Felipe, boa noite.

Você pode trabalhar com a função Copyticks(), assim que houver a primeira negociação do dia você executa o que deve ser feito.

Abs,

Romeu Bertho.

Romeu, obrigado pela dica.

Fiquei pensando aqui e acredito que tenha encontrado uma solução para o caso. Veja abaixo:

   if(candle[0].open!=lastDayOpeningTrade)
   {
      enterOrder = true;
      lastDayOpeningTrade = candle[0].open;     
      } 

Imagino que vai funcionar bem pois o candle[0].open somente irá obter informação a partir do momento de formação do primeiro candle do dia.

Ou estou errado?

Grande abs,

 

Olá

veja se esse código pode te ajudar.


int OnInit()
{
..
...
....
   SymbolInfoTick(_Symbol,tick);
   while((tick.flags&TICK_FLAG_BUY)!=TICK_FLAG_BUY && (tick.flags&TICK_FLAG_SELL)!=TICK_FLAG_SELL && !IsStopped())
     {
      Sleep(20);
      SymbolInfoTick(_Symbol,tick);
     }
   Print("Primeiro negócio:  ",tick.time," ",// Hora do tick
         tick.bid," ",                       // Preço corrente de venda 
         tick.ask," ",                       // Preço corrente de compra 
         tick.last," ",                      // Preço da última operação (preço último) 
         tick. volume," ",                   // Volume para o preço último corrente
         tick.time_msc," ",                  // Tempo do "Last" preço atualizado em  milissegundos 
         tick.flags);                        // Flags de tick
}
 
Felipe Dourado Goncalves De Souza:

Romeu, obrigado pela dica.

Fiquei pensando aqui e acredito que tenha encontrado uma solução para o caso. Veja abaixo:

Imagino que vai funcionar bem pois o candle[0].open somente irá obter informação a partir do momento de formação do primeiro candle do dia.

Ou estou errado?

Grande abs,

Felipe, boa noite.

Sinceramente eu nunca testei esta sua abordagem, já a do CopyTicks() eu garanto que funciona.

Caso você chegue a testar o seu código, conte-nos depois como que foi.

Abs,

Romeu Bertho.

 
Romeu Bertho:

Felipe, boa noite.

Sinceramente eu nunca testei esta sua abordagem, já a do CopyTicks() eu garanto que funciona.

Caso você chegue a testar o seu código, conte-nos depois como que foi.

Abs,

Romeu Bertho.

Romeu, boa noite

O código funcionou sim, sem nenhum problema. Veja que coloquei uma condição anterior ao código para que rode uma única vez no código, depois ela é descartada pois a variável "a" terá o valor de 2. O código para esse check ficaria assim: 

//--- Função CopyRate para capturar dados do último candle
   CopyRates(ativo,PERIOD_D1,0,2,candle);
   
//--- Condição para igualar o preço do último candle à variável lastDayOpeningTrade. Repete uma única vez em todo código    
   if(a==1)
   {
      lastDayOpeningTrade = candle[0].open;
      a = 2;
      }

//--- Verifica se houve alteração do candle de abertura && verifica se o último tick é diferente do preço do candle de abertura
   if(candle[0].open!=lastDayOpeningTrade)
   {
      enterOrder = true;
      lastDayOpeningTrade = candle[0].open;    
      } 

Abs,

 
Felipe Dourado Goncalves De Souza:

Romeu, boa noite

O código funcionou sim, sem nenhum problema. Veja que coloquei uma condição anterior ao código para que rode uma única vez no código, depois ela é descartada pois a variável "a" terá o valor de 2. O código para esse check ficaria assim: 

Abs,

 
Felipe Dourado Goncalves De Souza:

Romeu, boa noite

O código funcionou sim, sem nenhum problema. Veja que coloquei uma condição anterior ao código para que rode uma única vez no código, depois ela é descartada pois a variável "a" terá o valor de 2. O código para esse check ficaria assim: 

Abs,

Definir uma variável static pode ajudar na hora de estabelecer o valor apenas na primeira execução de uma função
Razão: