como cerrar una orden en MQL4?
como cerrar una orden en MQL4?

 

Publi

Página 1 de 352 12 ??ltimo??ltimo
Resultados 1 al 10 de 17

Tema: como cerrar una orden en MQL4?

  1. #1
    Así a primera vista no sabría decirte por qué no se te cierran todas las operaciones de golpe, pero no, no necesitas poner un MagicNumber diferente a cada orden para conseguir que se cierren todas las operaciones. Para que todo está bien para cerrar todas las operaciones. Para ver que pasa deberías ver que código te devuelve el servidor del broker. Haz algo así para registrar el error en el log del EA:

    Code:
    Código:
     result = OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Gold);
     if (!result){
     Print(???Error closing SELL order: ??? + ErrorDescription(GetLastError()));
     }
    Respecto al cierre parcial se puede hacer perfectamente, para ello simplemente debes poner el número de lotes que quieres cerrar. Por ejemplo, si quieres cerrar el 30% de una posición y esta es de 1 lote, podrías cerrarla así:

    Code:
    Código:
     OrderClose(OrderTicket(),0.3,Bid,3,Blue);
    Nota como he cerrado 0.3 lotes en lugar de 1. Nunca he probado esto pero en teoría, de acuerdo a como funciona Metatrader, debería funcionar.

    Lo de ???programar las órdenes para que el take profit esté condicionado al trailing stop??? no sé que quieres decir. ¿Quieres poner un take profit que vaya cambiando con el trailing stop? ¿Algo así como un trailing profit?

  2.                         
    Publicidad
  3. #2
    Hola, he estado leyendo tu artículo acerca del mágic number y se me ocurre que quizá tenga que identificar cada una de las órdenes con un magic númber diferente, es decir algo como:

    Code:
    Código:
    OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,Ask + 30 * Point,???My order 1???,MagicNumber1,0,Green);
     OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,Ask + 60 * Point,???My order 1???,MagicNumber2,0,Green);
     OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,Ask + 90 * Point,???My order 1???,MagicNumber3,0,Green);
     OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,???My order #1???,MagicNumber4,0,Green);
    y después en la función que cierra las operaciones ponerlo en las condiciones algo como:

    Code:
    Código:
    double cierraoperacion()
    {
    
    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() == MagicNumber1 && OrderMagicNumber() == MagicNumber2 && OrderMagicNumber() == MagicNumber3 && OrderMagicNumber() == MagicNumber4)
    {
    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,Blue);
    testcompra=1;
    comprados=0;
    }
    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,Blue);
    testventa=1;
    vendidos=0;
    }
    }
    }
    }
    }
    }
    Serviría esto para cerrar todas las operaciones de golpe?

    Por último, mi robot se basa en medias exponenciales y en intentar que compre o venda cuando exista tendencia, he visto que tienes un artículo que habla de diferentes indicadores, podrías recomendarme uno que estuviera basado en el volumen o en la volatilidad y que me indicara que la tendencia en la que he entrado tiene fuerza, o tiene continuación o algo así, es para filtrar las entradas e intentar acertar en un porcentaje mayor las entradas. quiero usarlo en gráficos de velas de 30 minutos.

    Gracias y espero no agobiarte con mis cuestiones.

  4. #3
    Hola, tengo un problema con el código, es el siguiente, quiero lanzan 4 ordenes de compra o de venta cuando se cumplen ciertas condiciones, y cada una de ellas debe tener un take profit diferente, de la siguiente forma:

    Code:
    Código:
    OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,Ask + 30 * Point,???My order #1???,MagicNumber,0,Green);
     OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,Ask + 60 * Point,???My order #1???,MagicNumber,0,Green);
     OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,Ask + 90 * Point,???My order #1???,MagicNumber,0,Green);
     OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,???My order #1???,MagicNumber,0,Green);
    Una de las condiciones que tiene que cumplirse es la siguiente:

    Code:
    Código:
    vela1=Close[1]-Open[1];                                     //Si la vela actual y la anterior es >=0 la vela es verde, si es <0, la vela es roja
     vela2=Close[2]-Open[2];
    
     if (comprados==1&&vela1<0&&vela2>=0&&Close[1]=0&&vela2<0&&Close[1]>MA_media_1) //si la vela actual es verde y la vela anterior es roja, si estamos vendidos y si el cierra de la vela actual
     {                                                        //está por encima de la media de medios, tenemos que cerrar la mitad de las posiciones, o sea 2.
     cierraoperacion();
     }
    Cuando se cumple esto salta a la función:

    Code:
    Código:
    double cierraoperacion()
    {
    
    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,Blue);
    testcompra=1;
    comprados=0;
    }
    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,Blue);
    testventa=1;
    vendidos=0;
    }
    }
    }
    }
    }
    }
    Cuando salta a esta función y tiene por ejemplo 4 órdenes abiertas, debería cerrarlas todas a la vez, sin embargo no lo hace. Cierra 2 o 3, no siempre las mismas. Esto puede deberse a que no le da tiempo a cerrarlas todas cuando salta a la función y se espera al siguiente ciclo para cerrar las que sigue teniendo abiertas?
    De qué forma podría cerrarlas todas a la vez?
    Es posible abrir sólo una orden e ir cerrándola por lotes, es decir abro una orden y cuando se cumplen 30 ticks cierro el 30 % de la operación, cuando se cumplen otros 30 ticks cierro el otro 30 %, al cumplirse otros 30 ticks cierro otro 30 % y el resto de la operación abierta, que será del 10% seguirá abierta?

    Otra pregunta, como puedo programar las órdenes para que el take profit esté condicionado al trailing stop, es decir abrir 4 posiciones y tal y como he puesto en el código anterior y la que el take profit de cada orden sea de 20 pips para la primera, 40 pips para la segunda y 60 pips para la tercera por ejemplo?

    Gracias.

  5. #4
    Como dicen, yo también quiero un indicador que me diga cuándo va a cambiar la tendencia!! Jeje.

    Fuera bromas, indicadores hay muchos. Desde mi punto de vista todos tienen su utilidad, todos son buenos y todos son malos. La clave es la forma de uso y la experiencia del trader. Por eso siempre hay que aprender y entrenarse. Y si vas a programar hay que conocer muy bien que es lo que hace el indicador, su fórmula de cálculo, qué datos tiene en cuenta y que significa su resultado. No es tan simple como se ha planteado aquí, al menos desde mi opinión.

  6. #5
    ??? Conoces algún indicador que vaya bien para anticiparme al cambio de tendencia y entonces salir de la operació?
    Yo también lo quiero saber!!! (junto a unos cuántos miles de personas) :woohoo:

  7. #6
    No por favor, no te preocupes cualquier idea o sugerencia será bien recibida. Mi idea para determinar la tendencia es comparar dos valores sucesivos de la EMA, el de la vela recién finalizada y el de la vela anterior, para suavizar la EMA se pueden ir probando valores a ver cual va mejor y de esta forma que determine la tendencia sin esos altibajos.
    No se me ocurre otra forma de determinar la tendencia (pero yo soy muy pollo programando sistemas automáticos).
    El funcionamiento del sistema que estoy programando es el siguiente:

    ??? 1º determina tendencia.
    ??? 2º Si no tenemos tendencia no hace nada.
    ??? 3º si la tendencia es alcista y la vela que finaliza está por encima de la EMA de altos (será una vela verde) entramos largos y lanza una orden de compra. Si estamos vendidos cierra la orden de venta.
    ??? 4º Si la tendencia es bajista y la vela que finaliza está por debajo de la EMA inferior (será una vela roja) entramos cortos y lanza una orden de venta. Si estamos comprados cierra la orden de compra.

    El problema es que los ticks que consigues cuando estás en tendencia, los pierdes cuando la tendencia se gira, para esto necesito:
    ??? Cada 5, 10, 15, etc (esto se irá probando), salir y si seguimos en tendencia volver a entrar, es decir si estamos en tendencia alcista y estamos comprados cuando tenga por ejemplo 15 ticks, vender y volver a comprar hasta que tenga de nuevo 15 ticks y así hasta que la tendencia se gira-
    ??? Si la tendencia es bajista el mismo proceso pero yendo vendido.

    La pregunta es:
    ??? Cómo puedo hacer esto, existe algún boolean que puede darme un true o un false cuando se haya vendido para así usarlo para entrar de nuevo, o cómo puedo hacerlo?
    -Conoces algún indicador que vaya bien para anticiparme al cambio de tendencia y entonces salir de la operació?
    ??? Se admiten sugerencias.

    Gracias y perdona por la extensión del comentario, un saludo.

  8. #7
    Como te dije, tu idea para decidir en algún momento si hay tendencia o no, no me parece muy buena, pero yo pienso desde un punto de vista a medio-largo plazo y creo que tú intentas hacer algo a corto plazo, puede incluso que scalping, ¿no? Entonces puede que valga. De todas formas, ideas de sistemas de trading hay miles, yo no tengo una infalible, de lo contrario ya sería millonario.

    Si me pongo muy repelente dime, no quiero que parezca que yo lo se todo, porque no lo sé ni de lejos.
    Imágenes adjuntadas Imágenes adjuntadas

  9. #8
    Hola, este sistema como te decia no es rentable por que cuando entra en tendencia sólo me hace una compra o una venta, y si el mercado se gira pierdo lo ganado, por tanto al ponerle el take profit y stop loss, recojo ganancias pero no se como hacer que si sigue en tendencia me vuelva a hacer otra compra de nuevo, te pongo el código para que lo veas.

    Code:
    Código:
    #property copyright ???jose damian cabezas pozo???
     #property link      ???http://www.metaquotes.net???
    //????????????????????????????????????????????????????????????-
     //???????????????-cuerpo del programa principal???????????????
     //????????????????????????????????????????????????????????????-
     #include 
    
    extern   int      MagicNumber = 852745962;
     extern   int Periodocalctrend = 5; //variable externa que almacena el periodo para calcular la tendencia
     extern   int PeriodoMA = 5; //periodo de la media alta
     extern   int PeriodoMM = 5; //periodo de la media de medios
     extern   int PeriodoMB = 5; //periodo de la media baja
     extern   double   TakeProfit =15;
     extern   double   StopLoss =15;
    
    int testcompra=0;
     int testventa=0;
     int numordersend, numorderbuy;
     int      numerodeorden;
     int ticket = 0;
    
    int start()
     {
    
     //int testcompra=0;
     //int testventa=0;
     double trend; //variable que almacena la tendencia
     double MA_alta_1, MA_baja_1, MA_media_1; //variables que me almacenan el valor de la media alta, media baja y media de medios
    
    //????????????????????????????????????????????????????????????-
     //while(Close[1]!=0)
     //{
     MA_alta_1 = iMA(NULL, 0, PeriodoMA, 0, MODE_EMA, PRICE_HIGH, 1); //valor de media alta para el ultimo tick de la vela anterior
    
    MA_baja_1 = iMA(NULL, 0, PeriodoMB, 0, MODE_EMA, PRICE_LOW, 1);//valor de media baja para el ultimo tick de la vela anterior
    
    MA_media_1 = iMA(NULL, 0, PeriodoMM, 0, MODE_EMA, PRICE_MEDIAN, 1);//valor de media de medios para el ultimo tick de la vela anterior
    
    trend=calctrend();    //saltamos a la funcion que calcula la tendencia
     //????????????????????????????????????????????????????????????-
     if(trend==0)    //si tendencia es 0 no tenemos tendencia
     {
     Alert(???no tenemos tendencia???);
     }
     //????????????????????????????????????????????????????????????-
    
     if(trend!=0)
     {
     //???????????????????????????????????????????????????????????????
     if (trend>0)
     {
     Alert (???la tendencia es alcista, y su valor es de???, trend);
     while (Close[1]>MA_alta_1&&testcompra==0)
     {
     cierraoperacion();
     Alert(???enviar orden de compra???);
     ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask ??? StopLoss * Point,Ask + TakeProfit * Point,???My order #1???,MagicNumber,0,Green);
     testcompra=1;
     testventa=0;
     Alert(???el valor de la variable ticket una vez ha vendido es???, ticket);
     }
     }
     //????????????????????????????????????????????????????????????-
     else
     {
     if(trend<0)
     {
     Alert("la tendencia es bajista, y su valor es de", trend);
     while (Close[1]
    La idea es que una vez estamos en tendencia por ejemplo alcista, funcione como lo hace pero que por ejemplo a 15 ticks recoja beneficios y realice otra compra, cómo puedo conseguirlo, pensaba que utilizando la variable ticket, que tomara un valor y utilizar este valor cuando se vendiera para volver a comprar, pero me da un valor raro, se te ocurre algo. Me he fijado en tus funciones pero no saco nada en claro.
    Se te ocurre alguna variación para no perder lo ganado una vez el mercado se gire?
    Gracias.
    alcista

  10. #9
    Me alegro!!! Y si este no te es rentable no pares de echarle imaginación e ir probando diferentes eegias.

  11. #10
    Gracias, te debo una paella, ya está el código funcionando, otra cosa es que sea rentable o no, un saludo.

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.