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
Sí, - ¡supongo que sí! ¡Gracias, TheXpert!
Lo intentaré.
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.
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.