Obtener numero ticket de la posicion con segundo profit mas alto

 

Hola de nuevo. Después de desistir (por el momento) de averiguar el como obtener la operacion con mejor profit en MQL5, estoy escribiendo el codigo en MQL4 y ya lo tengo bastante avanzado, mas de lo que esperaba por ahora. Como es que cambia tanto la programación de un lenguaje a otro? Increible. Bueno, a lo que iba... estoy ahora otra vez encallado con una funcion. Os explico.

Tengo una funcion que me proporciona el numero de ticket de la operacion con mejor profit. Os lo paso para que le echeis un vistazo. Aunque os aviso que al ser novato seguramente este codigo se puede hacer de manera mas limpia y elegante, estoy convencido de ello, pero bajo mi desconocimento es lo que hay por el momento. El codigo que he echo es este:


//Funcion para averiguar el ticket del profit mas alto
int IdMasAlta()
   {
      int id=0;
      int numOrden=0;
      double profit=0;
      double beneficios=-1000000;
      
      //Recorremos todas las ordenes
      for(int i=OrdersTotal()-1; i>=0; i--)
      {
         if((numOrden=OrderSelect(i,SELECT_BY_POS,MODE_TRADES))>0)
            {
               if(OrderType()==OP_SELL)
                  {
                     profit=OrderProfit();
                     
                     if(beneficios<profit)
                        {
                           beneficios=profit;
                           id=OrderTicket();
                        }
                  }
            }
      }
      return id;
   }

Esta función me funciona perfectamente, me proporciona lo que necesito.


Ahora bien, el problema es que ahora necesito saber el ticket de la operacion con el segundo profit mas alto, pero no consigo que funcione. Le he dado otras mil vueltas, pero nada de nada. Básicamente supongo que seria averiguar el profit mas alto, y recorrer de nuevo todas las ordenes sin mirar ésta, para obtener el segundo profit mas alto, pero he probado de todo, y no se dónde colocar y cómo el segundo bucle for. Lo he puesto dentro del primero, fuera del primero, con un if dentro del for, con un if fuera del for....Os paso el codigo de esta segunda funcion para ver si me podeis echar una mano.


//Funcion para saber el ticket de la 2ª operacion con mejor profit
int Id_Dos()
   {
      int id_1=0;
      int id_2=0;
      int numOrden=0;
      double profit=0;
      //double profit=0;
      double beneficios=-1000000;
      
      //Recorremos todas las ordenes
      for(int i=OrdersTotal()-1; i>=0; i--)
         {
            if((numOrden=OrderSelect(i,SELECT_BY_POS,MODE_TRADES))>0)
               {
                  if(OrderType()==OP_SELL)
                     {  
                        profit=OrderProfit();
                        if(beneficios<profit)
                         {
                           beneficios=profit;
                           id_1=OrderTicket();
                         }
                     }
               }
         }
      for(int i2=OrdersTotal()-1; i2>=0; i2--)
         {
            if((numOrden=OrderSelect(i2,SELECT_BY_POS,MODE_TRADES))>0)
               {
                  if(OrderTicket()!=id_1)
                  {
                     if(OrderType()==OP_SELL)
                     {  
                        profit=OrderProfit();
                        if(beneficios<profit)
                         {
                           beneficios=profit;
                           id_2=OrderTicket();
                         }
                     }
                  }
               }
         }
       
      return id_2;
   }


Si alguien puede echarme un cablecillo.... se lo agradecería eternamente. Un saludo a todos

 

Bueno, pues mientras esperaba que alguien me ayudara, he seguido probando, y lo he conseguido. Que puñetera es la programación, no termino de pensar como un programador, tengo tanto que aprender....

en fin, lo que decía, lo he conseguido, solo me faltaba crear un par de variables, jeje, y usarlas en el segundo bloque for, ya que antes repetia las mismas, pero ahora ya funciona. Os paso el código por si os sirve de algo. Vuelvo a repetir que seguramente se puede hacer mas limpio, pero de momento me conformo con que funcione.


