Primeiro trade do dia no book

 

Olá, estou montando um robô para operar logo após a 1ª transação registrada no Times/Trades do dia. 

Alguém sabe como eu consigo essa informação da abertura ?  Ah...o Ontick() pega a movimentação do book no leilão e acaba contando como movimentação mesmo sem ter aberto o mercado.

Valeu !!!

 
Luiz Ricardo Moretti: Olá, estou montando um robô para operar logo após a 1ª transação registrada no Times/Trades do dia. Alguém sabe como eu consigo essa informação da abertura ?  Ah...o Ontick() pega a movimentação do book no leilão e acaba contando como movimentação mesmo sem ter aberto o mercado. Valeu !!!
Como voce disse, o OnTick() pega a informacao do leilão, entretanto se tu observar o tick recebido ele não terá volume atrelado. Somente quando o mercado abre que o volume aparece. Fora isso, tu poderia olhar o histórico de negócios fechados com a função CopyTicks() passando a flag COPY_TICKS_TRADE.
 
Luiz Ricardo MorettiOlá, estou montando um robô para operar logo após a 1ª transação registrada no Times/Trades do dia. Alguém sabe como eu consigo essa informação da abertura ?  Ah...o Ontick() pega a movimentação do book no leilão e acaba contando como movimentação mesmo sem ter aberto o mercado. Valeu !!!

Olá, Luiz Ricardo, seguem exemplos do que o Ricardo descreveu acima:

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Como obter o 1º negócio do dia?

Trader_Patinhas, 2019.09.04 02:19

Vc quer saber o primeiro negócio feito na sua conta ou o primeiro negócio do pregão?

O código do Nelson acima vai te retornar o primeiro negócio feito na sua conta. É isso mesmo que vc quer?

Se quiser o primeiro negócio do pregão vc pode usar a função CopyTicks():

MqlTick primeiroTick[];
int nTicks = CopyTicks(Symbol(),primeiroTick,COPY_TICKS_TRADE,1000*86400*(TimeCurrent()/86400),1);

// se nTicks == 1, as informações do primeiro tick (horário, preço, volume, etc.) estarão armazenadas em primeiroTick[0], caso contrário é porque houve algum erro

Se vc estiver operando bolsa de valores (e não Forex), vale lembrar que, nos contratos futuros e ações mais líquidas, o dia geralmente começa com o leilão de abertura, ao fim do qual geralmente são fechados centenas de negócios de uma vez só, no mesmo milésimo de segundo. Por isso não sei se faz sentido vc querer apenas o primeiro dentre os negócios fechados no leilão de abertura, a menos que o seu interesse seja apenas o preço e/ou a hora (que serão os mesmos para todos os negócios fechados no leilão de abertura, então nesse caso basta olhar o primeiro mesmo).

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Preço de abertura

Trader_Patinhas, 2019.04.22 19:56

Convém alertar a corretora, pois SYMBOL_OPEN_SESSION deveria conter o preço de abertura e talvez isso seja um lapso na configuração do servidor MT5.

Enquanto o problema não estiver resolvido, uma forma alternativa de obter o preço de abertura seria usar a função CopyTicks()

Vc preenche no argumento "flags" a constante COPY_TICKS_TRADE, para capturar somente os ticks referentes a trades executados, e no argumento "from_msc" vc coloca 1000*86400*(TimeCurrent()/86400), para pegar ticks a partir da meia-noite da data atual.

Daí, o primeiro elemento de "tick_array" corresponderá ao primeiro negócio efetuado no dia e o campo "last" deste elemento conterá o valor deste primeiro negócio, ou seja, o preço de abertura.

Resumindo:

MqlTick tick_array[];
CopyTicks ( Symbol() , tick_array , COPY_TICKS_TRADE , 1000*86400*(TimeCurrent()/86400) );
double preco_abertura = tick_array[0].last;

Talvez haja algum jeito mais simples que esse de obter o preço de abertura sem usar SYMBOL_OPEN_SESSION, mas esse jeito que descrevi, embora meio complicado, certamente vai funcionar.

 
Vinicius Pereira De Oliveira #:Olá, Luiz Ricardo, seguem exemplos do que o Ricardo descreveu acima:
Tem também a função SymbolInfoTick() que retorna só a estrutura do tick mais recente. Tem também essa discussão que pode ser relevante de alguma forma: https://www.mql5.com/pt/forum/16254
Documentação sobre MQL5: Informações de Mercado / SymbolInfoTick
Documentação sobre MQL5: Informações de Mercado / SymbolInfoTick
  • www.mql5.com
SymbolInfoTick - Informações de Mercado - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Ricardo Rodrigues Lucca #: Como voce disse, o OnTick() pega a informacao do leilão, entretanto se tu observar o tick recebido ele não terá volume atrelado. Somente quando o mercado abre que o volume aparece. Fora isso, tu poderia olhar o histórico de negócios fechados com a função CopyTicks() passando a flag COPY_TICKS_TRADE .

Obrigado pelo suporte !! Vou implementar conforme exemplificaram abaixo !!! 

