Robô com execução de ordens fantasma - página 3

 

Amigos, boa tarde !


Hoje aconteceu algo bem estranho agora no EA. Gostaria de compartilhar e tentar entender para solucionar...


No momento que eu faço o envio da minha ordem de compra no valor do preço eu coloco o valor da minha variável "ASK", que é carregada da seguinte maneira :


ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

Porém hoje o preço ficou totalmente diferente do valor do mercado no momento da execução da ordem no WIN o preço correto estava exatamente em 81586 e a minha ordem foi executada com o valor de 76850. Uma diferença extrema de valores. Não entendi o que houve.... Logo como meu SL é ASK - pontos stop e Take ASK + Pontos gain a ordem comprou e depois vendeu na sequencia. 

Alguém sabe pq esse valor ficou errado ? Tem alguma forma de pegar o valor que a ordem foi executada para calcular o take e SL. Pq dessa maneira vai ficar semprem incorreto.


Obrigado !

Carlos Martins

 
Carlos Martins:

Amigos, boa tarde !


Hoje aconteceu algo bem estranho agora no EA. Gostaria de compartilhar e tentar entender para solucionar...


No momento que eu faço o envio da minha ordem de compra no valor do preço eu coloco o valor da minha variável "ASK", que é carregada da seguinte maneira :


ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

Porém hoje o preço ficou totalmente diferente do valor do mercado no momento da execução da ordem no WIN o preço correto estava exatamente em 81586 e a minha ordem foi executada com o valor de 76850. Uma diferença extrema de valores. Não entendi o que houve.... Logo como meu SL é ASK - pontos stop e Take ASK + Pontos gain a ordem comprou e depois vendeu na sequencia. 

Alguém sabe pq esse valor ficou errado ? Tem alguma forma de pegar o valor que a ordem foi executada para calcular o take e SL. Pq dessa maneira vai ficar semprem incorreto.


Obrigado !

Carlos Martins

Oi Carlos.

É impossível uma ordem no WINM20 ter sido executada a 76850 hoje, pois a mínima hoje foi 80290.

Onde vc viu esse valor? Foi na aba Histórico?

 
Carlos Martins:


Carlos Martins

Carlos, tem um TREM muito errado no seu o EA,  o ativo vigente de maior liquidez para mini índice é o WINM20, e o preço 81586 é impossível de ser cotado.   pois os preços de WINM20 são múltiplos de 5.

Em outras palavras, os preços de contratos de índice são cotados multiplos de 5(cinco).

Cuidado com as séries históricas, que são instrumentos para fins estatísticos apenas, em duas delas o TICK SIZE é 1(um).

 

É verdade. Tanto uma execução 5000 pontos abaixo do preço de mercado quanto uma cotação de 81586 são impossíveis.

Tem algo muito errado! Verifique a aba "Histórico" do terminal e veja o valor real das negociações.

 
Trader_Patinhas:

Oi Carlos.

É impossível uma ordem no WINM20 ter sido executada a 76850 hoje, pois a mínima hoje foi 80290.

Onde vc viu esse valor? Foi na aba Histórico?

Patinhas,

A ordem foi executada as 9:34 e nesse momento o preço estava muito longe disso. Eu vi o valor na coluna Preço da aba Histórico.

Acontece que o valor longe assim a ordem stop automaticamente pois passou o valor de stop... 


Abs !

 
Rogerio Giannetti Torres:

Carlos, tem um TREM muito errado no seu o EA,  o ativo vigente de maior liquidez para mini índice é o WINM20, e o preço 81586 é impossível de ser cotado.   pois os preços de WINM20 são múltiplos de 5.

Em outras palavras, os preços de contratos de índice são cotados multiplos de 5(cinco).

Cuidado com as séries históricas, que são instrumentos para fins estatísticos apenas, em duas delas o TICK SIZE é 1(um).

Olá Rogério,


Eu capturei o valor do candle, mas meu EA executa na abertura do candle seguinte que seria o 9° (nono) candle de hoje. A Abertura dele está em 81.580 que é onde deveria ter acontecido a compra.


Abs !

 
Carlos Martins:

Olá Rogério,


Eu capturei o valor do candle, mas meu EA executa na abertura do candle seguinte que seria o 9° (nono) candle de hoje. A Abertura dele está em 81.580 que é onde deveria ter acontecido a compra.


Abs !

Mudei o envio de ordem da seguinte maneira: 

         if(SymbolInfoTick(Symbol(),last_tick))

         {

          m_request.action   =TRADE_ACTION_DEAL;

          m_request.symbol   =_Symbol;

          m_request.magic    =06;

          m_request.volume   =v_contratos;

          m_request.type     =ORDER_TYPE_BUY;

          m_request.price    =last_tick.ask;

          m_request.sl       =(last_tick.ask-v_pontos_loss);

          m_request.tp       =(last_tick.ask+v_pontos_gain);

          m_request.deviation=5;

          m_request.comment="COMPRA";

          

           Print(last_tick.time,": Bid = ",last_tick.bid,

            " Ask = ",last_tick.ask,"  Volume = ",last_tick.volume);

            OrderSend(m_request,m_result);

         }

         else Print("SymbolInfoTick() falhou, erro = ",GetLastError());


         }


Espero que isso resolva, pois ele vai pegar o valor do ultimo tick...

 

Carlos,

inclua essas duas instruções ... outra coisa, abra a caixa  ( Alt-S ) para inserir código na postagem.


  if(SymbolInfoTick(Symbol(),last_tick))
  {
   ZeroMemory(m_request);
   ZeroMemory(m_result);
...
...
  }
 

Eu percebi isso ontem e fiz a inclusão..Obrigado !


Hoje já validei o Robo novamente e já apresentou outro erro..Tá difícil deixar redondo sendo que no simulador funciona e na produção não.


Logo após enviar a ordem eu carrego o valor do preço em uma variável da seguinte maneira :

v_preco = m_result.price; // Recupera o preço negociado 

Porém o valor veio vazio.. isso fez com meu controle de fechar posição acionasse.

Não entendo por qual motivo essas funções hora funcionam e hora não. To pensando eu fazer uma função manual e não usar as padrões.


Obrigado e abs !

 
Carlos Martins:

Eu percebi isso ontem e fiz a inclusão..Obrigado !


Hoje já validei o Robo novamente e já apresentou outro erro..Tá difícil deixar redondo sendo que no simulador funciona e na produção não.


Logo após enviar a ordem eu carrego o valor do preço em uma variável da seguinte maneira :

Porém o valor veio vazio.. isso fez com meu controle de fechar posição acionasse.

Não entendo por qual motivo essas funções hora funcionam e hora não. To pensando eu fazer uma função manual e não usar as padrões.


Obrigado e abs !

Carlos, eu já disse acima e falo de novo, pq vc não usa a classe CTrade, trabalhar com as estruturas de request e result é VERBOSO e COMPLEXO ??? A Classe CTrade abstrai todo esse trabalho que vc está tendo, além de ser simples de usar. Você esta indo para o caminho mais baixo nivel possível que tem para envios de ordem dentro do meta trader. Enfim, é apenas um pitaco.

Razão: