EA no se ejecuta en múltiples pares, necesita ayuda

 
Soy muy nuevo en la codificación de mql4, y he completado mi primer EA. Mi único problema ahora es que no puedo conseguir que abra operaciones en más de un par. En la sección de EA en el terminal al lado de la revista, se envía una corriente del error, ticket inválido para la función orderclose, a pesar de que la EA abre y cierra las operaciones muy bien en un par. Alguien podría echarme una mano por favor.
 
Matt_Townsend:
Soy muy nuevo en la codificación de mql4, y he completado mi primera EA. Mi único problema ahora es que no puedo conseguir que abra operaciones en más de un par. En la sección de EA en el terminal al lado de la revista, se envía una corriente del error, ticket inválido para la función orderclose, a pesar de que la EA abre y cierra las operaciones muy bien en un par. ¿Podría alguien echar una mano, por favor?

¿Cómo esperas que lo sepamos si no muestras tu código ni el registro de los errores?

Si quieres que te ayudemos, tendrás que mostrar tu código y los errores que da (los resultados en el registro). También será útil saber qué pares de divisas y plazos de tiempo está probando, cuando echemos un vistazo a su código.

Además, tenga en cuenta que en MetaTrader 4 sólo se puede probar una sola moneda a la vez en el Probador de Estrategias. Si su EA opera con varias divisas simultáneamente desde un solo gráfico, no podrá probarlo en el Probador de Estrategias - ¡sólo en una cuenta Demo o real!

 
Matt_Townsend: a pesar de que el EA abre y cierra operaciones sin problemas en un par.
Por eso recomiendo
No operar con varias divisas en un EA
 
Matt_Townsend: Aquí está mi código, y estoy teniendo el problema en una demo en vivo, incluso he tratado de ver si podía usar múltiples terminales, para resolver el problema. Gracias por sus comentarios hasta ahora.

Por favor, edita tu mensaje y utiliza el botón SRC para añadir tu código. No se limite a copiar y pegar como texto estándar, ya que es difícil de leer. Estoy seguro de que puedes ver en otros hilos cómo se debe hacer. Por favor, utilice el botón SRC para publicar su código.

EDIT: Como se pidió antes - . .. También será útil saber qué pares de divisas y marcos de tiempo que está probando en ...

EDIT2: Como se pidió antes - ... así como los errores que da (los resultados en el registro) ...

 
Fernando Carreiro:
Por favor, edita tu mensaje y utiliza el botón SRC para añadir tu código. No se limite a copiar y pegar como texto estándar, ya que es difícil de leer. Estoy seguro de que puedes ver en otros hilos cómo se debe hacer. Por favor, utilice el botón SRC para publicar su código.
//+------------------------------------------------------------------+
//|                     Simple Moving Average Crossover Strategy.mq4 |
//|                                                 Matthew Townsend |
//+------------------------------------------------------------------+
#property version   "1.05"
#property strict
//---

//---Inputs
extern  double Lots         =0.01;
extern  int    FastMA       =5;
input   int    FastMAMode   =MODE_EMA;
extern  int    SlowMA       =8;
input   int    SlowMAMode   =MODE_SMA;

//+----------------------------------------+
//|undesirables                            |
//+----------------------------------------+
int init()
{
   //----
   //----
   return(0);
}

int deinit()
{
   //----
   //----
   return(0);
}
//+---------------------------------------------+
//|System start                                 |
//+---------------------------------------------+
int start()
{


    double fastma, slowma;
    int    ticket, total;
    //---define Ma's
    
    fastma = iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
    slowma = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
    
    total = OrdersTotal();
    //---Start operations
    
    if(total < 1)
    {
       if(fastma > slowma)
       {
         ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"",0,0,Blue);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Buy order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       if(fastma < slowma)
       {
         ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"",0,0,Red);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Sell order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       return(0);
    }
    bool ans;
    
        
         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)
             {      
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());    
             }    
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
      if(OrderType()==OP_SELL)
        {
          while(fastma > slowma)
          {
             ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
             if(ticket < 1)
             {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("Sell order closed : ", OrderClosePrice());
              
             }
             else
               Print("Error closing order : ", GetLastError());
               return(0);
          }
          
        }
    
    return(0);
}

