Obtener orden pendiente

 

Hola chic@s.

Soy muy nuevo en esto de programar, y aunque en mql4 hacía algunas cositas, quiero empezar a realizarlas poco a poco en mql5, y ha cambiado mucho la forma de programar de uno a otro. Y como novato en esto, estoy atascado en lo que seguramente será una tontería, pero despues de leer varios articulos y ver videos no consigo encontrar la manera de hacerlo. El caso es que stoy intentando crear un codigo para que mire si tengo una orden sell limit, si la hay que no haga nada, pero si  no la hay pues que ejecute una, segun condiciones. Pero no doy con la tecla. Pueden ayudarme por favor? Mil gracias

 
Manutob:
  • Recorre todas las órdenes activas (OrdersTotal()) y verifica si ya existe una orden Sell Limit para el símbolo actual (OrderType() y OrderSymbol()).
  • Si no encuentra ninguna, utiliza OrderSend para colocar una nueva orden Sell Limit.
 

Hola Miguel Ángel, gracias por tu respuesta, he estado intentado hacer la función pero de momento  no me sale, te dejo el código que llevo escrito para ver si puedes decirme donde estoy fallando. Gracias


int TicketPrueba()
   {
     int numero=0;
     int numOrden=0;
     
     //Recorremos todas las ordenes
      for(int i=OrdersTotal()-1; i>=0; i--)
      {
        //Chequear si es una orden de venta
        if(numOrden==OrderSelect(i))
          {
            // llamada para MQL5  
            if(numOrden==ORDER_TYPE_SELL_LIMIT)
             {
               numero++;
             }
             else trade.SellLimit(Lotes,1.09000);
          }
       }
     return (numero);
   }
 
Manutob #Hola Miguel Ángel, gracias por tu respuesta, he estado intentado hacer la función pero de momento  no me sale, te dejo el código que llevo escrito para ver si puedes decirme donde estoy fallando. Gracias

  • OrderSelect devuelve un booleano (true o false) indicando si la selección de la orden fue exitosa. Compararlo con numOrden no tiene sentido.
  • No usas OrderType() para verificar el tipo de la orden seleccionada, lo cual es fundamental para comprobar si es una orden SELL_LIMIT.
  • Es ambiguo si el objetivo es contar órdenes SELL_LIMIT o ejecutar una nueva orden SellLimit. Ambos están mezclados en el bucle.
 
Manutob #:

Hola Miguel Ángel, gracias por tu respuesta, he estado intentado hacer la función pero de momento  no me sale, te dejo el código que llevo escrito para ver si puedes decirme donde estoy fallando. Gracias


int BuyOrders=0,SellOrders=0;
for(int o=0;o<OrdersTotal();o++){
  ulong Ticket=OrderGetTicket(i);
  if(OrderGetString(ORDER_SYMBOL)==_Symbol){
    if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY_LIMIT){BuyOrders++;}
    if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_SELL_LIMIT){SellOrders++;}
    }
  }

Esto debería funcionar.

 
Pedro Roberto Diez San Jose #: Esto debería funcionar.

Efectivamente, funciona a la perfeccion. Bueno, he tenido que sustituir las "oes" del bucle por "ies" pero el resto del codigo hace lo que quería. Un millon de gracias Pedro.

Gracias a ti también @Miguel Angel Vico Alba .

 

Obtener precio de entrada de una posición concreta

Hola de nuevo chicos, tengo otro lío monumental en la cabeza.

Pongo el caso, hay 12 operaciones abiertas, todas son de venta. Y lógicamente cada una esta con un precio de entrada distinto. De esas 12 posiciones quiero obtener y guardar en una variable (double) el precio de apertura de una de esas operaciones. Concretamente la que tiene el quinto precio de apertura más alto. Y como dije antes guardar ese precio en una variable.

Le he dado vueltas a una función, modificandola mil veces, y probando mil cosas, dentro de mis escasos conocimientos, pero no lo consigo. Os pongo el codigo que me ha quedado por ultimo, a ver si por favor me pueden ayudar.

Muchas gracias.

double Precio12Pos()
   {
    double precios[11];
    
    if (PositionsTotal() == 12) // Asegurar que hay 12 posiciones
      {
       for(int i=0;i<12;i++)
         {
          ulong Ticket=OrderGetTicket(i);
          if(OrderGetString(ORDER_SYMBOL)==_Symbol)
           {
            precios[i]=PositionGetDouble(POSITION_PRICE_OPEN,i);
           }
         }
      }
      return precios[4]; 
   }

Un saludo

 
Manutob #:
double Precio12Pos()
  {
   double precios[11];
   if(PositionsTotal() == 12)
     {
      for(int i = 0; i < PositionsTotal(); i++)
        {
         if(PositionSelect(_Symbol))
           {
            precios[i] = PositionGetDouble(POSITION_PRICE_OPEN);
           }
        }
     }
   ArraySort(precios);
   ArrayReverse(precios);
   return precios[4];
  }

Si intentas usar directamente PositionGetDouble(POSITION_PRICE_OPEN, i), obtendrás un error porque no es la forma correcta en MQL5.

El flujo correcto en MQL5 es:
  • Seleccionar la posición con PositionSelect().
  • Obtener el valor de POSITION_PRICE_OPEN de la posición seleccionada, sin el índice ",i".
Necesitas ordenar la array precios de mayor a menor antes de seleccionar el quinto precio.

Utiliza la función ArraySort, que ordena la array en orden ascendente (menor a mayor), y luego inviertela con ArrayReverse para que de ese modo quede finalmente de mayor a menor.

Luego, accede al índice 4 para obtener el quinto precio más alto.

 
Miguel Angel Vico Alba #:

Si intentas usar directamente PositionGetDouble(POSITION_PRICE_OPEN, i), obtendrás un error porque no es la forma correcta en MQL5.

El flujo correcto en MQL5 es:
  • Seleccionar la posición con PositionSelect().
  • Obtener el valor de POSITION_PRICE_OPEN de la posición seleccionada, sin el índice ",i".
Necesitas ordenar la array precios de mayor a menor antes de seleccionar el quinto precio.

Utiliza la función ArraySort, que ordena la array en orden ascendente (menor a mayor), y luego inviertela con ArrayReverse para que de ese modo quede finalmente de mayor a menor.

Luego, accede al índice 4 para obtener el quinto precio más alto.

Muchas gracias Miguel Angel. No solo por corregir el código, sino también por explicar donde he fallado y por qué a la hora de escribir código y cómo corregirlo. Gracias a los que sabeis programar los demás podemos ir aprendiendo poco a poco con vuestra sabiduría. Gracias crack.
 
He estado probando el código, no se si funciona porque cuando pongo el ea en el grafico, en el primer tick se quita el ea. Si comento este codigo, el ea sigue funcionando bien. Por que puede ser?
 
Manutob #He estado probando el código, no se si funciona porque cuando pongo el ea en el grafico, en el primer tick se quita el ea. Si comento este codigo, el ea sigue funcionando bien. Por que puede ser?

Es difícil saber qué pasa sin tener el código delante, pero te doy unos consejos:

  • Mira siempre la pestaña Diario o Expertos para ver qué está ocurriendo (como mensajes de error o Prints).
  • Coloca Prints en puntos clave del código para comprobar qué está pasando en cada parte. Esto ayuda mucho a depurar.