Obtener el precio mas alto de las posiciones abiertas

 

Hola amigos. Tengo un pequeño lio a la hora de generar un codigo en MQL5. He creado una función para que me obtenga de todas las posiciones abiertas, el precio de la entrada mas alta. En la funcion he colocado un bucle for, pero no consigo obtener dicho valor. Os paso el codigo por si me podeis echar un cable:

double ordenSup()

  {   

   for(uint i=0;i<totalOp;i++)

     {   

      if((ticket=OrderGetTicket(i))>0)

        {

         openPrice    =OrderGetDouble(ORDER_PRICE_OPEN);

         if(openPrice>=precioSup)

         {

          precioSup=openPrice;

         }

        }

     } 

   return(precioSup);

  }


Decir que las variables totalOp, precioSup y openPrice estan declaradas de manera general. Mi idea es coger el valor de precioSup, es decir la orden mas alta y meterlo en una linea Comment, pero no me funciona. Si me podeis echar una ayudita.... 


Muchas gracias a todos

 
David Gancedo:

Hola amigos. Tengo un pequeño lio a la hora de generar un codigo en MQL5. He creado una función para que me obtenga de todas las posiciones abiertas, el precio de la entrada mas alta. En la funcion he colocado un bucle for, pero no consigo obtener dicho valor. Os paso el codigo por si me podeis echar un cable:


Pues parece que el código está bien, supongo que "ticket" la tendrás declarada también de manera general. Por otro lado, la variable "totalOp", supongo que la actualizas con el número total de ordenes justo antes de llamar a esta función, pero quizá deberías poner que lea el total de ordenes dentro de la función, para garantizar que el dato es el actual.

 
Hola Miquel, gracias por contestar. Efectivamente la variable ticket esta declarada de manera general. En cuanto lo segundo, lo acabo de probar y sigo sin conseguirlo. Asi que toca seguir probrando cosas. jejej. Gracias no obstante.
 

Ok. Bueno, he reescrito la funcion. Ya consigo obtener el precio de apertura de una posición abierta. Pero cuando hay mas de una posicion abierta no se actualiza el valor, se mantiene el primero que coge. Os pongo el codigo. Por favor alguien que me ayude. Seguro que es una tonteria, pero siendo novato en programacion no consigo solucionarlo. 

Este es el codigo. Gracias

void OnTick()
  {
      Comment("El precio de apertura mas alto es: ", MaxValueTrade());  
            
  }
    
double MaxValueTrade()
   {
      double higher=0; 
      
      for(int i=PositionsTotal()-1; i>=0; i--) //mira todas las posiciones
      {
      
         //obtener el valor de la posicion
         double open=PositionGetDouble(POSITION_PRICE_OPEN);
                  
         if(higher<=open)
         {
             higher=open;
         }
      }
       
       return higher;
    }  
 
David Gancedo #:

Ok. Bueno, he reescrito la funcion. Ya consigo obtener el precio de apertura de una posición abierta. Pero cuando hay mas de una posicion abierta no se actualiza el valor, se mantiene el primero que coge. Os pongo el codigo. Por favor alguien que me ayude. Seguro que es una tonteria, pero siendo novato en programacion no consigo solucionarlo. 

Este es el codigo. Gracias

Tienes que usar la función OrdersTotal(), la función PositionsTotal() devuelve un valor diferente.

Después tienes que usar la función OrderSelect(), sino la siguiente función te devolverá siempre el mismo precio. Y en lugar de la función PositionGetDouble() tienes que usar OrderGetDouble()

En cuanto a mejora del código, no es aconsejable poner funciones como OrdersTotal() dentro de un for, es siempre mejor usar una variable que contenga ese valor, sino se ralentiza el código al tener que hacer la lectura repetidas veces..

 
David Gancedo #:

Ok. Bueno, he reescrito la funcion. Ya consigo obtener el precio de apertura de una posición abierta. Pero cuando hay mas de una posicion abierta no se actualiza el valor, se mantiene el primero que coge. Os pongo el codigo. Por favor alguien que me ayude. Seguro que es una tonteria, pero siendo novato en programacion no consigo solucionarlo. 

Este es el codigo. Gracias

Hola David, yo no sé mucho de mql5, solo escribo mql4, pero me parece que en este caso en concreto sería igual

Yo no veo un error, veo que puede faltar precisión a la hora de recorrer las posiciones abiertas.

No sé si es el caso, pero lo que haría es afinar un poco más la puntería con:

int TradesCount(ENUM_ORDER_TYPE type) //con esto devolvemos el número de trades abiertos por tipo, símbolo y número mágico
   if(type <= 1)
     {
      int result = 0;
      int total = PositionsTotal();
      for(int i = 0; i < total; i++)
        {
         if(PositionGetTicket(i) <= 0) continue;
         if(PositionGetInteger(POSITION_MAGIC) != MagicNumber || PositionGetString(POSITION_SYMBOL) != Symbol() || PositionGetInteger(POSITION_TYPE) != type) continue;
         result++;
        }
      return(result);
     }
   else
     {
      int result = 0;
      int total = OrdersTotal();
      for(int i = 0; i < total; i++)
        {
         if(OrderGetTicket(i) <= 0) continue;
         if(OrderGetInteger(ORDER_MAGIC) != MagicNumber || OrderGetString(ORDER_SYMBOL) != Symbol() || OrderGetInteger(ORDER_TYPE) != type) continue;
         result++;
        }
      return(result);
     }
  }

 Y luego, no sé si es que no estoy ententiendo bien algo, pero creo que es:

