Mi EA hace una doble entrada - página 9

 

Hola

Este enfoque sólo funciona si el tamaño de la posición actual es cero y la nueva operación se ejecuta con éxito con el tamaño de posición deseado.

Ver código:

#include <Trade\Trade.mqh>

//--- global variables
CTrade trade;
bool position_opened=false;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   bool conditions_to_open;
   ENUM_ORDER_TYPE order_type;
   double lot;
   double price,sl,tp;

//---...set variables

//--- inside OnTick()
   if(conditions_to_open && !position_opened) //-- Or position_opened==false
     {
      if(trade.PositionOpen(_Symbol,order_type,lot,price,sl,tp,"comment")
         && 
         (trade.ResultRetcode()==10009 || trade.ResultRetcode()==10008)) //-- Or others condition according to your needs
        {
         //--- set the global variable to true to avoid duplicate orders
         position_opened=true;
         Print("Success!");
        }
      else
        {
         Print("Error = ",GetLastError(), "trade error = ", trade.ResultRetcode());
         //--- Sets the global variable to false
         // position_opened=false;                                         //-- Not needed as position_opened is already false
         return;
        }

     }
//--- 
  }


¿Pero qué pasa si tu EA está dando la vuelta a la posición: de una posición LARGA a una CORTA o viceversa y esta acción se realiza en 2 operaciones diferentes?

Después de la primera operación el booleano "position_opened" se pone a "TRUE" y el EA no puede abrir la 2e operación porque la condición está comprobando"if(conditions_to_open && !position_opened)", por lo que la segunda operación se bloqueará.

¿Y qué pasa si el tamaño de la posición se abre sólo parcialmente? Necesita una segunda operación para que el tamaño de la posición sea el correcto.


Al final, para hacer "un cuento largo", siempre se necesita la función PositionSelect(Symbol()) para calcular el tamaño de la posición ACTUAL y aquí es donde empezó todo el problema (y este hilo del foro).

En el momento crítico, cuando el EA está llamando a PositionSelect(Symbol()), el terminal no ha actualizado todavía el tamaño de la posición ACTUAL y el EA está trabajando con un tamaño de posición equivocado y envía una nueva orden doble al servidor de operaciones.


Creo que el enfoque de(figurelli) es mejor porque se obliga a esperar hasta que el EA haya actualizado la función PositionSelect(Symbol()) al tamaño de posición correcto.


bool fatalError=false; // atention: declare this as global

....

if(fatalError == false) 
      {
      if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0)) 
            {
            Print("Position opened in ", Symbol());
            int maxTimeout=0;
            while(!PositionSelect(Symbol())) 
                     {
                     Sleep(100);
                     maxTimeout++;
                     if(maxTimeout > 100) 
                           {
                           Print("### PositionSelect fatal error!");
                           fatalError = true;
                           break;
                           }
                     }
            Print("--> PositionSelect delay=",maxTimeout * 100);
            break;
            }
      }
 
snelle_moda:

Hola

Este enfoque sólo funciona si el tamaño de la posición actual es cero y la nueva operación se ejecuta con éxito con el tamaño de posición deseado.

Ver código:


¿Pero qué pasa si tu EA está dando la vuelta a la posición: de una posición LARGA a una CORTA o viceversa y esta acción se realiza en 2 operaciones diferentes?

Después de la primera operación el booleano "position_opened" se pone a "TRUE" y el EA no puede abrir la 2e operación porque la condición está comprobando"if(conditions_to_open && !position_opened)", por lo que la segunda operación se bloqueará.

¿Y qué pasa si el tamaño de la posición se abre sólo parcialmente? Necesita una segunda operación para que el tamaño de la posición sea el correcto.


Al final, para hacer "un cuento largo", siempre se necesita la función PositionSelect(Symbol()) para calcular el tamaño de la posición ACTUAL y aquí es donde empezó todo el problema (y este hilo del foro).

En el momento crítico, cuando el EA está llamando a PositionSelect(Symbol()), el terminal no ha actualizado todavía el tamaño de la posición ACTUAL y el EA está trabajando con un tamaño de posición equivocado y envía una nueva orden doble al servidor de operaciones.


Creo que el enfoque de(figurelli) es mejor porque te obliga a esperar hasta que el EA haya actualizado la función PositionSelect(Symbol())


Tienes razón, ambos enfoques tienen limitaciones.

El origen de este problema está ahora claramente identificado. Cada uno tiene que adaptar su código en función de su estrategia. No creo que haya un método general que pueda aplicarse en todos los casos.

 
¿Necesitamos una biblioteca OrderSendReliable() para el Gran y Poderoso mql5?
 
Ubzen:
¿Necesitamos una biblioteca OrderSendReliable() para el Gran y Poderoso mql5?
No creo que el sarcasmo pueda ser de ayuda. Aunque está claro que es un mal diseño el que lleva a tal complejidad.
 
angevoyageur:

Tienes razón, ambos enfoques tienen limitaciones.

El origen de este problema está ahora claramente identificado. Cada uno tiene que adaptar su código en función de su estrategia. No creo que haya un método general que se pueda aplicar en todos los casos.


O tenemos que esperar una "declaración oficial" de los propios chicos de Metaquotes.

¿Hay ya una respuesta del servicio técnico?

 
angevoyageur: No creo que el sarcasmo puede ser de ninguna ayuda. Aunque está claro que es un mal diseño que lleva a tal complejidad.

Si estuviera de acuerdo con usted, ¿lo consideraría poco útil? .

Sólo enseñé que la solución de Dormir hasta Terminar la Operación me recordaba a OrderSendReliable(). He enseñado que esto se hubiera solucionado de forma más elegante.

También me recuerda el manejo de old_documents ... donde va { y todo el comercio debe ser detenido }.

De todos modos, las disculpas no tenía la intención de meterse con mql5.

 
snelle_moda:


O tenemos que esperar una "declaración oficial" de los propios chicos de Metaquotes.

Hay ya una respuesta del servicio de atención al cliente?

No. Estaba pensando en eso... Probablemente sería útil que todos los interesados escribieran un ticket al ServiceDesk sobre este tema. Sin embargo, soy muy escéptico si MQ está dispuesto a cambiar este diseño. Pero podemos intentarlo.

La gente puede escribir a ServiceDesk y reportar el ticket# aquí. El mío es

Errores, MetaTrader 5 MQL, Abrir, Iniciar: 2013.12.23 19:08, #916435
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.
 
Ubzen:

¿Si estuviera de acuerdo contigo considerarías que no es útil?

Acabo de enseñar que la solución de Dormir hasta Terminar la Operación me recordaba a OrderSendReliable(). He enseñado que esto se hubiera solucionado de forma más elegante.

También me recuerda el manejo de old_documents ... donde va { y todo el comercio debe ser detenido }.

De todos modos, las disculpas no tenía la intención de escoger en mql5.

Me pregunto si un problema similar no puede existir también en mql4, he leído al menos 2 temas en los últimos meses en el foro mql4 de los usuarios que se queja de las operaciones dobles. No estoy seguro de que esté relacionado, pero puede valer la pena revisar estos temas. ¿También has leído estos temas?
 
angevoyageur: Me pregunto si un problema similar no puede existir también en mql4, he leído al menos 2 temas en los últimos meses en el foro de mql4 de los usuarios que se quejan de las operaciones dobles. No estoy seguro de que esté relacionado, pero puede valer la pena revisar estos temas. ¿También has leído estos temas?

Sí, pero es difícil saber si se debe a una mala codificación. El comercio doble era un problema incluso antes del hilo de comercio múltiple. La forma en que se maneja tradicionalmente es la forma en que snelle_moda lo maneja.

 
Ubzen:

Sí, pero es difícil saber si se debe a una mala codificación. El comercio doble era un problema incluso antes del hilo de comercio múltiple. La forma en que se maneja tradicionalmente es la forma en que lo hace snelle_moda.

No estoy seguro de entender lo que quieres decir. El problema del que hablamos en este tema no está causado por una mala codificación, sino por un mal diseño en mql5 (es mi opinión, o tal vez es simplemente un error ). ¿A qué te refieres con "múltiples hilos de negociación"?
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.