Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 887
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
hacer void start() y no habrá error
Gracias. El error ha desaparecido, pero la posición sigue sin cerrarse.
No hay suficiente código para decir exactamente cuál es la razón
Extracto:
void CritCloseBuy()
{
if (((Yellow_0-Red_0)<(Yellow_1-Red_1) && ((MA_0<MA_1)&&(MA_1>MA_2)) || ((Yellow_0-Red_0)>(Yellow_1-Red_1)&& ((MB_0<MB_1)&&(MB_1>MB_2))))
while(true)
{
ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);
if (ord_close = false)
{
Comment("El cierre de la posición BAY falló con el error #",GetLastError());//Mensaje del error
break;
}
si no
{
Ord=0;
break;
}
}
Podría ser la razón de la apertura:
void CritOpen()
{
if (///condición de apertura//)
while(true)
{
ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,0,NULL,10011,0,clrNONE); //abrir orden BAY, MAGIC 10011
if(ticket<=0)
{
Comment("La apertura de la posición BAY-10011 falló con el error #",GetLastError());
break;
}
else
{
Comentario("Posición BAY-10011 abierta con el lote 0.1,precio", Ask);
Ord=(Ord+1);
break;
}
}
Extracto:
antes ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);
sería bueno seleccionar la orden usando la función OrderSelect(). No veo el propósito de tal bucle alrededor de la función de cierre...
antes ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);
sería bueno seleccionar la orden usando la función OrderSelect().
Yo tengo el único. Bueno, en realidad fue así al principio. Empecé a buscar la causa utilizando el método del tanteo. No entiendo el sentido del bucle.
Sólo hago trampa por analogía: si abrí con bucle, entonces debería cerrar también...
Igor Kim tiene nuestro ejemplo:
void start() {
ManagePositions();
}
//+----------------------------------------------------------------------------+
//| Cerrar posiciones a precio de mercado|
//| Parámetros:|
//| sym - nombre del instrumento ("" - símbolo actual)|
//| op - operación(-1 - cualquier posición)|
//| mn - MagicNumber(-1 - cualquier magik) |
//+----------------------------------------------------------------------------+
void ClosePositions(string sym="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();
if (sym=="") sym=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sym && (op<0 || OrderType()==op)) {
if (mn<0 || OrderMagicNumber()==mn) {
if (OrderType()==OP_BUY) {
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy);
}
if (OrderType()==OP_SELL) {
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell);
}
}
}
}
}
}
Pero el compilador requiere comprobar el valor de retorno de OrderClose
Igor Kim tiene nuestro ejemplo:
Pero el compilador requiere que se compruebe el valor de retorno de OrderClose
Pues hazlo como en el ejemplo: primero selecciona y luego cierra. El único pedido o un millón de pedidos, no importa, cada uno debe ser seleccionado primero.
La comprobación es muy sencilla if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell)) Print("Error de cierre #", GetLastError());
Igor Kim tiene el nuestro como ejemplo:
...
Pero el compilador requiere que se compruebe el valor de retorno de OrderClose
Así que haga como en el ejemplo: seleccione primero y luego cierre. No importa si hay un solo pedido o un millón de pedidos, cada uno tiene que ser seleccionado primero.
La comprobación es muy sencilla if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell)) Print("Error de cierre #", GetLastError());
¡Hice lo siguiente: si (!OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red))
{
Comment("El cierre de la posición BAY falló con el error #",GetLastError());
break;
}
si no
{
Ord=0;
break;
}
Sigue exigiendo "el valor de retorno debe ser comprobado .
Lo hice así:
ord_close=OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);
if (ord_close = false)
{
Comment("El cierre de la posición BAY ha fallado con el error #",GetLastError()); //Mensaje de error
romper;
}
si no
{
Ord=0;
break;
}
Silenciosa. Pero en ambos casos no cierra la posición
ZS: Creo que hay un error en la definición de las condiciones de cierre y apertura
El post anterior muestra un ejemplo de una condición cercana. ¿Qué podría estar mal ahí?
Es silencioso. Pero en ambos casos no cierra la posición
ZS: Creo que hay un error en la definición de las condiciones de cierre y apertura de posiciones
En el post anterior, hay un ejemplo de una condición cercana. ¿Qué podría estar mal ahí?
Pues si silenciosamente, sin errores, no se cierra, entonces la condición de cierre no es correcta. Tenemos que repensar y reescribir esta misma condición.
Los paréntesis aquí están de alguna manera mal colocados:
if (((Yellow_0-Red_0)<(Yellow_1-Red_1) && ((MA_0<MA_1)&&(MA_1>MA_2))) || ((Yellow_0-Red_0)>(Yellow_1-Red_1) && ((MB_0<MB_1)&&(MB_1>MB_2))))
¿Qué te parece esto?
if (((Yellow_0-Red_0<Yellow_1-Red_1) && (MA_0<MA_1 && MA_1>MA_2)) || ((Yellow_0-Red_0>Yellow_1-Red_1) && (MB_0<MB_1 && MB_1>MB_2)))