Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 703

 
Zvezdochet:

SÍ. De esto trata exactamente el libro de texto de Sergei Kovalev. Es el que falta mucho en este momento.

No hay ningún libro de texto sobre mql5 como tal en este sitio, no sé de otros. Pero hay muchos artículos, léelos, puede que tengas éxito.

Статьи по MQL5
Статьи по MQL5
  • www.mql5.com
Статьи по программированию на языке MQL5
 

¡Señores programadores!

Por favor, ayúdenme a resolver un problema con el que he estado luchando durante un mes.

Mi TS a veces no cierra las órdenes por alguna razón.

Se ve así:

Las tres primeras órdenes - 44329646, 44330563 y 44337351 se abren y cierran bien.

Y en el cuarto orden, ocurre la tragedia:

y así hasta el infinito...

Es decir, un Asesor Experto abre la orden 44339156 e intenta cerrar la orden 44337351 que él mismo (!!!!) cerró con éxito varias horas antes.

Tienes que cerrarlo manualmente; si no lo haces, a veces sufrirás la más profunda de las depresiones. ¡Qué desastre!

¿Cómo es posible?

El código del Asesor Experto es de lo más sencillo:

здесь - условие открытия сделки
{
         RefreshRates();
         total_orders_NZDUSD=TotalOrders("NZDUSD.I");
         if(total_orders_NZDUSD==0)
         {
         Balance=AccountBalance();
         Lots=NormalizeDouble((Balance/(Ask*10.0))*0.01,2);
         double AskNorm=NormalizeDouble(Ask,Digits);
         ticket_buy_NZDUSD=OrderSend("NZDUSD.I",OP_BUY,0.01,AskNorm,0,0,0);
         }
      }
здесь - условие закрытия сделки
      {
         RefreshRates();
         if(OrderSelect(ticket_buy_NZDUSD, SELECT_BY_TICKET)==true)
         {
         total_orders_NZDUSD=TotalOrders("NZDUSD.I");
         ctm_ticket_buy_NZDUSD=OrderCloseTime();
         order_type_NZDUSD=OrderType();
            if(total_orders_NZDUSD>0)
            {
               if(ctm_ticket_buy_NZDUSD==0)
               {
                  if(order_type_NZDUSD==OP_BUY)
                  {
                  double BidNorm=NormalizeDouble(Bid,Digits);
                  OrderClose(ticket_buy_NZDUSD,0.01,BidNorm,0);
                  }
               }
            }
         }

¿Cómo puede funcionar un mismo programa "una y otra vez"? No entiendo...

 
Alexander_K2:

¡Señores programadores!

Por favor, ayúdenme a resolver un problema con el que estoy luchando desde hace un mes.

Mi TS a veces no cierra las órdenes por alguna razón.

Se ve así:

Las tres primeras órdenes - 44329646, 44330563 y 44337351 se abren y cierran perfectamente.

Y en el cuarto orden, ocurre la tragedia:

y así hasta el infinito...

Es decir, un Asesor Experto abre la orden 44339156 e intenta cerrar la orden 44337351 que él mismo (!!!!) cerró con éxito varias horas antes.

Tienes que cerrarlo manualmente; si no lo haces, a veces sufrirás la más profunda de las depresiones. ¡Qué desastre!

¿Cómo es posible?

El código del Asesor Experto es de lo más sencillo:

¿Cómo puede funcionar un mismo programa "una y otra vez"? No entiendo...

Lea la ayuda de OrderSelect(). En particular, lea la referencia sobre la selección por billete. Incluso una orden cerrada se selecciona por ticket. Ya está cerrado y usted intenta cerrarlo de nuevo.

Si es 0, significa que todavía está en el mercado, ciérrelo, si > 0, significa que ya está cerrado y no hay necesidad de patearlo de nuevo, no volverá a la vida y no se cerrará.

 
Artyom Trishkin:

Lea la ayuda de OrderSelect(). En particular, sobre la selección por billete. Incluso una orden cerrada es seleccionada por el ticket. Ya se ha cerrado, y usted está tratando de cerrarlo de nuevo.

Si está seleccionado, compruebe la hora de cierre - si es 0, significa que todavía está en el mercado - ciérrelo, si > 0, significa que ya ha sido cerrado y no tiene que patearlo de nuevo - no se animará y no se cerrará.

Muchas gracias, lo intentaré.

 
Alexander_K2:

Muchas gracias, lo probaré.

De nada. No tienes que probarlo, tienes que hacerlo...

 
Artyom Trishkin:

Por favor. No tienes que probarlo, tienes que hacerlo...

Artem, he leído la ayuda - todo parece correcto.

ctm_ticket_buy_NZDUSD=OrderCloseTime();
         ...
               if(ctm_ticket_buy_NZDUSD==0)
            ...

Estoy comprobando la hora de cierre.

Lo he leído en MQL4 Reference:

Se recomienda llamar a la función OrderSelect() inmediatamente antes de llamar a los últimos datos del pedido.

Esto también es cierto.

Entonces, ¿qué es lo que está mal?

 
Alexander_K2:

Artem, he leído la ayuda - todo parece correcto.

Estoy comprobando la hora de cierre.

Lo he leído en MQL4 Reference:

Se recomienda llamar a la función OrderSelect() inmediatamente antes de llamar a los últimos datos del pedido.

Esto también es cierto.

Entonces, ¿qué pasa?

¿Qué tipo de función es ésta?

total_orders_NZDUSD=TotalOrders("NZDUSD.I");
Y después de haber trabajado, ¿qué orden se asigna?
 
Alexander_K2:

¡Señores programadores!

Por favor, ayúdenme a resolver un problema con el que he estado luchando durante un mes.

Mi TS a veces no cierra las órdenes por alguna razón.

Se ve así:

Las tres primeras órdenes - 44329646, 44330563 y 44337351 se abren y cierran bien.

Y en el cuarto orden, ocurre la tragedia:

y así hasta el infinito...

Es decir, un Asesor Experto abre la orden 44339156 e intenta cerrar la orden 44337351 que él mismo (!!!!) cerró con éxito varias horas antes.

Tienes que cerrarlo manualmente; si no lo haces, a veces sufrirás la más profunda de las depresiones. ¡Qué desastre!

¿Cómo es posible?

El código del Asesor Experto es de lo más sencillo:

¿Cómo puede funcionar un mismo programa "una y otra vez"? No entiendo...

¿en qué dirección está mirando la matriz de pedidos?

Si hay posibles cierres/supresiones durante la "revisión", es mejor mirar en la dirección opuesta. Desde OrdersTotal()-1 hasta 0 inclusive.

De lo contrario, puede pisarlo :-)


 
Artyom Trishkin:

¿Qué es esta característica?

Esta función me ha sido cedida amablemente por Goldtrader, por lo que le estoy sinceramente agradecido.

//+------------------------------------------------------------------+
//| Calculate Market Orders function                                 |
//+------------------------------------------------------------------+
int TotalOrders(string sy) {    // sy - Currency Pair
int orders=0;
   for (int i=0; i<OrdersTotal(); i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderSymbol()==sy) {
           if (OrderType()==OP_SELL || OrderType()==OP_BUY) {
             orders++;
           }
         }
       }
     }
return(orders);
}

Permite abrir órdenes simultáneamente para diferentes pares de divisas.

:))) En mi opinión, es lo que empezó todo, porque lo habilité hace un mes... Sin ella no puedo ver el Grial.

¿Le pasa algo?

 

Sin embargo, hay algo realmente malo...

Es decir, hagoOrderSelect una vez y luego otra vez desde la función... No tiene sentido...