como cerrar una orden en MQL4? - Página 2
como cerrar una orden en MQL4?

 

Publi

Página 2 de 352 PrimerPrimer 12
Resultados 11 al 17 de 17

Tema: como cerrar una orden en MQL4?

  1. #11
    Jejejeje, creo que lo tienes hecho, sólo tienees errores tontos típicos de cuándo llevas horas dándole vueltas a un problema, tienes la solución delante y no la ves.

    Bromas a parte, te comento, inicializabas dos veces la variable MagicNumber, pero es que además luego ponías en una orden MagicNumber1 y en la otra MagicNumber2 y ninguna de estas variables existen en tu código. Luego haces la comprobación if(OrderMagicNumber() == MagicNumber), pero lo que has asociado a las órdenes era MagicNumber1 y MagicNumber2, por lo que no se cumple la condición para ejecutar OrderClose().

    Code:
    Código:
    #include 
    extern   int   MagicNumber = 852745961;
     int      numerodeorden;
     int      testcompra=0;
     int      testventa=0;
    
    void start()
     {
     while (testcompra==0)
     {
     Alert(???enviar orden de compra???);
     OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-15*Point,Ask+25*Point,???My order #1???,MagicNumber,0,Green);
     testcompra=1;
     }
    
     while (testventa==0)
     {
     Alert(???enviar orden de venta???);
     OrderSend(Symbol(),OP_SELL,0.1,Ask,3,Ask-15*Point,Ask+25*Point,???My order #2???,MagicNumber,0,Green);
     testventa=1;
     }
    
    for (int i = 0; i < OrdersTotal(); i++)
    {//Ejecutamos la funcion OrderSelectif(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
    //si OrderSelect ha seleccionado alguna orden, comprobamos las condiones que buscamos
    if(Symbol() == OrderSymbol())
    {
    //si el simbolo del grafico actual es igual al simbolo de la orden seleccionada,
    //pasamos a la siguiente comprobacion
    if(OrderMagicNumber() == MagicNumber)
    {
    if(OrderType() == OP_BUY)
    {
    //se han dado las tres condiciones que hace que la orden seleccionada sea
    //la orden que queremos cerrar, asi que la cerramos
    OrderClose(OrderTicket(),0.1,Bid,3,Red);
    }
    if(OrderType() == OP_SELL)
    {
    //se han dado las tres condiciones que hace que la orden seleccionada sea
    //la orden que queremos cerrar, asi que la cerramos
    OrderClose(OrderTicket(),0.1,Ask,3,Red);
    }
    }
    }
    }
    }
    return;
    }
    También hay que tener en cuenta que en OrderClose se pone el precio Ask para cerrar un operación de venta y el precio Bid para cerrar una operación de compra, es simplemente porque es la forma en que funciona el mercado: si cierras una operación de venta, lo que haces en realidad es comprar y las compras se realizan al precio Ask, y viceversa. Si no se pone así es muy fácil que obtengas errores al intentar cerrar una determinada orden.

  2.                         
    Publicidad
  3. #12
    Hola, me queda claro como tengo que hacerlo según tu explicación, pero cuando lo aplico a mi código no me cierra las órdenes, sinceramente me está volviendo loco este lenguaje de programación, en C es muy sencillo pero no me aclaro con las ordenes de apertura y cierre de posiciones, te paso el código que tengo para probar el cierre y apertura de operaciones que a mi no me funciona.

    Code:
    Código:
    #include 
    extern   int      MagicNumber = 852745961;
     extern   int      MagicNumber = 852745962;
     int      numerodeorden;
     int      testcompra=0;
     int      testventa=0;
    
    void start()
     {
     while (testcompra==0)
     {
     Alert(???enviar orden de compra???);
     OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-15*Point,Ask+25*Point,???My order #1???,MagicNumber1,0,Green);
     testcompra=1;
     }
    
     while (testventa==0)
     {
     Alert(???enviar orden de venta???);
     OrderSend(Symbol(),OP_SELL,0.1,Ask,3,Ask-15*Point,Ask+25*Point,???My order #2???,MagicNumber2,0,Green);
     testventa=1;
     }
    
    for (int i = 0; i < OrdersTotal(); i++)
    {
    //aquí ejecutamos el OrderSelect() para ir seleccionado cada una de las ordenes del índice
    //cuando la orden seleccionada cumpla las condiciones de la orden que queremos cerrar
    //ejecutamos OrderTicket() y ya podemos ejecutar OrderClose()
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);//Ejecutamos la funcion OrderSelectif(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
    //si OrderSelect ha seleccionado alguna orden, comprobamos las condiones que buscamos
    if(Symbol() == OrderSymbol())
    {
    //si el simbolo del grafico actual es igual al simbolo de la orden seleccionada,
    //pasamos a la siguiente comprobacion
    if(OrderMagicNumber() == MagicNumber)
    {
    if(OrderType() == OP_BUY)
    {
    //se han dado las tres condiciones que hace que la orden seleccionada sea
    //la orden que queremos cerrar, asi que la cerramos
    OrderClose(OrderTicket(),0.1,Ask,3,Red);
    }
    }
    }
    }
    }
    return;                                   // Exit start()
    }
    tan sólo pretendo abrir una orden de compra y una orden de venta, y que después me cierre las operaciones, pues no hay forma, qué estoy haciendo mal, por que he puesto el código tal cual me has indicado, qué modificaciones tendría que hacer en este código y una vez que controle bien como abrir y cerrar posiciones poder aplicarlo a mi código?
    Gracias y te debo una.

  4. #13
    Como te dije, antes:

    Quote:
    Antes de ejectutar la función OrderClose() tienes que seleccionar la orden que quieres con la OrderSelect() y así puedes acceder al número de ticket con la función OrderTicket().
    Es decir, primero seleccionas una orden con OrderSelect() y luego accedes a su número de ticket de la orden seleccionada con OrderTicket() para recibir el número de ticket y poder ejecutar OrderClose(). La selección de una orden puede ser algo complicado si no se sabe el número de ticket, como es el caso. Primero hay que hacer un recorrido por todas las órdenes que tengas activas en tu cuenta, incluyendo todas las posiciones (órdenes abiertas o ejecutadas) y todas las órdenes pendientes (órdenes stop y limit). Cada una de estas órdenes tiene un número de índice, cómo si fuese un array. Imagenemos que tienes las siguientes 4 órdenes:

    Orden 1: posición cero en el índice. Orden de compra en el par EUR/USD abierta manualmente
    Orden 2: posición 1 en el índice. Orden de compra en el par EUR/USD abierta por tu EA, esta será nuetro objetivo en el ejemplo.
    Orden 3: posición 2 en el índice. Orden de venta en USD/CHF.
    Orden 4: posición 3 en el índice. Orden de compra STOP en EUR/USD abierta también por el EA y que aún no ha sido abierta.
    Tenemos nuestro Expert Advisor andando en el par EUR/USD y queremos cerrar una operación de compra que el EA abrió anteriormente en el par EUR/USD y que ya esté como operación abierta, no pendiente. Si miramos las 4 órdenes que tienes, sería la orden 2, la que está en la posición 1 del índice.

    Primero hacemos un recorrido por todo el índice, desde cero hasta 3. Para que el programa sepa siempre hasta dónde llegar hacemos el recorrido desde cero hasta el total de órdenes menos 1:

    Code:
    Código:
    for (int i = 0; i < OrdersTotal(); i++){
    //aquí ejecutamos el OrderSelect() para ir seleccionado cada una de las ordenes del indice
    //cuando la orden seleccionada cumpla las condiciones de la orden que queremos cerrar
    //ejecutamos OrderTicket() y ya podemos ejecutar OrderClose()
    }
    ¿Qué condiciones ha de cumplir la orden que queremos cerrar?: Hemos dicho que sea una operación en EUR/USD, cómo el EA hemos dicho que está ejecutándose en EUR/USD se puede utilizar Symbol(), que devuelve el símbolo del gráfico en el que está el EA. También queremos cerrar sólo la operación que abrió el EA, no la que se abiró manualmente o la que abrió otro EA (se puede hacer de muchas formas, a mi me gusta hacerlo con el MagicNumber ya que así se permite que se puedan utilizar múltiples instancias del mismo EA incluso en el mismo par de divisas y mismo timeframe de forma totalmente independiente). Cómo tercera condición queremos cerrar la operación de compra abierta, no la pendiente:

    Code:
    Código:
    for (int i = 0; i < OrdersTotal(); i++){
    //Ejecutadmos la funcion OrderSelect
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
    //si OrderSelect ha seleccionado alguna orden, comprobamos las condiones que buscamos
    if(Symbol() == OrderSymbol()) {
    //si el simbolo del grafico actual es igual al simbolo de la orden seleccionada,
    //pasamos a la siguiente comprobacion
    if(OrderMagicNumber() == EL_MAGIC_NUMBER_DE_TU_EA) {
    //si el MagicNumber de la orden seleccionada es igual al MagicNumber que utilizamos
    //pasamos a la suiente comprobacion
    if(OrderType() == OP_BUY){
    //si la orden seleccionada es del tipo OP_BUY
    //se han dado las tres condiciones que hace que la orden seleccionada sea
    //la orden que queremos cerrar, asi que la cerramos
    OrderClose(OrderTicket(),DEMAS_PARAMETROS.....);
    }
    }
    }
    }
    }
    }
    El ejemplo que te decía de la plantilla es similar pero hace más comprobaciones para evitar, en la medida de los posible, algunos fallos que pueden darse en la vida real, como puede ser la repetición del proceso un determinado número de veces en caso de que, por alguna razón, falle el ciere en un primer intento. Estudialo, creo que está bastante completo.

    Espero que te sirva de ayuda y no te lie más.

  5. #14
    Hola, gracias por tomarte tantas molestias.

    No entiendo el ejemplo de tu plantilla, podrías comentarme como hacerlo para un código tan simple como este, pretendo que lance una orden de compra, muestre el número de ticket, la cierre y haga lo mismo con una orden de venta:

    Code:
    Código:
    int numerodeorden;
     int start()                                  // Special function start()
     {                                          // Opening BUY
     OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);
     numerodeorden=OrderTicket();
     Alert(???el numero de orden es ???, numerodeorden);
     OrderClose(OrderTicket(),0.1,Ask,3,Red);
     OrderSend(Symbol(),OP_SELL,0.1,Ask,3,Bid-15*Point,Bid+15*Point);
     numerodeorden=OrderTicket();
     Alert(???el numero de orden de venta es ???, numerodeorden);
     OrderClose(OrderTicket(),0.1,Ask,3,Red);
    
     return;                                   // Exit start()
     }

  6. #15
    Hola, una prueba rápida para abrir una orden y cerrar la misma (ya se que no tiene utilidad), es para ver si order ticket me captura automaticamente el número de orden, sería así?

    Code:
    Código:
    int start()
     {
     OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);
     OrderClose(OrderTicket(),0.1,Ask,3,Red);
     return;                                   // Exit start()
     }

  7. #16
    Cita Iniciado por Jativ Ver mensaje
    Hola, si estoy largo o corto, cómo puedo cerrar una orden en un EA, pensaba que sería con la función
    Código:
    bool OrderClose( int ticket, double lots, double price, int slippage, color Color=CLR_NONE)
    Pero necesito el número de ticket, no? y este lo asigna el bróker cuando lanza la orden al mercado, por tanto que ticke tengo que meterle a la función si no se el número que me asignará el broker?
    Buenos días!!

    Antes de ejectutar la función OrderClose() tienes que seleccionar la orden que quieres con la OrderSelect() y así puedes acceder al número de ticket con la función OrderTicket().

    Un ejemplo lo tienes en la plantilla para Expert Advisor que comentaba en otro tema, en la función CheckForClose(). Espero que te sirva, si no dime y te posteo un ejemplo comentado cuándo tenga un poco más de tiempo, que ahora esoy muy liado.

  8. #17
    Hola, si estoy largo o corto, cómo puedo cerrar una orden en un EA, pensaba que sería con la función
    Código:
    bool OrderClose( int ticket, double lots, double price, int slippage, color Color=CLR_NONE)
    Pero necesito el número de ticket, no? y este lo asigna el bróker cuando lanza la orden al mercado, por tanto que ticke tengo que meterle a la función si no se el número que me asignará el broker?

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •  
Uso de cookies
Utilizamos cookies propias y de terceros para elaborar información estadística y mostrarle publicidad personalizada a través del análisis de su navegación. Si continúa navegando acepta su uso. Más información y política de cookies.
     

