Alerta: El terminal MT4 duplica las órdenes enviadas por los expertos - página 5

 

Hola amigos:

Siento no haber contestado antes: No estaba al tanto de tus mensajes porque no recibí ninguna notificación de Metaquotes. Efectivamente, abrí un ticked, como me recomendó RaptorUK, pero no me contestaron en ningún momento. Hago lo mismo que JamesMadden cuando es necesario: Simplemente cierro la orden y pierdo el spread. Si no es tan arriesgado, lo dejo ahí. (si mi EA es rentable, ganará más que perder a largo plazo) Sin embargo, por supuesto no me gusta el bicho.

Ahora estoy teniendo nuevos problemas con la build 600 y me gustaría saber, si alguien lo sabe, cómo se hace para que respondan :)

PD: ¿Cómo hago para que esta aplicación web me envíe un correo electrónico cuando se actualice este post? Ya estoy suscrito al tema.

 
Ricardo1:

Hola amigos:

Siento no haber contestado antes: No estaba al tanto de tus publicaciones porque no recibí ninguna notificación de Metaquotes. Efectivamente, abrí un ticked, como me recomendó RaptorUK, pero no me contestaron en ningún momento. Hago lo mismo que JamesMadden cuando es necesario: Simplemente cierro la orden y pierdo el spread. Si no es tan arriesgado, lo dejo ahí. (si mi EA es rentable, ganará más que perder a largo plazo) Sin embargo, claro que no me gusta el bicho.

Ahora estoy teniendo nuevos problemas con el build 600 y me gustaría saber, si alguien sabe, cómo se hace para que me respondan :)

Tengo un ticket abierto desde marzo de 2013 que nunca ha tenido respuesta. Todo lo que puedo sugerir es seguir añadiendo nuevos comentarios cada vez pidiendo noticias o una respuesta.


PD: ¿Cómo hago para que esta aplicación web me envíe un correo electrónico cuando se actualice este post? Ya estoy suscrito al tema.

Las notificaciones por correo electrónico no funcionan desde hace unos años. . . quizás podrías informar al Service Desk
 
RaptorUK:
Cuando lo descubran háganmelo saber....... Tengo un ticket abierto de marzo de 2013 que nunca ha tenido respuesta. Todo lo que puedo sugerir es seguir añadiendo nuevos comentarios cada vez pidiendo noticias o una respuesta.

las notificaciones por correo electrónico no han funcionado desde hace unos años . . tal vez usted podría informar a la Mesa de Servicio



Hola,

Acabo de encontrar este tema porque fui a buscar exactamente este problema. No había notado el problema antes, pero me ha pasado hoy.

Independientemente del registro de expertos, que como se mencionó anteriormente registra las operaciones, existe el diario de MetaTrader que registra todas las operaciones realizadas, por EA o por persona. Hoy he encontrado una operación en mi cartera que era un duplicado de una operación realizada sólo unos segundos antes, pero la segunda operación no aparecía en el registro de expertos ni en el diario de MetaTrader.

He pedido a mi broker que compare sus registros de peticiones entrantes con las operaciones ejecutadas pero sospecho que o bien no guardan registros o no querrán investigar.

Si el EA colocó 2 órdenes, esperaría ver ambas en el diario. Incluso si la aplicación de escritorio por alguna razón duplicó la solicitud, esperaría que el servidor respondiera y registrara la segunda operación. Parece más bien que la operación se está ejecutando desde el servidor y no desde el cliente.

Esta es la primera vez que he notado el problema y no puedo encontrar ninguna manera de reproducir el problema. Las cantidades con las que estoy trabajando ahora son muy pequeñas, por lo que el valor no es importante, pero sí que me preocupa la viabilidad de MetaTrader.

Sólo pensé en prestar mis pensamientos a un tema que ha estado colgando alrededor de un tiempo.

Editar:

He estado revisando más a fondo y he encontrado otro caso. La orden ya había sido cerrada por el stop loss así que no me di cuenta. En ambos casos el EA colocó una orden esperada. Eso se muestra en el diario inmediatamente seguido de un mensaje de inicio de sesión que se corresponde con la orden fantasma colocada.