if(higher >= open)
         {
          higher=open;
         }

No te puedo ayudar mucho más. Quizá no te sirva para nada esta aportación, pero eso es lo que yo haría

 
David Gancedo #:

Ok. Bueno, he reescrito la funcion. Ya consigo obtener el precio de apertura de una posición abierta. Pero cuando hay mas de una posicion abierta no se actualiza el valor, se mantiene el primero que coge. Os pongo el codigo. Por favor alguien que me ayude. Seguro que es una tonteria, pero siendo novato en programacion no consigo solucionarlo. 

Este es el codigo. Gracias

He probado con este código en MQL4 y funciona, para MQL5 solo tienes que hacer los dos cambios indicados:

double MaxValueTrade()
  {
   double higher_price=0;
   double open_price=0;
   
   int norden=0;
   int TotalOp=OrdersTotal();

   for(int i=TotalOp-1; i>=0; i--) 
     {
     
      // llamada para MQL5
      //if((norden=OrderSelect(i))>0)

      // llamada para MQL4
      if((norden=OrderSelect(i,SELECT_BY_POS,MODE_TRADES))>0)
        {

         // llamada para MQL5
         //open_price=OrderGetDouble(POSITION_PRICE_OPEN);

         // llamada para MQL4
         open_price=OrderOpenPrice();

         if(higher_price<=open_price)
           {
            higher_price=open_price;
           }
        }
     }

   return higher_price;

  }
 
David Gancedo:

Hola amigos. Tengo un pequeño lio a la hora de generar un codigo en MQL5. He creado una función para que me obtenga de todas las posiciones abiertas, el precio de la entrada mas alta. En la funcion he colocado un bucle for, pero no consigo obtener dicho valor. Os paso el codigo por si me podeis echar un cable:

double ordenSup()

  {   

   for(uint i=0;i<totalOp;i++)

     {   

      if((ticket=OrderGetTicket(i))>0)

        {

         openPrice    =OrderGetDouble(ORDER_PRICE_OPEN);

         if(openPrice>=precioSup)

         {

          precioSup=openPrice;

         }

        }

     } 

   return(precioSup);

  }


Decir que las variables totalOp, precioSup y openPrice estan declaradas de manera general. Mi idea es coger el valor de precioSup, es decir la orden mas alta y meterlo en una linea Comment, pero no me funciona. Si me podeis echar una ayudita.... 


Muchas gracias a todos

Hola David, 

Te comparto este código. No lo probé pero creo que está bien. 

//+------------------------------------------------------------------+
//|                                                       Prueba.mq5 |
//|                                                Simón Del Vecchio |
//|                    https://www.mql5.com/es/users/simondelvecchio |
//+------------------------------------------------------------------+
#property copyright "Simón Del Vecchio"
#property link      "https://www.mql5.com/es/users/simondelvecchio"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Includes                                                         |
//+------------------------------------------------------------------+
#include <Trade\PositionInfo.mqh>
//+------------------------------------------------------------------+
//| Objetos                                                          |
//+------------------------------------------------------------------+
CPositionInfo Posicion;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   Comment("El precio más alto de las posiciones abiertas es: ", BuscarPrecioMasAlto());
  }

//+------------------------------------------------------------------+
//| Función que retorna el precio más alto de las posiciones abiertas|
//+------------------------------------------------------------------+
double BuscarPrecioMasAlto()
  {
   double PrecioMasAlto = 0;
//Recorremos todas las posiciones
   for(int i = PositionsTotal() - 1; i >= 0; i--)
     {
      //Seleccionamos la posición según el índice
      Posicion.SelectByIndex(i);
      if(Posicion.PriceOpen() > PrecioMasAlto)
         PrecioMasAlto = Posicion.PriceOpen();
     }
   return(PrecioMasAlto);
  }
//+------------------------------------------------------------------+
 
Miquel Cirera Mato #:

He probado con este código en MQL4 y funciona, para MQL5 solo tienes que hacer los dos cambios indicados:

WoW. Muchas gracias Miquel. No he tenido ocasión de probar hacer lo que me comentas. Esta noche en el curro lo haré. Estoy seguro que funcionará. Millón de gracias.
 
Enrique Enguix Vino #:

Hola David, yo no sé mucho de mql5, solo escribo mql4, pero me parece que en este caso en concreto sería igual

Yo no veo un error, veo que puede faltar precisión a la hora de recorrer las posiciones abiertas.

No sé si es el caso, pero lo que haría es afinar un poco más la puntería con:

 Y luego, no sé si es que no estoy ententiendo bien algo, pero creo que es:

No te puedo ayudar mucho más. Quizá no te sirva para nada esta aportación, pero eso es lo que yo haría

Muchas gracias a ti también Enrique. Gracias por todas las molestias. Siempre hay gente dispuesta a ayudar. También probaré tu propuesta por supuesto.
 
Antonio Simon Del Vecchio #:

Hola David, 

Te comparto este código. No lo probé pero creo que está bien. 

Por supuesto a ti también muchas gracias Antonio. Es otra propuesta que probar y de la que aprender. Os "envidio" 🥺🥺. La facultad que lo veis. En fin. Como dije antes lo probaré está noche en el curro. Saludos a todos
Razón de la queja: