Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 887

 
tuner:
hacer void start() y no habrá error
Gracias. El error ha desaparecido, pero la posición sigue sin cerrarse.
 
rapid_minus:
Gracias. El error ha desaparecido, pero la posición sigue sin cerrarse.
No hay suficiente código para saber exactamente la causa
 
tuner:
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;
}
}

 
rapid_minus:


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

 
evillive:

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

 
rapid_minus:

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

 
rapid_minus:

Igor Kim tiene el nuestro como ejemplo:

...

Pero el compilador requiere que se compruebe el valor de retorno de OrderClose

Esto se debe a que en los tiempos en que Igor escribió sus funciones, el compilador no exigía comprobar el valor de retorno, mientras que el compilador actual jura que si no lo hace
 
evillive:

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í?

 
rapid_minus:

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