Si alguien más cree que se ha producido una orden fantasma, por favor, compruebe el mensaje de inicio de sesión en el diario. Puede ser significativo.

 

Parece que no soy el único afectado por este molesto problema. Al igual que spikedog, mi EA solicitó una orden de mercado que resultó en otra entrada duplicada del mismo tamaño de lote dentro de milisegundos, el registro de órdenes duplicadas se mostró en el Diario, pero no en la pestaña de Expertos; Desde entonces he modificado mis códigos ligeramente para esperar una mejor protección contra este problema mediante el filtrado de doble comercio dentro de la misma barra (comercio en la barra abierta solamente) justo antes de OrderSend().

Es la primera vez que tengo este problema de duplicación de operaciones; he abierto más de 500 operaciones con 3 corredores desde entonces y sin problemas hasta ahora. Por cierto, las operaciones subsiguientes funcionan bien de nuevo.

Como adjunto está mi código para procesar OrderSend() cuando el problema de duplicación ocurre. No puedo ver cómo mi EA es la causa de la orden duplicada. La única razón posible que se me ocurre en este momento es que tal vez en una ocasión muy rara, el servidor estaba procesando mi OrderSend pero devuelve "-1" de alguna manera y mi EA procede a hacer otra solicitud tratando la primera como una recotización. Es una mera especulación mía.


            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:

No puedo ver cómo mi EA es la causa de la orden duplicada.

Podría estar relacionado con este error en tu código, deberías arreglarlo y volver a probar....

                  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() devuelve un int no un bool por lo que comprobar si el valor de retorno es "true" es incorrecto.

 

@BigFisherman

B.T.W ¿qué pasa con tu código?

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

¿y otra vez?

else break;
 
RaptorUK:

Podría estar relacionado con este error en su código, debería arreglarlo y volver a probar...

OrderSend() devuelve un int no un bool por lo que comprobar si el valor de retorno es "true" es incorrecto.


Gracias raptoruk por la sugerencia. Tienes razón :)
 
BigFisherman:

Gracias raptoruk por la sugerencia. Soy consciente de ello. Sin embargo no creo que esa sea la causa del comercio duplicado porque el código presentado es válido, aunque un poco confuso.
¿Cómo es válido el código? si el OrderSend() funciona obtienes un valor mayor que 0 devuelto, es decir, el número de ticket, si falla obtienes -1 devuelto, estás probando para verdadero o falso... arregla tu código y elimina la incertidumbre.
 
RaptorUK:
¿Cómo es el código válido ? si el OrderSend() funciona se obtiene un valor mayor que 0 devuelto, es decir, el número de billete, si falla se obtiene -1 usted está probando para verdadero o falso ... arreglar su código y eliminar la incertidumbre.



Gracias de nuevo.

¡Saludos!

 
RaptorUK:
¿Cómo es el código válido? si el OrderSend() funciona obtienes un valor mayor que 0 devuelto, es decir, el número de ticket, si falla obtienes -1 devuelto, estás probando para verdadero o falso... arregla tu código y elimina la incertidumbre.


Hola RaptorUK,



Tengo una pregunta que no se refiere exactamente al tema de este hilo, pero con la esperanza de utilizar mi post anterior como un ejemplo para profundizar en mi comprensión de la codificación mql4 y tal vez también puede ayudar a otros principiantes como yo (si usted piensa que es off-topic y necesita un nuevo hilo, por favor, eliminar esto y hágamelo saber).

Al principio estaba un poco confundido sobre mi forma inicial de declarar Buy_Ticket como bool en lugar de int, así que hice más pruebas al respecto. Aunque estoy de acuerdo en que mi forma original de leer OrderSend() como bool no es una buena forma de codificación (confusa), pero mi prueba muestra que es válida. Para simplificar la lectura, he codificado lo siguiente, por favor, consejos y gracias por su tiempo.


P.D.: Como se aconseja, ya he modificado mi EA para leer 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);
}
//+------------------------------------------------------------------+


Diario

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