Funciones útiles de KimIV - página 85

 

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.

Archivos adjuntos:
codz2.mq4  5 kb
 
hope писал(а) >>

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

Archivos adjuntos:
cod3.mq4  6 kb
 

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

 
hope писал(а) >>

Echa un vistazo al código, por favor. Tal vez te equivocaste en algo en la función de llamada de NormalizeLot.

Intenta sustituir

  if ( ro) l=MathCeil( lo* k)/ k; else l=MathFloor( lo* k)/ k;

a

  if ( ro) l=NormalizeDouble(MathCeil( lo* k)/ k,2); else l=NormalizeDouble(MathFloor( lo* k)/ k,2);
 

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.

 
Igor - por favor, mire el "Indicador GAP" aquí