[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 858

 

Es una pregunta sencilla, pero no se me ocurre nada.

Hay 4 puestos abiertos en un momento determinado. Estoy tratando de cerrar todos ellos de la siguiente manera:

for (int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
        if(OrderType()==OP_BUY)
           OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
        if(OrderType()==OP_SELL)
           OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
      }
  }

Pero no están cerradas todas, sino a través de una. De hecho tienen los siguientes números: 2,4,6,7. Así que la 2ª y 6ª posición están cerradas.

¿Cuál es el truco?

 
usver:

Es una pregunta sencilla, pero no se me ocurre nada.

Hay 4 puestos abiertos en un momento determinado. Estoy tratando de cerrar todos ellos de la siguiente manera:

Pero no están cerradas todas, sino a través de una. De hecho tienen los siguientes números: 2,4,6,7. Así que la 2ª y 6ª posición están cerradas.

¿Cuál es la trampa?


El truco es que después de cerrar la posición, la numeración cambia en el OrderSelect(i,SELECT_BY_POS,MODE_TRADES) y simultáneamente no se pueden cerrar todas

SZY: Me ayudó mucho el fts I. Kim, he cambiado un poco - eliminado los paréntesis de más y metido una línea:

//+------------------------------------------------------------------+
void CloseAllFirstProfit() {
   int i, k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
   k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}
//+------------------------------------------------------------------+
void ClosePosBySelect() {
   if (OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 10, CLR_NONE);
   if (OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 10, CLR_NONE);
}
//+------------------------------------------------------------------+

busca en el foro - encontrarás los originales

 
IgorM:


es que después de cerrar una posición, la numeración cambia en OrderSelect(i,SELECT_BY_POS,MODE_TRADES) y no se pueden cerrar todas simultáneamente

SZY: Me ayudó mucho el fts I. Kim, he cambiado un poco - eliminado los paréntesis de más y metido una línea:

busque en el foro - encontrará el original


Gracias por el consejo y el ejemplo. Lo investigaré.

En el camino haré otra pregunta.

La tarea es la siguiente: necesito determinar qué tipo de orden activada por un stop loss se cerró, y comparar una orden futura cerrada por un stop loss con una anterior (es decir, comparar sus tipos). Tras revisar la documentación, no he podido encontrar nada relacionado con el procesamiento del último evento.

En este punto, implementé esta operación como un cierre de una orden cuando alcanza un límite establecido (Bid-OrderOpenPrice() >=TP*Point). Eso me permitió almacenar en una variable el tipo de la última orden cerrada y compararla con la que se acaba de cerrar ( if(type==OrderType()) ). Todo funciona bien durante las pruebas. Sin embargo, me gustaría ponerlo en práctica utilizando stop-losses.

He intentado seleccionar una orden cerrada del historial utilizando OrderSelect() y el argumento MODE_HISTORY. Como no hay condiciones para cerrar las órdenes, entonces un cambio en la variable OrdersTotal() puede ser considerado como un disparador de un stop loss. Pero me encontré con un problema: no puedo encontrar el número del último pedido cerrado (ya que su número cambia constantemente), o simplemente no he descubierto cómo hacerlo.

La cuestión es: ¿cómo aplicarlo mediante el uso de stop-loss? ¿Tal vez haya formas mucho más fáciles? Bien, si la dirección del pensamiento es correcta, entonces ¿cómo encontramos el último orden cerrado?

 
IgorM:


la numeración se cambia en OrderSelect(i,SELECT_BY_POS,MODE_TRADES) después de cerrar una posición y no se pueden cerrar todas las posiciones simultáneamente

SZS: Me ayudaron mucho las funciones de I. Kim, las cambié un poco: eliminé los paréntesis de más y las puse en una sola línea:

busque en el foro - encontrará el original

Ya has dicho bastante... todo en una pila.
https://docs.mql4.com/ru/trading/OrderSelect
 
usver:

Es una pregunta sencilla, pero no se me ocurre nada.

Hay 4 puestos abiertos en un momento determinado. Estoy tratando de cerrar todos ellos de la siguiente manera:

Pero no están cerradas todas, sino a través de una. De hecho tienen los siguientes números: 2,4,6,7. Así que la 2ª y 6ª posición están cerradas.

¿Cuál es el problema?

¿Se trata de números en orden? ¿O de billetes?

 
abolk:

¿Se trata de números en orden? ¿O de billetes?


Yo mismo ya estoy confundido. Son entradas, pero las he dado para dejar clara la situación. Se cierran uno a uno.
 

¡Hurra, ya lo tengo funcionando!


Víctor muchas gracias, tuve un error, no escribí bien el nombre del indicador.

 
abolk:
Lo que acabas de decir... todo en una pila
https://docs.mql4.com/ru/trading/OrderSelect


Intentar cambiar/eliminar los takeaways o stops en un grupo de órdenes - la tarea es sencilla, pero me he encontrado con que, cuando la selección de órdenes se hacía usando OrderSelect(i,SELECT_BY_POS,MODE_TRADES), la numeración de las órdenes cambiaba justo en el cuerpo del bucle y conseguía modificar una orden ya modificada (sin takeaway) varias veces - error #1, por lo que sugerí que wever tenía un problema similar

Por favor, aconseja - cómo hacer que el indicador se recalcule al cierre de varias barras, por ejemplo: quiero que el indicador se recalcule cada 5 nuevas barras

 
IgorM:


Por favor, aconséjeme - cómo hacer que un indicador se recalcule al cierre de varias barras, por ejemplo: quiero que el indicador se recalcule cada 5 nuevas barras

Sabes de programación.

Se trata de una tarea lógica y no hay que ser muy inteligente para resolverla. Piensa con la cabeza.

Hay diferentes casos. Dónde exactamente se debe reintroducir, en qué TF, cómo se debe producir el reintroducción, etc. Cómo responder a su pregunta.

Anote el tiempo del compás y, después de cinco compases, reajuste este tiempo y anótelo de nuevo. En el momento de la puesta a cero se puede poner una condición para recalcular. La función iTime(NULL,0,0) le ayudará. El resto es todo lógica.

 
IgorM:


Por favor, aconséjeme - cómo hacer que un indicador se recalcule al cierre de varias barras, por ejemplo: quiero que el indicador se recalcule cada 5 nuevas barras


El método no es el más fiable, probablemente, pero servirá sólo para probar la idea (por ejemplo, un borrador).

Utiliza la variable Bars y sigue su evolución. Aumentado por 5, recordado, etc.

Razón de la queja: