Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1688

 
Vale, hombres de ciencia, entonces explicad por qué el incremento mágico se detiene en 2 mientras que el único no lo hace. En el código fuente abrimos 10 pedidos y a cada uno de ellos se le debe asignar una magia única a través de un incremento inique y su unicidad debe ser comprobada mediante la comparación (!=) en bucles anidados: en un incremento de la magia hay una pasada con la comparación de todas las magias de los pedidos, si no hay coincidencia, entonces la única será igual al número de esas mezclas y si es igual o mayor que el número de pedidos entonces la magia es única y será asignada al pedido.

No sé si esto es demasiado complicado, pero creo que es más fácil de entender si miramos el código.
Archivos adjuntos:
 
pribludilsa #:
La cosa es que el formulario es conveniente en el sentido de que al darle un número de elementos, puede llenar algún array. Todo se bloqueará si se introduce 0, porque el ArrayResize está ligado al número de posiciones. Por esta razón tengo una condición adicional si el número de posiciones es superior a 0, entonces este bucle. Yo también me lío con eso siempre, ahora lo he vuelto a comprobar. El consejo es correcto, porque si no el formulario no llenará el elemento cero del array, que es para lo que sirve el formulario.

Sí, tengo problemas constantes por esto. Espero que esta claridad reduzca el número de horas dedicadas a corregir errores.

 
Nerd Trader #:
Vale, hombres de ciencia, explicad entonces por qué el incremento mágico se detiene en 2 mientras que el único no lo hace. En el código fuente abrimos 10 órdenes y a cada una de ellas se le debe asignar una magia única a través del incremento inique, su unicidad se comprueba mediante la comparación (!=) en bucles anidados: en una magia de incremento hay una pasada con la comparación de todas las magias de las órdenes, si no hay coincidencia, entonces la única será igual al número de las no coincidentes y si es igual al número de órdenes entonces la magia es única y se asignará a una orden.

No sé si es muy complicado, pero creo que es más fácil de entender si miramos el código.

Si necesitas el bucle para crear 10 pedidos con diferentes magos, eso es lo que debes hacer.

    for(int i = 0; i < 10; i ++)
    { 
    int order_send = OrderSend(Symbol(), OP_BUY, 0.01, Bid, 10,
    0, 0, "", i, 0, CLR_NONE);
    if(order_send == -1) ResetLastError();
    }

En este caso i tiene el papel no sólo de controlar el bucle, sino también de mago de la orden.


Pero en tu ejemplo, hay muchos errores que han creado una especie de rompecabezas. Pocas personas investigan a fondo cuál es el motivo...

Bueno, como mínimo, el bucle de orden está mal... Y la variable mágica es local y se reinicia todo el tiempo... (no se acumula)

 
Nikolay Ivanov #:

Si necesitas el bucle para crear 10 pedidos con diferentes magos, eso es lo que debes hacer.

En este caso i tiene el papel no sólo de controlar el bucle, sino también de mago de la orden.


Pero en tu ejemplo, hay muchos errores que han creado una especie de rompecabezas. Pocas personas investigan a fondo cuál es el motivo...

Bueno, como mínimo, el bucle de orden no es correcto... Y la variable mágica es local y se reinicia todo el tiempo... (no se acumula)

Este código es para la prueba y el EA no creará órdenes en dicho bucle; hay cierta lógica que no debe incluirse en las pruebas. ¿Por qué está mal el ciclo de pedidos? La magia debería eliminarse, no hay razón para que se acumule. Y no hay nada que entender aquí, sólo hay dos bucles anidados con un par de líneas de código dentro.

 
Nerd Trader #:

Sí, tengo problemas constantes por esto. Espero que esta claridad reduzca el número de horas dedicadas a corregir errores.

A mí también me costó un poco entenderlo. Lo irónico es que empecé a descubrirlo al mismo tiempo que otros usuarios publicaban lo mismo aquí. Sólo tenía el copy-paste correcto, luego lo ordené y lo escribí mal, porque sólo comprobé la entrada del bucle y me olvidé de la salida. Compruebe el código con la impresora forzando los valores de comprobación.
 
Nerd Trader #:

Este código es para pruebas, el EA no creará órdenes en un bucle de este tipo, hay una lógica para esto que no debemos añadir a las pruebas. ¿Por qué está mal el bucle de orden? La magia debería restablecerse, no hay razón para que se acumule.

No hay -1.

for(int i = OrdersTotal()-1; i >= 0 ; i --)

Si la magia está diseñada así, resulta que hay un error en la lógica (en el diseño general) y tenemos que resolver un rompecabezas para encontrarlo...

 
Nikolay Ivanov #:

no -1

Si la magia está diseñada así, entonces hay un error en la lógica (en el diseño general), hay que resolver el puzzle para encontrarlo...

A menos que sea esto. Pero el -1 tampoco resuelve nada ahí. ¿Por qué hay un error? La magia se dará cuando la magia sea igual o mayor que el número de órdenes. Si la magia debe ser cero, de lo contrario si cerramos varias órdenes con magia 5 y 6, las nuevas serán más altas que la magia de la última orden, es decir, 11-12 y así sucesivamente. Y de esta manera cuando una orden se pone a cero, se compara e itera desde cero, lo que da lugar a nuevas órdenes con majicks de cerrados, es decir, 5 y 6...

 
pribludilsa #:
A mí también me costó mucho tiempo entenderlo. Lo irónico es que empecé a descubrirlo al mismo tiempo que los posts de otros usuarios sobre lo mismo aquí. Sólo tenía el copy-paste correcto, luego lo ordené y lo escribí mal, porque sólo comprobé la entrada del bucle y me olvidé de la salida. Compruebe el código con una impresora, forzando los valores de comprobación.
Es muy molesto que mql4 no tenga un depurador decente. Incluso en los datos reales de la fuente anterior, el depurador no entra en el bucle. Me tengo que conformar con la impresión, pero no es grave.
 

Básicamente es simple, su único resume todas las órdenes desiguales entre los diferentes magos...

Por ejemplo, hay 3 órdenes

La primera iteración de magic=1 unique=0, al final de la iteración unique será=2.

La segunda iteración magik=2unique=2, al final de la iteraciónunique será=3

Como 3>=número de todos los pedidos, el bucle while se romperá... Y la magia =3 nunca se comprobó... Así que magia =2 de nuevo y así con todo...

 
pribludilsa #:
Ah, sí, gracias. Pero resulta que es una muleta. Al igual que el tema de la mql .

Aspirar amás: TODOS los lenguajes de programación.

Es sencillo: en los lenguajes de programación, la cuenta empieza en cero. La primera celda de un array tendrá un índice 0. Por lo tanto, hay que hacer un bucle inverso ANTES del cero INCLUYÉNDOLO. Es decir, >=0

OrdersTotal() da como resultado, por ejemplo, 10. Y empiezas un bucle desde 10, mientras que el último índice del array es 9 (¿recuerdas que empezamos desde cero?). ¿Y qué ocurrirá cuando se acceda a una celda de un array inexistente? Así es - el programa se bloqueará por un error crítico, porque has entrado en una zona de memoria no asignada, más allá de los límites del array.

Son muletas sólidas sin duda. Lee, aprende y todo llegará a ti.