![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
Como resultado, se añadió un recuento de posición personalizado al bloque de cierre, lo que resultó en un cierre "correcto", peroel error 131 sigue apareciendo un par de veces en el registro:
¿Es normal la inserción de un recuento de pedidos en un bucle teniendo en cuenta que ya hay una comprobación de pedidos y
¿Podría corregir el código para evitar el error 131?
Muchas gracias.
¿Podría modificar el código para evitar el error 131?
Muchas gracias.
¿Y quién le normalizará el tamaño del lote después de la división? De ahí el error.
Alex, antes de pasar el lote a la función de cierre, normaliza su tamaño con NormalizeLot().
Gracias Igor, Alexander,
Efectivamente, he comprobado los lotes sustituyendo Lot/3 (Lot/2, Lot) por 0,01 en la función SELLCLOSED_1=OrderClose( OrderTicket(), Lot/3, Ask, 0, Red ); y he evitado el error 131. Podríamos dejarlo así (0,01), pero, en primer lugar, el cierre en forma de lote es más correcto. En segundo lugar, nunca me había encontrado con funciones de usuario y su llamada en el programa, lo que resultó ser bastante interesante. Parece que he adjuntado todo correctamente en el código y todo funciona, pero el error 131 sigue estando. Echa un vistazo al código, por favor. Tal vez me equivoqué en algo en la función de llamada de NormalizeLot.
Disculpas. En el código original, la línea
RefreshRates();
BUYCLOSED_1=OrderClose( OrderTicket(), CloseLot, Bid, 0, Red );
es el LotClose correcto, según la condición.
Lot =OrderLots(); // NÚMERO DE LOTES
LotClose =NormalizeLot(Lot); // el valor del LOTE NORMALIZADO se asigna al LOTE CERRADO
mal al contabilizar........
Echa un vistazo al código, por favor. Tal vez te equivocaste en algo en la función de llamada de NormalizeLot.
Intenta sustituir
a
Buenos días Alexander,
Desgraciadamente, tu consejo no ha servido de nada. He analizado el registro y he encontrado que el error se produce en dos casos, cuando el cierre de una parte de un lote, casi coincide con el cierre de otra parte del lote.
En el caso de que no haya coincidencia en el tiempo, entonces una parte del lote se cierra sin error.
Intenté normalizar los lotes de cierre de compra y los lotes de cierre de venta por separado pero no tuve éxito:
doble
Lote, // Número de lotes en el orden seleccionado
LoteCerrarComprar,
LoteCerrarVender,
............................
Lote =Lotes de pedido();
LoteCerradoCompra =NormalizarLote(Lote);
LoteCerrarVender =NormalizarLote(Lote);
............................
BUYCLOSED_3=OrderClose( OrderTicket(), LotCloseBuy, Bid, 0, Red )
...........................
SELLCLOSED_3=OrderClose( OrderTicket(), LotCloseSell, Ask, 0, Red );
...................
Función de Igor
NormalizarLote.........
¿Tienes alguna idea?
¡Qué oveja soy! Ugh - es asqueroso....
Normalización de los lotes en el bucle de pedido
//--------------------------------------------------------------- 4 --
// Recuento de órdenes
Symb=Symbol(); // Nombre del instrumento financiero.
¡BuyTotal=0; // Número de órdenes de compra
SellTotal=0; // Número de órdenes de venta
for(int i=1; i<=OrdersTotal(); i++) // Bucle de órdenes
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Si lo siguiente
{ // Análisis de órdenes:
if (OrderSymbol()!=Symb)continue; // No es nuestro instrumento financiero
if (OrderType()>1) // Pendiente
{
Alert(" Pending order detected. Expert Advisor not working.");
return; // Exit start()
}
if (OrderType()==OP_BUY)
{
BuyTotal++; // Contador de órdenes de compra
BuyOrdOpPrice=OrderOpenPrice(); // Precio de compra abierto
}
if (OrderType()==OP_SELL)
{
SellTotal++; // Contador de órdenes de venta
SellOrdOpPrice=OrderOpenPrice(); // Precio de venta abierto
}
Ticket=OrderTicket(); // Número de orden seleccionado.
Tip =OrderType(); // Tipo de la orden seleccionada.
Lote =Lotes de pedido();
LoteCerradoCompra =NormalizarLote(Lote);
LotCloseSell =NormalizeLot(Lot);
}
}
¡¡¡.... y he creado un bucle separado para contabilizar las órdenes abiertas, donde he tenido que normalizar los lotes para cerrarlos!!!
//--------------------------------------------------------------- 6 --
// Comprobación de órdenes abiertas
int _GetLastError = 0, _OrdersTotal = OrdersTotal();
int z;
//---- recorre todas las posiciones abiertas
for ( z = _OrdersTotal-1 ; z >=0; z -- )
{
//El bucle para - recorrer todas las órdenes abiertas
//---- si se produce un error durante la selección de la posición, pasa a la siguiente
if ( !OrderSelect( z, SELECT_BY_POS ) )
{
_GetLastError = GetLastError();
Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
continue;
}
//Finalizado
//Enlazando con la divisa y la majica
//---- si la posición está abierta no para el instrumento actual, omitirla
if ( OrderSymbol() != Symbol() ) continue; // ERROR
//Finalizado
//---- si MagicNumber no es igual a Expert_ID, salta esta posición
if ( OrderMagicNumber() != Expert_ID ) continue; // ERROR
//Finished
if (OrderType()==OP_BUY)
{
BuyClot=OrderLots();
}
if (OrderType()==OP_SELL)
{
SellClLot=OrderLots();
}
OpenedLots=OrderLots();
LotCloseBuy =NormalizeLot(OpenedLots); // Número de lotes
LotCloseSell =NormalizeLot(OpenedLots); // Número de lotes
//Comprobar si se abre una posición de compra,
........................................
Gracias Igor, Alexander. Sin la función de normalización de lotes, seguiría en un punto muerto....
Buenas noches,
Y el primer error que se produce:
2009.07.08 21:05:45 TestGenerator: error de datos no coincidentes (límite de volumen 651 en 2009.07.08 19:00 superado)
es crítico o es sólo un error del probador?
Gracias.