Vinicius Pereira De Oliveira #: Olá, Luiz Ricardo, seguem exemplos do que o Ricardo descreveu acima:

A minha necessidade é a informação do primeiro negócio do pregão do WDO ! Vou implementar esse exemplo e aguardar até amanhã para testar, porque não tem teste de leilão no MT5... :(  

Muito obrigado !

Ricardo Rodrigues Lucca #: Tem também a função SymbolInfoTick() que retorna só a estrutura do tick mais recente. Tem também essa discussão que pode ser relevante de alguma forma: https://www.mql5.com/pt/forum/16254

Vou implementar esse exemplo também !! Valeu !!

 
Ricardo Rodrigues Lucca #:
Tem também a função SymbolInfoTick() que retorna só a estrutura do tick mais recente. Tem também essa discussão que pode ser relevante de alguma forma: https://www.mql5.com/pt/forum/16254
Vinicius Pereira De Oliveira #:

Olá, Luiz Ricardo, seguem exemplos do que o Ricardo descreveu acima:

Olá !! 

Implementei o código CopyTicks() no expert e com o mercado aberto a captura dos dados dos ticks funciona perfeitamente, mas no leilão ele está acusando esse erro:

O que poderia ser ?

Obrigado !

 
Luiz Ricardo Moretti #Olá !!  Implementei o código CopyTicks() no expert e com o mercado aberto a captura dos dados dos ticks funciona perfeitamente, mas no leilão ele está acusando esse erro: O que poderia ser ? Obrigado !

Olá, Luiz Ricardo, acho que faltou ali uma verificação do retorno do CopyTicks() nos exemplos... Por favor, poste como ficou esse trecho do seu código (incluindo essa linha 159)...

 
Vinicius Pereira De Oliveira #Olá, Luiz Ricardo, acho que faltou ali uma verificação do retorno do CopyTicks() nos exemplos... Por favor, poste como ficou esse trecho do seu código (incluindo essa linha 159)...

Acho que deve ficar mais ou menos assim:

MqlTick tick_array[];
if(CopyTicks ( . . .))
   {
    double preco_abertura = tick_array[0].last;
   }
else
   {
    Print(" ERROR ... ");
   }
 
Luiz Ricardo Moretti #:

Olá !! 

Implementei o código CopyTicks() no expert e com o mercado aberto a captura dos dados dos ticks funciona perfeitamente, mas no leilão ele está acusando esse erro:

O que poderia ser ?

Obrigado !

Nao testou fazendo pelo primeiro tick com volume? Parecia bem mais simples que pegar todo um vetor. Mas que legal que deu certo! Como o Vinicius disse, a gente nao pode ver seu codigo sem voce postar para tentar te ajudar. Mas a coisa mais normal ele citou, o CopyTicks() ter retornado um valor menor ou erro e voce tentou acessar algo (na linha 159, coluna 45) que na verdade ainda nao existia. Outra forma, se voce usar um vetor que foi declado sem tamanho e quem esta fazend o a alocacao eh o CopyTicks pode usar ArraySize nele ao inves de usar o retorno do CopyTicks.
 

Esse é o trecho do código:

   if(!opened)
      {
      MqlTick primeiroTick[];
      int nTicks = 0;
      nTicks = CopyTicks(Symbol(),primeiroTick,COPY_TICKS_TRADE,1000*86400*(TimeCurrent()/86400),1);
      Print("Preço abertura: ",primeiroTick[0].last); // ← Linha 159
      
      if(nTicks == 1)
      {    
         MarketBookAdd(_Symbol);   
         MqlBookInfo priceArray[];
               
         bool getBook = MarketBookGet(_Symbol,priceArray);
Ricardo Rodrigues Lucca #:
Nao testou fazendo pelo primeiro tick com volume? Parecia bem mais simples que pegar todo um vetor. Mas que legal que deu certo! Como o Vinicius disse, a gente nao pode ver seu codigo sem voce postar para tentar te ajudar. Mas a coisa mais normal ele citou, o CopyTicks() ter retornado um valor menor ou erro e voce tentou acessar algo (na linha 159, coluna 45) que na verdade ainda nao existia. Outra forma, se voce usar um vetor que foi declado sem tamanho e quem esta fazend o a alocacao eh o CopyTicks pode usar ArraySize nele ao inves de usar o retorno do CopyTicks.

Acho que se eu implementar a verificação do retorno e colocar o "Print" dentro do if pode resolver, certo ?

Vou implementar a opção de SymbolInfoTick() em paralelo também !

O duro vai ser esperar até quinta-feira agora... :(

Obrigado !

Documentação sobre MQL5: Informações de Mercado / SymbolInfoTick
Documentação sobre MQL5: Informações de Mercado / SymbolInfoTick
  • www.mql5.com
SymbolInfoTick - Informações de Mercado - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
@Luiz Ricardo Moretti #: Esse é o trecho do código:

Código formatado incorrectamente removido pelo moderador.

Por favor EDITE o seu comentário e utilize o botão do CÓDIGO (Alt -S) ao inserir o seu código. Não utilize imagens de código!

Botão de código no editor