//+-----------------------------------------------------------------------------------+
 
Fernando Carreiro:
He pedido que EDITES tu post anterior, no que añadas uno nuevo, ¡para no alargar tanto el hilo!
Lo siento yo también soy muy nuevo en este foro, ¿puedo borrar los 2 mensajes?
 
Matt_Townsend:
Estaba probando en un marco de tiempo de 1 hora, EURUSD y 1 hora GBPUSD
Ya hay dos advertencias del compilador para el siguiente código:
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

No está comprobando correctamente el resultado de la operación de cierre.

¡En términos de lógica hay varios problemas con su EA, pero tal como está en este momento, se está ejecutando sin ningún error en mi extremo en el Probador de Estrategias, así que por favor proporcione la lista de errores que está recibiendo!

 
Fernando Carreiro:
Ya hay dos advertencias del compilador para el siguiente código:
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

No está comprobando correctamente el resultado de la operación de cierre.

¡En términos de lógica hay varios problemas con su EA, pero tal como está en este momento, se está ejecutando sin ningún error en mi extremo, así que por favor proporcione la lista de errores que está recibiendo!

El único error que he estado recibiendo de la EA es laentrada no válida para la función orderclose, con un número al lado de él, me gustaría mostrar el registro real, pero en el segundo gráfico con la EA corriendo no está haciendo nada, ya que para normalmente intentaría abrir un comercio inmediatamente. Si, y cuando el registro comienza a llenarse con el error, ¿cómo haría para mostrar el registro real?
 
Matt_Townsend:
El único error que he estado recibiendo del EA es laentrada inválida para la función orderclose, con un número al lado, me gustaría mostrar el registro real, pero en el segundo gráfico con el EA ejecutándose no está haciendo nada, ya que para normalmente intentaría abrir una operación inmediatamente. Si, y cuando el registro empieza a llenarse con el error, ¿cómo haría para mostrar el registro real?

Seleccione las líneas en cuestión con Click, Ctrl-Click o Shift-Click (operación estándar de windows), luego haga click derecho en la selección y elija "Copiar".

EDIT: Con respecto al código, usted está utilizando el OrderSelect, pero siempre está asumiendo que funciona cada vez. Y cuando no funciona sigues usando las funciones de detalles del pedido como OrderTicket() en tu cierre, que podría fallar si el OrderSelect() inicial también falló. Como he dicho, ¡tienes muchos problemas de lógica en tu código!

 

    bool ans;

   

         //You do not select an order

         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)                                 //Use if not while
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)                                        //ticket is a local variable and has not been assigned a value
             {     
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());   
             }   
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
Reescriba la sección de código de cierre para que sea lógica, no debería usar la variable ticket aquí en absoluto.
 
Matt_Townsend:
El único error que he estado recibiendo del EA es laentrada inválida para la función orderclose, con un número al lado, me gustaría mostrar el registro real, pero en el segundo gráfico con el EA corriendo no está haciendo nada, ya que para normalmente intentaría abrir una operación inmediatamente. Si, y cuando el registro comienza a llenarse con el error, ¿cómo haría para mostrar el registro real?

Otra nota muy importante con respecto al uso de su EA en múltiples pares de divisas o marcos de tiempo.

Su código no utiliza la selección del "Número Mágico" ni comprueba el Símbolo (ni el "Número Mágico") en uso cuando comprueba las órdenes abiertas en el Historial. Así que, en esencia, su EA no funcionará correctamente ni con él mismo ni con otros EA.

Tal y como está, sólo se puede utilizar este AE por sí mismo sin que se ejecute ningún otro AE, ni siquiera en otro gráfico.