int Id_Dos()
   {
      int id_1=0;
      int id_2=0;
      int numOrden=0;
      double profit1=0;
      double profit2=0;
      double beneficios1=-1000000;
      double beneficios2=-1000000;
      
      //Recorremos todas las ordenes
      for(int i=OrdersTotal()-1; i>=0; i--)
         {
            if((numOrden=OrderSelect(i,SELECT_BY_POS,MODE_TRADES))>0)
               {
                  if(OrderType()==OP_SELL)
                     {  
                        profit1=OrderProfit();
                        if(beneficios1<profit1)
                         {
                           beneficios1=profit1;
                           id_1=OrderTicket();
                         }
                     }
               }
         }
      for(int j=OrdersTotal()-1; j>=0; j--)
         {
            if((numOrden=OrderSelect(j,SELECT_BY_POS,MODE_TRADES))>0)
               {
                  if(OrderTicket()!=id_1 && OrderType()==OP_SELL)
                     {
                        profit2=OrderProfit();
                        if(beneficios2<profit2)
                           {
                              beneficios2=profit2;
                              id_2=OrderTicket();
                           }
                     }
               }
         }
             
      return id_2;
   }
 
David Gancedo #:

Bueno, pues mientras esperaba que alguien me ayudara, he seguido probando, y lo he conseguido. Que puñetera es la programación, no termino de pensar como un programador, tengo tanto que aprender....

en fin, lo que decía, lo he conseguido, solo me faltaba crear un par de variables, jeje, y usarlas en el segundo bloque for, ya que antes repetia las mismas, pero ahora ya funciona. Os paso el código por si os sirve de algo. Vuelvo a repetir que seguramente se puede hacer mas limpio, pero de momento me conformo con que funcione.


Hola, Prueba este, quizas te ahorre recursos,
Es un codigo que hice directamente aqui, no en el editor de mql4, por lo que quizas tenga errores.
la idea es que, en un solo "for" resuelvas. Quizas me equivoque y no tenga validez, por lo que, pido disculpas anticipadas

Saludos!!!

      int id_1=0;
      int id_2=0;
      double profit1=0;
      double profit2=0;
      double beneficios1=-1000000;
      double beneficios2=-1000000;
//Recorremos todas las ordenes
      for(int i=OrdersTotal()-1; i>=0; i--)
         {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               {
                  if(OrderType()==OP_SELL) // porque estas probando solo con ventas?
                     {  
                        if(OrderProfit()>beneficios1)
                        {
                            if(beneficios1 > beneficios2)
                                {
                                 beneficios2=beneficios1;
                                 id_2=id_1;
                                }
                            beneficios1=OrderProfit();
                            id_1=OrderTicket();                           
                        }
                        else if (OrderProfit()>beneficios2)
                        {
                            beneficios2=OrderProfit();
                            id_2=OrderTicket();                                            
                        }

                     }
               }
         }


      return id_2;
 

Hola Miguel. Gracias por tu aportación. Decir que la funcion que has puesto funciona correctamente. Es mas limpio, corto y depurado que el mío. Aunque eso no era dificil conseguir, jejeje. Muchas gracias compañero. por supuesto que sustituire uno por otro.


PD. El motivo de estar probando solo con ventas es porque en este caso solo me interesa saber el ticket de las posiciones en corto. Porque el sistema, de momento, es asi. Gracias de nuevo.

 
David Gancedo #:

Hola Miguel. Gracias por tu aportación. Decir que la funcion que has puesto funciona correctamente. Es mas limpio, corto y depurado que el mío. Aunque eso no era dificil conseguir, jejeje. Muchas gracias compañero. por supuesto que sustituire uno por otro.


PD. El motivo de estar probando solo con ventas es porque en este caso solo me interesa saber el ticket de las posiciones en corto. Porque el sistema, de momento, es asi. Gracias de nuevo.

Yo creo que la forma más sencilla sería asignar un nombre al valor más alto (MaxProfit), y después buscar el valor más alto menor que 'MaxProfit'.