Aviso legal: Ni forosforex.com ni ninguna persona involucrada en forosforex.com aceptarán ninguna responsabilidad por cualquier pérdida o daño en el trading como resultado de la confianza en la información contenida en este sitio web, incluidos datos, cotizaciones, gráficos y señales de compra/venta. Por favor, infórmese plenamente de los riesgos y costes asociados a las operaciones en los mercados financieros, una de las formas de inversión que más riesgos entrañan.
forosforex.com le quiere recordar que los datos contenidos en este sitio web no son necesariamente en tiempo real ni exactos. forosforex.com no asume responsabilidad alguna por las pérdidas en que usted podría incurrir como resultado de la utilización de estos datos. Este acuerdo se rige por su versión en inglés, que prevalecerá siempre que haya alguna discrepancia entre la versión en inglés y la versión en español. Los CFD son un producto difícil de entender, varios organismos reguladores consideran que no es adecuado para inversores minoristas debido a su complejidad y riesgo.
Advertencia de riesgo: Los CFDs son un producto difícil de entender, y puede no ser adecuado para inversores minoristas debido a su complejidad y riesgo. Existe la posibilidad de sufrir una pérdida igual o superior a la inversión. Por lo tanto, no debe invertir o arriesgar dinero que no pueda permitirse perder. Debe asegurarse de que comprende todos los riesgos. Antes de abrir una cuenta en un broker por favor sea consciente e infórmese de los riesgos asociados con el trading. El contenido de este sitio web no debe interpretarse como asesoramiento personal. ForosForex recomienda que busque el consejo de un asesor financiero independiente.