PDA

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



trader0
19-08-2023 16:30,
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.

robertomar
19-08-2023 18:38,
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:



Print("OrderSelect() error - ", ErrorDescription(GetLastError()));


Por esta:



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.










#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.

tivag
19-08-2023 19:40,
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):



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):



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.




{
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);

}



}

trader0
19-08-2023 20:04,
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):



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):



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);
}
}
}