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.
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; }
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..
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
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; }
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); } //+------------------------------------------------------------------+
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
Hola David,
Te comparto este código. No lo probé pero creo que está bien.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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