Pregunta para los entendidos - página 13

 

Sí, - ¡supongo que sí! ¡Gracias, TheXpert!

Lo intentaré.

 
Estimados expertos, por favor ayúdenme a entender la función OrderCloseBy(). Estoy totalmente confundido. Tengo un Asesor Experto, que abre y cierra posiciones por condiciones invertidas. Es decir, las condiciones de APERTURA DE COMPRA y CIERRE DE VENTA son las mismas, así como las de APERTURA DE VENTA y CIERRE DE COMPRA, lo que significa que justo después de salir de una posición al mismo precio, se abre una posición en la dirección opuesta con el mismo tamaño. Así que decidí intentar reemplazar OrderClose() abriendo una posición en la dirección opuesta con doble volumen y luego cerrando órdenes opuestas con OrderCloseBy(). Es decir, se debería haber aplicado el mismo algoritmo pero se habría ahorrado un spread por operación, pero el probador ha mostrado un resultado bastante diferente. No puedo decidir si he escrito mal el código o he entendido mal la idea... Le agradecería mucho que me aclarara...
 
En primer lugar, compruebe con el servicio técnico de su empresa de corretaje si el terminal admite esta función. No todas las casas de bolsa permiten la función OrderCloseBy().
 
En la demo, OrderCloseBy() es compatible.
 

No soy un experto. Tengo esta nota sobre esta función en mi carpeta de "ayuda", además de todo lo "normal" (la he copiado aquí también - no recuerdo en qué rama) -.

Y la función OrderCloseBy se utiliza SOLO para cerrar 2 órdenes simultáneamente, en ese caso se guarda un spread.
Deberíamos recorrer el terminal programáticamente, memorizar todos los números de órdenes abiertas y sus características, seleccionar el número de la orden principal, hacerla coincidir con la orden contraria deseada (de las disponibles) y pegar ese número.


// Es decir, según tengo entendido, con esta función sólo se pueden cerrar dos posiciones de contador, preseleccionadas.

Eso es todo.

 

Sí, bueno...

Por eso se llama así.

 

Permítanme replantear la cuestión de si hay alguna diferencia económica en las dos siguientes posibilidades de inversión de la posición:

1) Cierre la VENTA con 1 lote de volumen utilizando la función OrderClose y luego abra la COMPRA con 1 lote de volumen

2) Mientras la VENTA está abierta en 1 lote, primero abra la COMPRA en 2 lotes y luego cierre la VENTA con la función OrderCloseBy, lo que también dejará una posición abierta de COMPRA en 1 lote.

Según el ejemplo del libro de trabajo, en la variante 2) quedará un pliego.

 
En resumen, se compensará el diferencial 1+1 y el 1 restante será el diferencial de negociación normal.
 
https://book.mql4.com/ru/trading/orderclose - aquí hay una descripción de la función OrderCloseBy(). Intenté hacer lo mismo en la demo - realmente se reduce mucho la dispersión. Pero sigue sin funcionar en Expert Advisor... Estoy tan confundido...
 
Dmirtiy писал(а) >>
https://book.mql4.com/ru/trading/orderclose - aquí puede ver cómo funciona la función OrderCloseBy(). Intenté hacer lo mismo en la demo - realmente tiene menor difusión. Pero sigue sin funcionar en Expert Advisor... Estoy realmente confundido...

Has estado en dos hilos con esta pregunta. Eres curioso.

No hay soluciones sencillas. Con el lanzamiento de MQL5 este problema desaparecerá por completo.

Puedo sugerir un par de procedimientos que utilizo en mis EAs.

//Detectar el estado actual de las órdenes abiertas:

void CheckOrders()
{
int i;
BuyOrder = false;
SellOrder = false;
BuyLots = 0.0;
SellLots = 0.0;

for ( i=0; i < OrdersTotal(); i++)
{
OrderSelect(i, SELECT_BY_POS);
if ( OrderSymbol() == Symbol())
{
if ( OrderType() == OP_BUY )
{
BuyOrder = true;
LastBuyLots = OrderLots();
BuyLots += LastBuyLots; // suma de las posiciones de compra abiertas
BuyTicket = OrderTicket();
}
if ( OrderType() = OP_SELL)
{
SellOrder = true;
ÚltimosLotesVendidos = OrderLots();
SellLots += LastSellLots; // suma de las posiciones de venta abiertas
SellTicket = OrderTicket();
}
}
}
}

//Ordenes de apertura (cierre):

void TradeVariant( int variant )
{
switch( variante )
{
// if (Pattern < 0 && !BuyOrder && !SellOrder && !FridayLastHour) variant = 1;
// señal de venta, no hay ninguna orden abierta y no es la última hora del viernes
// abrir una orden de venta
caso 1:
AbrirOrdenDeVenta(Lotes);
romper;

// si (Patrón < 0 && Orden de compra && !Orden de venta && !Última hora del viernes) variante = 2;
// señal de venta, hay una orden de compra abierta, no hay orden de venta
// no es la última hora del viernes - estamos dando la vuelta
caso 2:
OpenSellOrder(Lots + BuyLots);
romper;

// si (Patrón < 0 && Orden de compra && !Orden de venta && FridayLastHour) variante = 3;
// señal de venta, hay una orden de compra abierta, no hay orden de venta
// es la última hora del viernes - cierre la orden de compra
caso 3:
CerrarPedidosDeCompra();
romper;

// if (Pattern > 0 && !SellOrder && !BuyOrder && !FridayLastHour) variant = 4;
// señal de compra, no hay ninguna orden abierta y no es la última hora del viernes
// abrir una orden de compra
caso 4:
OpenBuyOrder(Lots);
romper;

// if (Pattern > 0 && SellOrder && !BuyOrder && !FridayLastHour) variant = 5;
// señal de compra, hay una orden de venta abierta, no hay orden de compra
// no es la última hora del viernes - estamos dando la vuelta
caso 5:
OpenBuyOrder(Lots + SellLots);
romper;

// if (Pattern > 0 && SellOrder && !BuyOrder && FridayLastHour) variant = 6;
// señal de compra, hay una orden de venta abierta, no hay orden de compra
// es la última hora del viernes - cierre la orden de venta
caso 6:
CerrarOrdenesDeVenta();
romper;

caso 7:
// si (SellOrder && BuyOrder) variante = 7;
// tiene una orden cruzada abierta
si (WaitBeforeTransaction(WaitSeconds) == 1) // pausa entre peticiones
{
si (LastBuyLots <= LastSellLots)
OrderCloseBy( BuyTicket, SellTicket);
si no
OrderCloseBy( SellTicket, BuyTicket);
}
break

// en otras variantes no hacen nada
por defecto:
romper;
}
}

Espero que se las arregle con las variables.

>> Buena suerte.