Ayuda Detectar tipo de operación anterior

 

Publi

Detectar tipo de operación anterior

 

Publi

Página 1 de 2 12 ÚltimoÚltimo
Resultados 1 al 10 de 18


  1. #1
    Avatar de Armando



    Reputación:
    Poder de reputación: 13

    Espana
    Mensajes: 191
    Créditos: 3.805

    Re: Detectar tipo de operación anterior


    Publi
    Cita Iniciado por carlessan Ver mensaje
    Hola Armando,
    Si te refieres a saber de que tipo es la última orden que ha entrado, (aunque hay varias variantes) lo puedes hacer así:


    if(OrdersTotal()>0)
    {
    if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS, MODE_TRADES))
    {
    if(OrderType()==OP_BUY)
    {
    // la última orden abierta es de compra
    }
    if(OrderType()==OP_SELL)
    {
    // la última orden abierta es de venta
    }
    }
    }


    salu2
    Hola compi gracias por toda la ayuda, lo que quiero es conocer si la operación anterior (ya cerrada) es Buy o Sell.

    Es decir, que si la operación es buy y cierra, que el EA tenga que esperar a la próxima señal de entrada sell. No se si me he explicado bien ...

    Porque el problema que tengo es que siempre que se cierra una operación se abre automáticamente otra , pongo imagen para que me explique mejor:
    Detectar tipo de operación anterior-captura.png

    Como veis, la operación cierra y en la vela siguiente vuelve a ejecutar otra orden y esto es lo que no quiero, quiero que espere a otra señal para abrir la operación.

    ahora mismo tengo esto :

    Código:
    int start()
      {
     double Ema1 = iMA(NULL,0,ema1,1,MODE_SMA,PRICE_LOW,1);
     double Ema2 = iMA(NULL,0,ema2,1,MODE_SMA,PRICE_LOW,1);
    int BuyOrder=0,SellOrder=0,Ordenes=OrdersTotal();
    
    
       int _GetLastError=0,_OrdersTotal=OrdersTotal();
    
    
       for(int z=_OrdersTotal-1; z>=0; z --)
         {
          if(!OrderSelect(z,SELECT_BY_POS))
            {
             _GetLastError=GetLastError();
             Print("OrderSelect( ",z,", SELECT_BY_POS ) - Error #",
                   _GetLastError);
             continue;
            }
          if(OrderSymbol()!=Symbol()) continue;
          if(OrderMagicNumber()!=MagicNumber) continue;
          if(OrderType()==OP_BUY)
            {
             if(OrderTakeProfit()== true)
               {
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,5,Green))
                  {
                   _GetLastError=GetLastError();
                   Alert("Error al cerrar la posición",_GetLastError);
                   return(-1);
                  }
                  
               }
             else
               { 
               return(0);
                }
            }
          if(OrderType()==OP_SELL)
            {
             if(OrderTakeProfit()==true)
               {
                if(!OrderClose(OrderTicket(),OrderLots(), Ask,5,Red))
                  {
                   _GetLastError=GetLastError();
                   Alert("Error al cerrar la posición № ",_GetLastError);
                   return(-1);
                  }
               }
             else return(0);
            }
         }
    
    
    if(OrdersTotal()>0)
      {
       if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
         {
          if(OrderType()==OP_BUY)
            {
             if(Ema1>Ema2)
               {
                int ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,5,Ask-stop*Point,Ask+take*Point,"FinalV1",MagicNumber,0,Green);
               }
            }
            if(OrderType()==OP_SELL)
              {
               if(Ema1<Ema2)
                 {
                  int ticket = OrderSend(Symbol(),OP_SELL,lots,Bid,5,Bid+stop*Point,Bid-take*Point,"FinalV1",MagicNumber,0,Red);
                 }
              }
         }
      }
        
    
    
    
    
     
    return(0);
    }

    Que por cierto, no me abre operaciones..
    Foro de Forex Trading United
    Última edición por Armando; 20:50 a las


  2. Publi
    Publi


  3. #2
    Avatar de carlessan



    Reputación:
    Poder de reputación: 0

    Mensajes: 95
    Créditos: 2.505

    Re: Detectar tipo de operación anterior

    De la forma que tienes el código no te puede abrir operaciones porque está supeditado al primer "if" el cual solo deja operar si existe alguna orden ya cerrada. Como de primeras no existe ninguna orden cerrada (el histórico está vacío), no te abre ninguna orden nueva.

    Deberías escribir el código necesario para abrir la 1ª orden antes de ese primer "if", o no te operará.

    Salu2
    Foro de Forex Trading United

  4. Gracias Armando, robertomar Gracias por este post
  5. #3
    Avatar de Armando



    Reputación:
    Poder de reputación: 13

    Espana
    Mensajes: 191
    Créditos: 3.805

    Re: Detectar tipo de operación anterior

    Cita Iniciado por carlessan Ver mensaje
    De la forma que tienes el código no te puede abrir operaciones porque está supeditado al primer "if" el cual solo deja operar si existe alguna orden ya cerrada. Como de primeras no existe ninguna orden cerrada (el histórico está vacío), no te abre ninguna orden nueva.

    Deberías escribir el código necesario para abrir la 1ª orden antes de ese primer "if", o no te operará.

    Salu2
    Tenia la sensación que era ese el motivo, pero como se ha notado soy novato en la programación jeje, pues si , he puesto una operación antes de todo el código y efectivamente comienza las operaciones, aunque me abre dos del mismo tipo, pero creo saber porque.

    Muchas gracias por tu ayuda compi !!
    Foro de Forex Trading United

  6. Gracias robertomar Gracias por este post
  7. #4
    Avatar de Armando



    Reputación:
    Poder de reputación: 13

    Espana
    Mensajes: 191
    Créditos: 3.805

    Re: Detectar tipo de operación anterior

    Cita Iniciado por carlessan Ver mensaje
    Hola compañero,

    Estás realizando la entrada de la orden dentro de un bucle "for" que realiza tantos ciclos como ordenes tengas abiertas.
    Lo "normal" sería realizar la entrada de la orden fuera del bucle o mejor dicho, sin bucle, así sólo entraría una orden (buy o sell) según fuera tu señal.
    Sin ver más código solo puedo decirte que ese bucle "for" ahí sobra.

    Salu2

    Gracias carlessan! Voy a realizarlo fuera, pero en sí para "detectar" el tipo de operación que ha sido ejecutada anteriormente es como lo he realizado?
    Foro de Forex Trading United

  8. #5
    Avatar de carlessan



    Reputación:
    Poder de reputación: 0

    Mensajes: 95
    Créditos: 2.505

    Re: Detectar tipo de operación anterior

    Eso ya no se que decirte, dependerá de como entiendas la estrategia que estás programando, de hecho yo no acabo de ver el porqué consultar el histórico de órdenes en una estrategia simple de cruce de medias, eso ya supongo que es algo propio de tu estrategia y deberás analizar línea por línea la ejecución del programa para ver donde puede estar la diferencia entre lo que hace el experto y lo que tu tienes en mente que debería hacer.
    Foro de Forex Trading United

  9. Gracias robertomar, josemasmax Gracias por este post
  10. #6
    Avatar de carlessan



    Reputación:
    Poder de reputación: 0

    Mensajes: 95
    Créditos: 2.505

    Re: Detectar tipo de operación anterior

    Hola Armando,
    Si te refieres a saber de que tipo es la última orden que ha entrado, (aunque hay varias variantes) lo puedes hacer así:


    if(OrdersTotal()>0)
    {
    if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS, MODE_TRADES))
    {
    if(OrderType()==OP_BUY)
    {
    // la última orden abierta es de compra
    }
    if(OrderType()==OP_SELL)
    {
    // la última orden abierta es de venta
    }
    }
    }


    salu2
    Foro de Forex Trading United

  11. #7
    Avatar de Armando



    Reputación:
    Poder de reputación: 13

    Espana
    Mensajes: 191
    Créditos: 3.805

    Detectar tipo de operación anterior

    Hola compañeros, actualmente estoy desarrollando un EA personal, en el cual ya está siendo rentable y poco a poco lo voy optimizando, pero uno de los errores que tiene y del cual hace que las operaciones salgan negativas es que cuando se realiza una operación de cualquier tipo y esta cierra automáticamente abre otra del mismo tipo... llevo tiempo intentando corregir eso.

    es decir, lo que quiero es que cuando el EA habrá una operación y está se termina no habrá automáticamente otra operación del mismo tipo, sino que espere a otra señal, ya sea del mismo tipo de la contraria, pero que no habrá automáticamente lo mismo.

    he probado con :

    for(int z = OrderTotal()-1;>=0;z--)
    {
    if(z==OP_SELL)
    {
    Aqui la entrada en compra
    }
    if(z==OP_BUY)
    {
    Aquí la operación de venta
    }
    }

    pero no funciona, probablemente esté todo mal, pero no pillo como hacerlo, si me podéis ayudar, os lo agredeceré
    Foro de Forex Trading United

  12. #8

    Re: Detectar tipo de operación anterior

    Hola compi, no se qué es lo que pretendes conseguir exactamente o cuál es el objetivo del EA.

    Mirando así muy por encima, lo único que veo es que en ese fragmento de código que has puesto tienes bastantes errores.


    • Por un lado, si lo que quieres consultar es el historial de órdenes, debes usar OrdersHistoryTotal() en lugar de OrdersTotal().
    • En segundo lugar, esa no es forma confiable de consultar la última orden cerrada. Solamente te podría servir para un backtest, pero NO para operativa on line (ni en cuenta demo ni real), dado que la orden colocada en la última posición del historial de órdenes puede ser de cualquier otro par, o de cualquier otro EA o puede ser una orden manual, etc, etc.
    • Por tanto, deberías de realizar un bucle y filtrar por Símbolo y Magic Number, para encontrar la última operación DE ESTE EA que se cerró. Una vez que la hayas encontrado, puedes cortar el bucle para que no siga buscando más órdenes inútilmente.
    • Una vez sepas si ESTE EA ya ha cerrado alguna orden y de qué tipo fue, entonces, después ya actuas como tengas que actuar en arreglo a lo que quieras hacer exactamente.


    Respecto a lo que pusiste unos posts más atrás para mql5 pues estaba todo mal, no merece la pena ni comentarlo. En mql5 tienes que tener en cuenta la diferencia entre órdenes, transacciones y posiciones.

    Saludos y un abrazo.
    Foro de Forex Trading United

  13. Gracias josemasmax, Armando, carlessan Gracias por este post
  14. #9
    Avatar de carlessan



    Reputación:
    Poder de reputación: 0

    Mensajes: 95
    Créditos: 2.505

    Re: Detectar tipo de operación anterior

    Hola compañero,

    Estás realizando la entrada de la orden dentro de un bucle "for" que realiza tantos ciclos como ordenes tengas abiertas.
    Lo "normal" sería realizar la entrada de la orden fuera del bucle o mejor dicho, sin bucle, así sólo entraría una orden (buy o sell) según fuera tu señal.
    Sin ver más código solo puedo decirte que ese bucle "for" ahí sobra.

    Salu2
    Foro de Forex Trading United

  15. Gracias josemasmax, Armando Gracias por este post
  16. #10
    Avatar de carlessan



    Reputación:
    Poder de reputación: 0

    Mensajes: 95
    Créditos: 2.505

    Re: Detectar tipo de operación anterior


    Publi
    El el código que he escrito antes, para saber de que tipo es la última operación cerrada, debes acceder al libro de ordenes cerradas (el histórico) por lo que tienes que sustituir la función OrdersTotal() por OrdersHistoryTotal() y en la selección de las órdenes sustituir el MODE_TRADES, por MODE_HISTORY.

    Respecto a que no te pone órdenes, debes mirar qué tipo de error te lanza la plataforma para saber por donde arreglar el problema.

    salu2
    Foro de Forex Trading United

  17. Gracias Armando Gracias por este post
Página 1 de 2 12 ÚltimoÚltimo
This website uses 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.
     

 

Publi


Aviso Legal
Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal