Tomemos un ejemplo más complejo...
Supongamos que tenemos las siguientes órdenes que queremos cerrar, todas tienen el mismo número mágico pero algunas tienen un símbolo diferente al de nuestro EA, queremos que nuestro código cierre las órdenes para el mismo símbolo que nuestro EA, EURUSD:
Posición | Número de Ticket | Símbolo |
---|---|---|
0 | 111 | EURUSD |
1 | 222 | EURUSD |
2 | 333 | GBPUSD |
3 | 444 | EURUSD |
4 | 555 | EURUSD |
1ª pasada por el bucle:
el valor inicial de PositionIndex es TotalNumberOfOrders - 1 que es igual a 5 - 1 = 4, por lo que se selecciona la orden en la posición 4, número de ticket 555, esta orden coincide con el número mágico y el símbolo por lo que se elimina con éxito y el resto de órdenes cambian de posición de la siguiente manera:
Posición | Número de billete | Símbolo |
---|---|---|
0 | 111 | EURUSD |
1 | 222 | EURUSD |
2 | 333 | GBPUSD |
3 | 444 | EURUSD |
Segunda pasada por el bucle:
ahora el valor de PositionIndex es 3 por lo que se selecciona la orden en la posición 3, número de ticket 444, esta orden coincide con el número mágico y el símbolo por lo que se elimina con éxito y el resto de órdenes cambian de posición de lasiguiente manera:
Posición | Número de billete | Símbolo |
---|---|---|
0 | 111 | EURUSD |
1 | 222 | EURUSD |
2 | 333 | GBPUSD |
3ª pasada por el bucle:
ahora el valor de PositionIndex es 2 por lo que se selecciona la orden en la posición 2, número de ticket 333, esta orden coincide con el número mágico pero NO conel símbolo por lo que no se elimina, el resto de órdenes no cambian:
Posición | Número de billete | Símbolo |
---|---|---|
0 | 111 | EURUSD |
1 | 222 | EURUSD |
2 | 333 | GBPUSD |
4ª ejecución del bucle:
ahora el valor de PositionIndex es 1 por lo que se selecciona la orden en la posición 1, número de ticket 222, esta orden coincide con el número mágico y el Símbolo por lo que se elimina con éxito y el resto de órdenes cambian de posición de lasiguiente manera:
Posición | Número de billete | Símbolo |
---|---|---|
0 | 111 | EURUSD |
1 | 333 | GBPUSD |
5ª y última pasada por el bucle:
ahorael valor de PositionIndex es 0 por lo que se selecciona la orden en la posición 0, ticket número 111, esta orden se eliminacon éxito, el valor 0 es el último valor válido para el bucle. . . el bucle ha terminado.
Hemos eliminado con éxito todas las órdenes que coincidían, dejando la única orden que no coincidía con nuestro símbolo, el ticket número 333 ahora en la posición 0. .
Posición | Número de billete | Símbolo |
---|---|---|
0 | 333 | GBPUSD |
Enlace a este hilo: Bucles y cierre o eliminación de órdenes
Gracias Raptor por esta importante explicación.
Y.
Vaya. Toda esa información para cerrar una orden.
Me pregunto cuánta información se necesitaría para obtener más de 50 pips al día, consistentemente, todos los días (en promedio) - sin fallar, a través de las últimas 137 operaciones.
Muéstrame cómo hacer algo así, y lo consideraría información extremadamente útil y Gurú, será tu título, por los siglos de los siglos, Amén.
Vaya. Toda esa información para cerrar una orden.
Me pregunto cuánta información se necesitaría para obtener más de 50 pips al día, consistentemente, todos los días (en promedio) - sin falta, a través de las últimas 137 operaciones.
Me pregunto cuánta información se necesitaría para obtener más de 50 pips al día, de forma consistente, todos los días (en promedio) - sin falta, a través de las últimas 137 operaciones.
Muéstrame cómo hacer algo así, y lo consideraré información extremadamente útil y Gurú, será tu título, por los siglos de los siglos, Amén.
- No secuestrar el hilo con la información fuera de tema
- NO vamos a mostrarte eso porque no has leído las reglas Cualquier discusión excepto la relacionada con MetaQuotes Language 4 y el auto trading está prohibida
Raptor, sé a primera vista de su puesto que u r bastante n experto en mql4.this hilo de nuevo ayuda a aclarar mis dudas! mantener el buen trabajo.tnx
Sólo una idea más:
for(PositionIndex = 0; PositionIndex < OrdersTotal() ; PositionIndex ++) // <-- for loop to loop through all Orders . . COUNT DOWN TO ZERO ! { if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue; // <-- if the OrderSelect fails advance the loop to the next PositionIndex if( OrderMagicNumber() == MagicNo // <-- does the Order's Magic Number match our EA's magic number ? && OrderSymbol() == Symbol() // <-- does the Order's Symbol match the Symbol our EA is working on ? && ( OrderType() == OP_BUY // <-- is the Order a Buy Order ? || OrderType() == OP_SELL ) ) // <-- or is it a Sell Order ? add_trade_to_close_queue( OrderTicket()); // <-- You need to model the queue mechanism ... } // end of For loop
Saludos.
Sólo una idea más:
Saludos.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Este es uno de los errores más comunes que veo, probablemente debido en parte a los gustos de la basura como Expert Advisor Builder. Así que pensé que era hora de un hilo dedicado al tema para que pueda ser vinculado para futuras referencias.
El problema
Pongamos un ejemplo sencillo, queremos una función que cierre todas las órdenes abiertas de nuestro EA, hay muchos ejemplos pero vamos a crear uno desde cero.
Necesitamos un bucle porque queremos cerrar todas nuestras órdenes para un EA específico, dentro de este bucle tendremos código para seleccionar la orden, código para comprobar que es el símbolo y el número mágico correctos y finalmente código para cerrar la orden:
Este código es malo . . . NO LO USES. . . En la siguiente sección explicaré por qué. . .
La explicación
Vamos a trabajar con el código anterior... línea por línea, orden por orden...
Supongamos que tenemos las siguientes órdenes que queremos cerrar, todas tienen el mismo número mágico y el mismo símbolo que nuestro EA, así que queremos que nuestro código las cierre todas:
1ª pasada por el bucle:
el valor inicial de PositionIndex es 0 por lo que se selecciona la orden en la posición 0, número de ticket 111, esta orden se elimina con éxito y el resto de órdenes cambian de posición de la siguiente manera:
Segunda pasada por el bucle:
ahora el valor de PositionIndex es 1 por lo que se selecciona la orden en la posición 1, número de ticket 333, esta orden es eliminada con éxito y el resto de órdenes cambian de posición de lasiguiente manera:
Tercera pasada por el bucle:
ahora el valor de PositionIndex es 2 por lo que se selecciona la orden en la posición 2, número de ticket 555, esta orden se elimina con éxito y el resto de órdenes cambian de posición de la siguiente manera:
4ª ejecución del bucle:
ahorael valor de PositionIndex es 3 OrderSelect() intenta seleccionar la Orden en la posición 3 y falla, el continue lleva la ejecución del código al siguiente valor del bucle .
5ª y última ejecución del bucle:
ahora el valorde PositionIndex es 4 OrderSelect() intenta seleccionarla Orden en la posición 4 y falla, el continue lleva la ejecución del código al siguiente valor del bucle . . el bucle ha terminado.
Ahora nos quedamos con 2 Pedidos, los tickets 222 y 444 que deberían haber sido cerrados pero no lo fueron. . . a continuación, cómo resolver este problema.
La Solución
El siguiente código es el enfoque correcto cuando se cierran órdenes abiertas o se borran órdenes pendientes. . .
La diferencia clave es que el bucle disminuye de ( TotalNumberOfOrders - 1 ) a 0
Una vez más, repasemos el código anterior... línea por línea, orden por orden...
Tenemos los mismos pedidos que antes:
1ª pasada por el bucle:
el valor inicial de PositionIndex es TotalNumberOfOrders - 1 que es igual a 5 - 1 = 4, por lo que se selecciona la orden en la posición 4, número de ticket 555, esta orden se elimina con éxito y el resto de órdenes cambian de posición de la siguiente manera:
Segunda pasada por el bucle:
ahora el valor de PositionIndex es 3 por lo que se selecciona la orden en la posición 3, número de ticket 444, esta orden se elimina con éxito y el resto de órdenes cambian de posición de lasiguiente manera:
Tercera pasada por el bucle:
ahora el valor de PositionIndex es 2 por lo que se selecciona la orden en la posición 2, número de ticket 333, esta orden se elimina con éxito y el resto de órdenes cambian de posición de la siguiente manera:
cuarta pasada por el bucle:
ahora el valor de PositionIndex es 1 por lo que se selecciona la orden en la posición 1, número de ticket 222, esta orden se elimina con éxito y el resto de órdenes cambian de posición de lasiguiente manera:
5ª y última pasada por el bucle:
ahora el valor de PositionIndex es 0 por lo que se selecciona la orden en la posición 0, número de ticket 111, esta orden se elimina con éxito, el valor 0 es el último valor válido para el bucle... el bucle ha terminado.
Hemos eliminado con éxito todas nuestras órdenes coincidentes. . .
Enlace a este hilo: Bucles y cierre o eliminación de órdenes