Pregunta ¿hay alguna manera de seleccionar "todas" las órdenes abiertas y revisar por algún parámetro?

 

Publi

¿hay alguna manera de seleccionar "todas" las órdenes abiertas y revisar por algún parámetro?

 

Publi

Resultados 1 al 4 de 4


  1. #1
    Avatar de tivag
    antecessor


    Reputación:
    Poder de reputación: 17

    Espana
    Mensajes: 659
    Créditos: 5.114

    Re: ¿hay alguna manera de seleccionar "todas" las órdenes abiertas y revisar por algún parámetro?


    Publi
    Cita Iniciado por trader0 Ver mensaje
    Buenas a todos. Quisiera saber si hay alguna forma de seleccionar todas las órdenes abiertas para revisar si todas estas cumplen algún parámetro o si no lo cumplen, sin necesitar seleccionarlas una a una y revisar una por una el si cumple el parámetro. Que diejra algo como lo siguiente (disculpen la mezcla de lenguajes. Es solo para explicar la idea):

    Código:
       if(seleccionar todas las ordenes abiertas)==true) // Aquí la función por la que pregunto
          {
          if(OrderMagicNumber()!=123456) // si no hay ninguna con ese MagicNumber la abre
             {
             int ticket=OrderSend(NULL, OP_BUY, 0.10, Ask, 10, Bid-SL, Bid+TP, NULL, 123456, 0, clrNONE);
             }  
          }
    Esta fue la prueba que hice pero no me funcionó (la intención es que resive que si ninguna orden tiene magicnumber 123456, entonces la abra):

    Código:
       for(int i=0; i<OrdersTotal(); i++)
          {
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
             {                  
             if(OrderMagicNumber()!=123456)
                {
                int ticket=OrderSend(NULL, OP_BUY, 0.10, Ask, 10, Bid-SL, Bid+TP, NULL, 123456, 0, clrNONE);
                }  
             }
          }
    hola trader0 , te lo puse en el otro post el codigo , tan solo que de lo te puse quitarle la parte del tipo de operacion y del simbolo , que eso no te interesa en este caso y quedaria asi , con este codigo lo que hace que si no existe la orden con numero magico 123456 te la abra.

    Código:
    {
        bool exists = false;
        for (int i=OrdersTotal()-1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if (OrderMagicNumber() == 123456)
            {
                exists = true;
            }
        }
        else
        {
            Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
        }
            
        if (exists == false)
        {
            int ticket1=OrderSend(NULL, OP_BUY, 0.10, Ask, 10, Bid-0.0020, Bid+0.0020, NULL, 123456, 120, clrNONE);
                  
        }
        
        
        
    }
    Foro de Forex Trading United

  2. Publi
    Publi


  3. #2




    Reputación:
    Poder de reputación: 10

    Mensajes: 59
    Créditos: 0

    Re: ¿hay alguna manera de seleccionar "todas" las órdenes abiertas y revisar por algún parámetro?

    Cita Iniciado por tivag Ver mensaje
    hola trader0 , te lo puse en el otro post el codigo ,
    disculpa tivag, es que cuando había preguntado en el otro hilo me concentraba en ventana de precio (y en la primera pregunta por error puse primero par). estoy esforzándome aprendiendo este lenguaje y a veces no funciona lo que coloco y pues a veces me vuelvo un poco un lio.

    Gracias por responder de nuevo.
    Foro de Forex Trading United

  4. #3




    Reputación:
    Poder de reputación: 10

    Mensajes: 59
    Créditos: 0

    ¿hay alguna manera de seleccionar "todas" las órdenes abiertas y revisar por algún parámetro?

    Buenas a todos. Quisiera saber si hay alguna forma de seleccionar todas las órdenes abiertas para revisar si todas estas cumplen algún parámetro o si no lo cumplen, sin necesitar seleccionarlas una a una y revisar una por una el si cumple el parámetro. Que diejra algo como lo siguiente (disculpen la mezcla de lenguajes. Es solo para explicar la idea):

    Código:
       if(seleccionar todas las ordenes abiertas)==true) // Aquí la función por la que pregunto
          {
          if(OrderMagicNumber()!=123456) // si no hay ninguna con ese MagicNumber la abre
             {
             int ticket=OrderSend(NULL, OP_BUY, 0.10, Ask, 10, Bid-SL, Bid+TP, NULL, 123456, 0, clrNONE);
             }  
          }
    Esta fue la prueba que hice pero no me funcionó (la intención es que resive que si ninguna orden tiene magicnumber 123456, entonces la abra):

    Código:
       for(int i=0; i<OrdersTotal(); i++)
          {
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
             {                  
             if(OrderMagicNumber()!=123456)
                {
                int ticket=OrderSend(NULL, OP_BUY, 0.10, Ask, 10, Bid-SL, Bid+TP, NULL, 123456, 0, clrNONE);
                }  
             }
          }
    Foro de Forex Trading United
    Última edición por trader0; 05:53 a las Razón: agregar la prueba que he hecho


  5. #4

    Re: ¿hay alguna manera de seleccionar "todas" las órdenes abiertas y revisar por algún parámetro?


    Publi
    Compi, tal como lo estabas haciendo lo que le estabas diciendo es que si la primera orden que encontrases NO tiene ese Magic Number, entonces te abra otra, y así sucesivamente, si la siguiente que encuentre tampoco tiene ese Magic Number, entonces te abra otra más, etc etc.

    Efectivamente, tienes que hacerlo como te dice Tivag. Solo añadir que para que te funcione el código exacto que te dice, tendrías que poner en el encabezamiento:

    #include <stdlib.mqh>

    Ya que en ese código se llama a la función de la librería standard ErrorDescription.

    La otra opción sería no llamar al include, pero entonces el EA no compilaría, tendrías que sustituir la línea:

    Código:
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    Por esta:

    Código:
    Print("OrderSelect() error - ", IntegerToString(GetLastError()));
    Sería bueno resetear el último error generado por el terminal justo antes de llamar a la función, para asegurar que lo que recibas en GetLastError() es justo lo correspondiente al error de esa función.
    También es mejor que, tal como te dije en otro post, te acostumbres a meter los valores de Stop Loss y Take Profit en variables normalizadas para que no tengas errores al mandar las órdenes.








    Código:
    #include <stdlib.mqh>
    
    sinput int    MagicNumber = 123456;
    input  double Lotaje      = 0.10;
    input  ushort StopLoss    = 20;       // Stop Loss (en pips)
    input  ushort TakeProfit  = 20;       // Take Profit (en pips)
    
    uchar  PipValue;
    
    
    int OnInit()
      {
    //---
         
         PipValue = 1;
         if (_Digits == 3 || _Digits == 5) PipValue = 10;
         if (_Digits == 6)                 PipValue = 100;
         
    //---
       return(INIT_SUCCEEDED);
      }
    
    void OnDeinit(const int reason)
      {
       // Aquí lo que quieres que haga al deiniciar, si es que necesitas que haga algo.
      }
    
    void OnTick()
    {
    
       bool exists = false;
       
        for (int i=OrdersTotal()-1; i >= 0; i--)
        {
           ResetLastError();
           if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
               if (OrderMagicNumber() == MagicNumber)
               {
                   exists = true;
                   break;
               }
           }
           else
           {
               Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
           }
        }  
        if (exists == false)
        {
            int ticket1=OrderSend(_Symbol, OP_BUY, NormalizeDouble(Lotaje, 2), Ask, 10, NormalizeDouble(Ask - StopLoss * PipValue * _Point, _Digits), NormalizeDouble(Ask + TakeProfit * PipValue * _Point, _Digits), NULL, MagicNumber, 0, clrGreen);
                  
        }
    }
    Y también, tal como te comenté en otro post, ese código NO FUNCIONARA en una cuenta ECN, ya que en éstas no permiten enviar el SL y el TP junto con la orden, sino que hay que mandarlas con valor 0 y después modificar esa orden para meterselos.

    Saludos y un abrazo.




    Foro de Forex Trading United

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