Alerta: Pedido de Duplicação de Terminal MT4 Enviado por Peritos - página 5

 

Olá Amigos:

Desculpe-me por não ter respondido antes: Eu não tinha conhecimento de suas mensagens porque não recebi nenhuma notificação da Metaquotes. Eu realmente abri um tick, como o RaptorUK recomendou, mas eles nunca responderam de forma alguma. Eu faço o mesmo que JamesMadden quando é necessário: Eu simplesmente fecho a ordem e perco o spread. Se não for tão arriscado, eu simplesmente o deixo lá! (se meu EA for lucrativo, ele ganhará mais do que perder a longo prazo) Entretanto, é claro que eu não gosto do bug.

Agora estou tendo novos problemas com o build 600 e gostaria de saber, se alguém souber, como fazer para que eles respondam? :)

PD: Como faço para que esta aplicação web me envie um e-mail quando este post for atualizado? Eu já estou inscrito no tópico.

 
Ricardo1:

Olá Amigos:

Desculpe-me por não ter respondido antes: Não tinha conhecimento de seus posts porque não recebi nenhuma notificação da Metaquotes. Eu realmente abri um tick, como o RaptorUK recomendou, mas eles nunca responderam em absoluto. Eu faço o mesmo que JamesMadden quando é necessário: Eu simplesmente fecho a ordem e perco o spread. Se não for tão arriscado, eu simplesmente o deixo lá! (se meu EA for lucrativo, ele ganhará mais do que perder a longo prazo) Entretanto, é claro que eu não gosto do bug.

Agora estou tendo novos problemas com o build 600 e gostaria de saber, se alguém souber, como fazer para que eles respondam? :)

quando souber, avise-me ... Tenho um bilhete aberto desde março de 2013 que nunca teve uma resposta. Tudo o que posso sugerir é continuar adicionando novos comentários cada vez que pedir notícias ou uma resposta.


PD: Como faço para que esta aplicação web me envie um e-mail quando este post for atualizado? Eu já estou inscrito no tópico.

notificações por e-mail não funcionam há alguns anos ... talvez você possa reportar isso ao Service Desk
 
RaptorUK:
quando souber, avise-me ... Tenho um bilhete aberto desde março de 2013 que nunca teve uma resposta. Tudo o que posso sugerir é continuar adicionando novos comentários cada vez que pedir notícias ou uma resposta.

notificações por e-mail não funcionam há alguns anos . . . talvez você possa relatar isso ao Service Desk



Hi,

Acabo de encontrar este tópico porque fui procurar exatamente por este problema. Não tinha notado o problema antes, mas ele aconteceu hoje para mim.

Independentemente do registro dos especialistas, que como mencionado anteriormente registra as negociações, existe a revista MetaTrader que registra todas as negociações feitas, por EA ou por pessoa. Hoje encontrei em minha carteira um negócio que foi uma duplicata de um negócio colocado segundos antes, mas o segundo negócio não apareceu no diário dos especialistas ou na revista MetaTrader.

Pedi a meu corretor que comparasse seus registros de pedidos recebidos com as negociações executadas, mas suspeito que eles ou não mantêm registros ou não vão querer investigar.

Se a EA fizesse 2 pedidos, eu esperaria ver ambos no diário. Mesmo que a aplicação desktop, por algum motivo, duplicasse o pedido, esperaria que o servidor respondesse e registre a segunda negociação. Parece mais que a negociação está sendo executada a partir do servidor e não do cliente.

Esta é a primeira vez que percebo o problema e não consigo encontrar nenhuma maneira de reproduzir o problema. As quantidades com as quais estou trabalhando agora são muito pequenas, portanto o valor não é importante, mas isso levanta preocupações sobre a viabilidade do MetaTrader.

Pensei apenas em emprestar meus pensamentos a um tópico que já anda por aí há algum tempo.

Editar:

Estive verificando mais e encontrei outro exemplo. A ordem já havia sido encerrada por meio de Stop Loss, então eu não percebi. Em ambos os casos, a EA fez um pedido esperado. Isso aparece no diário imediatamente seguido por uma mensagem de login que corresponde ao pedido fantasma que está sendo feito.

