EA no se ejecuta en múltiples pares, necesita ayuda - página 2

 
Fernando Carreiro:

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 puede utilizar este EA por sí mismo sin que se ejecute ningún otro EA, ¡ni siquiera él mismo en otro gráfico!

Muchas gracias por ayudarme con mi código hasta ahora y por su tiempo, intentaré hacer los ajustes necesarios.
 
Keith Watford:

    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 orden de cierre del código para que sea lógica, no debería estar usando la variable ticket aquí en absoluto.
Mientras escribía esto antes no tenía la variable ticket allí, sólo estaba viendo si ponerla allí tendría un impacto en la forma en que el código fuctioned, y gracias por su entrada y el tiempo.
 
Matt_Townsend:
Muchas gracias por ayudarme con mi código hasta ahora y por su tiempo, intentaré hacer los ajustes necesarios.

Como tienes demasiados problemas de lógica en tu EA, te sugiero que eches un vistazo al código de ejemplo de MetaQuotes, concretamente"Moving Average.mq4" y/o "MACD Sample.mq4" y construyas sobre él, hasta que entiendas los principios básicos de cómo funciona un EA.

He adjuntado los archivos, pero los encontrarás en tu carpeta "MQL4\Experts".

Archivos adjuntos:
 
Fernando Carreiro:

EDIT: Con respecto al código, usted está usando 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ó.

Después de ver tu edición.....

Siempre había asumido que un OrderSelect() se perdería cuando hay un nuevo tick.

Así que lo he comprobado y he encontrado que una vez que una orden es seleccionada, permanece seleccionada incluso en nuevos ticks posteriores.

Cada día se aprende algo nuevo :)

 
Keith Watford: Después de ver tu edición.....

Siempre había asumido que un OrderSelect() se perdería cuando hay un nuevo tick.

Así que lo comprobé y descubrí que una vez que se selecciona una orden, ésta permanece seleccionada incluso en nuevos ticks posteriores.

Cada día se aprende algo nuevo :)

En la práctica, sin embargo, es de poca utilidad ya que esos detalles se congelan en el tiempo, por lo que cosas como OrderClosePrice () no se actualizarán hasta que se vuelva a seleccionar.
 
Usar OrdersTotal directamente y/o no filtrar el número mágico en su bucleOrderSelect significa que su código es incompatible con todos los EA (incluyendo a sí mismo en otros gráficos y el comercio manual.) Symbol No es igual a Ordersymbol cuando otra moneda se añade a otro gráfico separado . - Foro MQL4
 
Fernando Carreiro:

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's.

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


    for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
         if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) continue;
         //---Check Order Type
         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }
      if(OrderType()==OP_SELL)
        {
          if(fastma > slowma)
          {
             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
            
          }
          else
               Print("Error : ", GetLastError());
               return(0);
          break;
        }

      } 

Aquí está la sección OrderClose, ya no estoy recibiendo el error de entrada inválida, pero ahora estoy recibiendo el precio inválido

Aquí está directamente desde el registro

2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: precio no válido 1.05454000 para la función OrderClose


 
Matt_Townsend:

           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }

...

         {

             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);

 

Aquí está la sección OrderClose, ya no estoy recibiendo el error de ticket inválido, pero ahora estoy recibiendo el precio inválido

Aquí está directamente desde el registro

2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: precio no válido 1.05454000 para la función OrderClose


No uses Bid/Ask al cerrar, usa OrderClosePrice(). Será automáticamente el precio bueno.
 
Alain Verleyen:
No use Bid/Ask cuando cierre, use OrderClosePrice(). Será automáticamente el precio bueno.

¿Debo sustituirlo en la función OrderClose? y si es así, ¿debo eliminar el OrderClosePrice en la función de impresión que hay debajo?

Editar:

Acabo de hacerlo, pero ahora no mantiene ninguna posición abierta. Sólo abre y cierra posiciones, aunque ahora no tiene ningún problema para trabajar en múltiples pares.

 

         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }

No hay necesidad de los retornos o la ruptura, ya que necesita para completar el bucle

Además, su impresión de error depende de que


           if(fastma < slowma)


sea falsa, no está relacionada con el hecho de que OrderClose() falle



   if(OrderType()==OP_BUY)
     {
      if(fastma<slowma)
        {
         if(OrderClose(OrderTicket(),Lots, OrderClosePrice(),10,clrNONE))
            Print("Order Closed : ",OrderClosePrice());
         else
            Print("Error : ",GetLastError())
        }
     }