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
Por favor, utilice el botón </> para insertar su código.
Mis disculpas... Aquí está en formato correcto..
OrdersTotal() no es correcto...
Me ha sorprendido que la secuencia de código en bucle que utiliza OrdersTotal() no da resultados correctos (observado con dos brokers diferentes).
Estoy usando MT4 versión 1090 en un escritorio Linux Ubuntu-MATE 16.04, corriendo WINE 3.0
Esto es lo que he estado usando...
Aquí está:
He notado con dos brokers diferentes que el valor de OrdersTotal() no siempre coincide con lo que se muestra en la pestaña 'Trade' del broker de MT4. Inicialmente, pensé que era el broker el que provocaba que OrdersTotal() no funcionara correctamente. Cuando me di cuenta en el segundo broker, empecé a preguntarme si MT4 tenía un 'problema' interno, o si mi código era incorrecto O si se trataba de un problema con la sincronización correcta de MT4 con el servidor....?
Después de leer este hilo del foro, me pregunto si tendría mejores resultados alterando el bucle for..para que diga:
O bien, ¿hay alguna bandera o línea de código que garantice que el OrdersTotal() se sincronice correctamente durante un evento OnTick()?¡Cualquier aclaración con respecto a esto sería muy útil y sería muy apreciado!
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
He revisado este hilo leyendo sobre la selección de órdenes. Efectivamente, tengo un código en el que creo haber hecho las cosas bien pero la selección no me funciona ya que no puedo leer el OpenPrice de laorden seleccionada. Todo lo demás funciona bien, sólo esa parte del código proporcionado. No estoy seguro de por qué.
Todo el código tiene 4 secciones donde necesito llamar al OrderOpenPrice justo después de que la orden sea enviada... OrderSend funciona bien, OrderSelect no me da los resultados que necesito. Refiérase a 1 sección del código si puede ayudar.
Gracias.
Gracias queridoSimon Gniadkowski,
Tu post realmente me ha salvado el tiempo.
Este es el código que sugiero para cerrar las órdenes de mercado
Y sugiero que, esta es la forma correcta si se utiliza un bucle forward for (para cumplir con las reglas FIFO de los brokers de EEUU)
En el bucle forward,
Bucles y cierre o eliminación de órdenes - Foro de programación MQL4
Para FIFO (corredores de EE.UU.,)y usted (potencialmente) procesa múltiples órdenes por símbolo, debe Encontrar la orden más temprana, cerrarla, y en una operación exitosa, reprocesar todas las posiciones restantes.
CerrarOrdenes por Reglas FIFO - Probador de Estrategias - Foro de programación MQL4 - Página 2 #16
¿Qué son los valores de retorno de la función? ¿Cómo los utilizo? - Foro de programación MQL4
Errores comunes en los programas MQL4 y cómo evitarlos - Artículos MQL4
Sabrás lo mucho que me ha ayudado esto. No sólo con el código en el que estaba trabajando, sino con mi comprensión por completo. Ahora funciona perfectamente y tengo la comprensión para implementarlo de diferentes maneras.
Realmente aprecio esta información.