Se alguém mais achar que ocorreu um pedido fantasma, favor verificar a mensagem de login no diário. Ela pode ser significativa.

 

Parece que eu não sou o único afetado por este problema irritante. Assim como o spikedog, meu EA solicitou uma ordem de mercado que resultou em outra entrada duplicada do mesmo lote dentro de milisecs, o log de pedidos duplicados foi mostrado no Journal, mas não na guia Experts; desde então modifiquei ligeiramente meus códigos para, esperançosamente, proteger-me melhor contra este problema, filtrando o comércio duplo dentro da mesma barra (comércio em barras abertas apenas) antes do OrderSend().

É a primeira vez que eu tive este problema de comércio duplicado; tinha aberto mais de 500 negociações com 3 corretores desde então e sem problemas até agora. Btw, as negociações subseqüentes funcionam bem novamente.

Como anexo é meu código para processar OrderSend() quando o problema da duplicata acontece. Não consigo ver como minha EA é a causa da ordem duplicada. A única razão possível que posso pensar agora talvez seja em uma ocasião muito rara, o servidor estava processando meu OrderSend, mas retorna "-1" de alguma forma e meu EA procede para fazer outro pedido tratando o 1o. como um requote. Apenas minha mera especulação.


            bool Buy_Ticket = false;
            while(Buy_Ticket==false){     //Loop to solve Requote issues
               for(int BT_count=0; BT_count < RequoteTries; BT_count++){
                  if (!IsTradeAllowed()) Sleep(RequoteTries_WaitingTime);
                  RefreshRates();

                  int B_Spread = MarketInfo(Symbol(), MODE_SPREAD);  //TO CAPTURE EXACT SPREAD UPON BUY ORDER FOR SL
                  Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;

               
                  if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed
                     for(int buyMod=0; buyMod < OrdersTotal(); buyMod++){
                        if (OrderSelect(buyMod,SELECT_BY_POS,MODE_TRADES)){
                           if ((OrderSymbol()!=Symbol()) || (OrderType()!=OP_BUY)) continue;
                           if ((OrderStopLoss()==0) && (OrderTakeProfit()==0)){
                              double B_SL = NormalizeDouble((OrderOpenPrice()-((B_Spread*Point)+stoploss)),Digits);
                              double B_TP = NormalizeDouble((OrderOpenPrice()+takeprofit),Digits);

                              bool buy_ModSL_succeed = false;
                              while(buy_ModSL_succeed==false){     //Loop to solve SL+TP modify Requote issues   
                                 for(int buyMod_count=0; buyMod_count < RequoteTries; buyMod_count++){
                                    if (!IsTradeAllowed()) Sleep(5000);
                                    RefreshRates();                                 
                                    if (OrderModify(OrderTicket(), OrderOpenPrice(), B_SL, B_TP, 0, Red)==false) continue;
                                    buy_ModSL_succeed = true;
                                    Print(entrycode_txt," initiated Long trade successfully modified SL & TP.");
                                    break;                        
                                 }  //End FOR loop for requote handling
                                 if (buy_ModSL_succeed == false){
                                    getError = GetLastError();
                                    Alert("Error: ",getError," in Buy order#:",OrderTicket()," modify for SL:",B_SL," & TP:",B_TP," after ",RequoteTries," attempts.");
                                    break;
                                 }
                              }  //End WHILE loop for SL+TP modify requote handling
                           }  //End IF statement to select new orders without SL & TP
                        }  //End IF orderselect
                     }  //End FOR loop to modify new orders without SL & TP 
                  }  //End IF statement when buy order accepted & need SL+TP modify

                  if (Buy_Ticket==false) continue;
                  else break;
               }  //----------------------------//End FOR loop to carry out ordersend for buy trade when requote
               if (Buy_Ticket==false) break;    //Exit WHILE loop to handle Requote issues, fail to buy
            }  //-------------------------------//End WHILE loop to solve Requote issues
 
BigFisherman:

Não consigo ver como minha EA é a causa da ordem duplicada.

Pode estar ligado a este erro em seu código, você deve corrigi-lo e testá-lo novamente ...

                  Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;

               
                  if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed

OrderSend() retorna um int e não um bool, portanto, verificando se o valor de retorno é "verdadeiro" está incorreto.

 

@BigFisherman

B.T.W o que está acontecendo com o seu código ?

if (Buy_Ticket==true){     //Modify to give SL & TP if new buy order executed
if (Buy_Ticket==false) continue;

e novamente ?

else break;
 
RaptorUK:

Pode estar ligado a este erro em seu código, você deve corrigi-lo e testá-lo novamente ...

OrderSend() retorna um int e não um bool, portanto, verificando se o valor de retorno é "verdadeiro" está incorreto.


Obrigado raptoruk pela sugestão. Você está certo :)
 
BigFisherman:

Obrigado raptoruk pela sugestão. Estou ciente disso. Entretanto, não creio que seja essa a causa do comércio duplicado, pois o código apresentado é válido, embora pouco confuso.
Como o código é válido ? se o OrderSend() funciona você recebe um valor maior que 0 devolvido, ou seja, o número do bilhete, se ele falhar você recebe -1 devolvido, você está testando se é verdadeiro ou falso . . corrija seu código e remova a incerteza.
 
RaptorUK:
Como o código é válido ? se o OrderSend() funciona você recebe um valor maior que 0 devolvido, ou seja, o número do bilhete, se ele falhar você recebe -1 você está testando se é verdadeiro ou falso . . corrija seu código e remova a incerteza.



Mais uma vez, obrigado.

Abraço!

 
RaptorUK:
Como o código é válido ? se o OrderSend() funciona você recebe um valor maior que 0 devolvido, ou seja, o número do bilhete, se ele falhar você recebe -1 devolvido, você está testando se é verdadeiro ou falso . . corrija seu código e remova a incerteza.


Olá RaptorUK,



Tenho uma pergunta não exatamente sobre o tópico deste tópico, mas espero usar meu post anterior como exemplo para aprofundar minha compreensão da codificação mql4 & talvez também possa ajudar outros iniciantes como eu (se você acha que está fora do tópico & precisa de um novo tópico, por favor, delete este & me avise).

No início, fiquei ligeiramente confuso sobre minha forma inicial de declarar Buy_Ticket como bool em vez de int, então fiz mais testes sobre ele. Embora eu concorde com minha maneira original de ler OrderSend() como bool não é uma boa maneira de codificar (confuso), mas meu teste mostra que é válido. Para tornar a leitura mais simples, codifiquei o seguinte, por favor, aconselhe e agradeça pelo seu tempo.


P.S.: Como aconselhado, já modifiquei meu EA para ler OrderSend() como int.



//+------------------------------------------------------------------+
//|                                                    Test_Bool.mq4 |
//|                                     Copyright 2014, BigFisherman |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, BigFisherman"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
{
//---
   
   for (int SimRun=0; SimRun<3; SimRun++){
      bool Buy_Ticket = 0;
      int Ordersend = 0;            //AS AN EXAMPLE TO SIMULATE OrderSend() RETURNED CODE

      switch (SimRun)
      {
         case 0: break;             //FOR Ordersend==0
         case 1:
         {
            Ordersend = 1;          //SIMULATE SUCCESSFUL ORDERSEND() RETURNING TICKET NO. > 0
            break;
         }
         case 2:
         {
            Ordersend = -1;         //SIMULATE FAILED ORDERSEND() RETURNING "-1"
            break;
         }
      }
      
      
      // (MY ORIGINAL WAY OF CODING)   Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;
      Buy_Ticket = Ordersend > 0;   //SIMPLIFIED CODE FOR EASIER READING
      
      
      if (Buy_Ticket==true){
         Print("** Buy_Ticket returns true  **  SimRun: "+SimRun+"  Ordersend: "+Ordersend+"  Buy_Ticket: "+Buy_Ticket);
      }
      else{                         //if (Buy_Ticket==false)
         Print("** Buy_Ticket returns false **  SimRun: "+SimRun+"  Ordersend: "+Ordersend+"  Buy_Ticket: "+Buy_Ticket);
      }
   }
   return(0);
}
//+------------------------------------------------------------------+


Diário

2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 0  Ordersend: 0  Buy_Ticket: 0
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns true  **  SimRun: 1  Ordersend: 1  Buy_Ticket: 1
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 2  Ordersend: -1  Buy_Ticket: 0