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

 
Kos Mos:

Así que estoy intentando averiguar en qué estoy fallando, entiendo que es probable que nadie me diga nada de forma gratuita: el capitalismo, joder)). No tengo nada en contra, sólo necesito entender por qué las operaciones se abren en cada vela en la dirección de compra.

No te estaba respondiendo a ti.

Si quieres que tus esquís funcionen, tienes que imprimir al menos los valores de las variables que son importantes cuando se recibe la señal y mirar en el registro para ver qué pasa con ellas.

 

Hay un bucle for(int i=0;i<ArrayRange(arr2,0);i++), por lo que quiero saber cuántas veces se realiza este cálculo ArrayRange(arr2,0): una vez y la máquina recuerda el valor, o cada vez que se ejecuta el bucle se devuelve el valor de la función ArrayRange(arr2,0)? Ejemplo:

1ª opción.

i=0,i<(valor devuelto), incremento, entonces

i<(valor de retorno de nuevo), incremento, entonces

i<(de nuevo devuelve un valor), incrementa de esta manera,

2ª variante.

o bien, devolvemos un valor de este cálculo ArrayRange(arr2,0) una vez, dejamos que devuelva 5 y la máquina recuerda este 5 y obtiene el siguiente resultado

i=0,i<(valor devuelto)i<5, incremento, entonces

i<5, incremento, entonces

i<5, incremento - ¿es así como funciona?

Pregunto por qué: si todo pasa por la primera variante, entonces tiene sentido extraer este valor antes del bucle y almacenarlo en una variable, para que el programa no calcule la función ArrayRange(arr2,0) en cada pasada del bucle.

 
Seric29:

Hay un bucle for(int i=0;i<ArrayRange(arr2,0);i++), por lo que quiero saber cuántas veces se realiza este cálculo ArrayRange(arr2,0): una vez y la máquina recuerda el valor, o cada vez que se ejecuta el bucle se devuelve el valor de la función ArrayRange(arr2,0)? Ejemplo:

1ª opción.

i=0,i<(valor devuelto), incremento, entonces

i<(valor de retorno de nuevo), incremento, entonces

i<(de nuevo devuelve un valor), incrementa de esta manera,

2ª variante.

o bien, devolvemos un valor de este cálculo ArrayRange(arr2,0) una vez, dejamos que devuelva 5 y la máquina recuerda este 5 y obtiene el siguiente resultado

i=0,i<(valor devuelto)i<5, incremento, entonces

i<5, incremento, entonces

i<5, incremento - ¿es así como funciona?

Por qué lo pregunto: si todo ocurre en la primera variante, entonces tiene sentido que antes del bucle se extraiga este valor y se almacene en una variable, para que en cada pasada del bucle el programa no haga la función ArrayRange(arr2,0).

en el caso general - 1er caso.

PS/ Lo segundo es posible sólo para los compiladores "optimizadores", que pueden entender que si no hay ArrayResize dentro de un bucle, entonces ArrayRange:=const ; No estoy seguro de que el compilador de mql escarbe tanto en el código, aunque para sus funciones "nativas" esto es teóricamente posible.

PPS/ El ejemplo de ArrayRange() no es del todo correcto, porque probablemente no habrá una llamada directa a la función, el compilador sólo tiene que reducirlo a la comparación de i con una variable interna del array, porque lo sabe todo sobre arrays.

 
Maxim Kuznetsov:

en el caso general - 1ª variante.

PS/ Lo segundo es posible sólo para los compiladores "optimizadores", que pueden entender que si no hay ArrayResize dentro del bucle, entonces ArrayRange:=const ; no estoy seguro de que el compilador mql ya profundice en el código, aunque para sus funciones "nativas" es teóricamente posible.

PPS/ el ejemplo con ArrayRange() no es del todo correcto, porque probablemente no habrá una llamada directa a la función, el compilador sólo tiene que reducirlo a la comparación de i con la variable interna del array, porque lo sabe todo sobre los arrays.

Tomemos la expresión5+5*5

la primera variante.

i=0,i<(5+5*5), incremento, entonces

i<(5+5*5), incremento, entonces

i<(5+5*5), incrementa de esta manera,

2ª variante.

o, en este caso, el resultado es una única devolución de 5+5*5, que devuelvan 30 y la máquina recuerde este 30-ku, por lo que obtenemos los siguientes resultados

i=0,i<(valor devuelto) i<30, incremento, siguiente (el motor recuerda automáticamente 30 porque no he guardado 30 en algún sitio)

i<30, incremento, entonces

i<30, incremento, ¿es así como funciona?

¿Supongo que será la primera variante? 5+5*5 es una expresión que se evaluará en cada iteración del bucle. Puedes calcular esta expresión antes del bucle y almacenar 30 en una variable y sustituirla en el bucle, y esto será más fácil para el programa, a menos que calcule automáticamente este 30 y lo almacene en su memoria.


Si no hay una llamada a la función, el compilador no puede comprobar la expresión booleana i<5, así que probablemente la primera opción funcione.

 

El resultado de una función(ArrayRange) puede ser modificado dentro de un bucle o función.
Y la expresión constante(5+5*5) será siempre la misma.

Por lo tanto, la función se calculará en cada pasada.
Y el valor de la constante será sustituido en el código por el compilador en tiempo de compilación.

 
Taras Slobodyanik:

El resultado de una función(ArrayRange) puede ser modificado dentro de un bucle o función.
Y la expresión constante(5+5*5) será siempre la misma.

Por lo tanto, la función se calculará en cada pasada.
Y el valor de la constante será sustituido en el código por el compilador en tiempo de compilación.

5+5*5 también es una expresión y necesita ser calculada en cada pasada, ya que para la función se supone que devuelve el mismo resultado, la cuestión es que en cada pasada del bucle el compilador seguirá calculando tanto la función como la expresión 5+5*5. Así que será la primera opción, es decir, el cálculo se realiza en cada pasada del bucle, por lo que tiene sentido contar este valor antes del bucle y almacenarlo en una variable y utilizar la variable como el mismo valor estático para que no se realicen cálculos en cada pasada del bucle, esto en última instancia puede

int k=5+5*5;//k=30

for(int i=0;i<k;i++){}

donde k es siempre 30 o

int k=ArrayRange(arr2,0)//k=5

for(int i=0;i<k;i++){}

donde k siempre es igual a 5.

 
Seric29:

5+5*5 también es una expresión y debería calcularse en cada pasada, ya que para la función se supone que devuelve el mismo resultado, la cuestión es que en cada pasada del bucle el compilador seguirá contando tanto la función como la expresión 5+5*5. Así que será la primera opción, es decir, el cálculo se realiza en cada pasada del bucle, por lo que tiene sentido contar este valor antes del bucle y almacenarlo en una variable y utilizar la variable como el mismo valor estático para que no se realicen cálculos en cada pasada del bucle, finalmente puede

int k=5+5*5;//k=30

for(int i=0;i<k;i++){}

donde k es siempre 30 o

int k=ArrayRange(arr2,0)//k=5

for(int i=0;i<k;i++){}

donde k siempre es igual a 5.

Podría simplemente ampliar el bucle y no crear variables adicionales.

 
Seric29:

5+5*5 también es una expresión y necesita ser calculada en cada pasada, en cuanto a la función se supone que devuelve el mismo resultado, estamos hablando de que en cada pasada del ciclo el compilador seguirá contando tanto la función como la expresión 5+5*5. Así que habrá la primera opción - es decir, el cálculo se hace en cada pasada del ciclo, por lo que tiene sentido contar este valor antes del ciclo y almacenar en una variable y utilizar la variable como el mismo valor estático para que no haya cálculos en cada pasada del ciclo, finalmente mo

El compilador siempre funciona una vez: en el momento de compilar el texto en el código.
(que yo recuerde MT4 ya compila directamente a código también)

5+5*5 - esta es una expresión con constantes, no necesitan ser recalculadas - por lo que sólo se calculará una vez, en tiempo de compilación, y el código contendrá el número 30

5+5*5+i es una expresión con una variable, y ésta se calculará en el código en cada pasada como 30+i

La funciónArrayRange devuelve un valor, pero el compilador no sabe cuál será este valor, por lo que sustituirá la llamada a la función en el código, y en cada pasada (en el código) se llamará a la función
 
Taras Slobodyanik:

El compilador siempre funciona una vez: en el momento de la compilación del texto en el código.
(que yo recuerde MT4 ya compila directamente a código)

5+5*5 es una expresión con constantes, no necesitan ser recalculadas - por lo que sólo se calculará una vez, en tiempo de compilación, y en el código será 30

5+5*5+i es una expresión con una variable, y se calculará en el código en cada pasada como 30+i

La funciónArrayRange devuelve un valor, pero el compilador no sabe cuál será este valor, por lo que sustituirá la llamada a la función en el código, y en cada pasada (en el código) se llamará a la función

Ya veo. Gracias. No es una cuestión seria, por supuesto, pero hay sutilezas.

 
Artyom Trishkin:

Puede simplemente ampliar el bucle y no crear variables adicionales.

en mi caso, hay 2 expresiones matemáticas 1º-ArrayRange(arr2,0) 2º5+5*5 mi objetivo es crear condiciones en las que el compilador trabaje con menos carga

for(int i=0;i<ArrayRange(arr2,0);i++) en este caso se devuelve el valor de comparación en cada pasada

int k=ArrayRange(arr2,0)//k=5 for(int i=0;i<k;i++){}en este caso el valor de comparación se devuelve 1 vez en lugar de 4, pero se crea una variable, sin embargo la carga es menor, sobre todo cuando hablamos de miles o millones.

¿Puedes mostrarnos cómo ampliar un bucle para no tener que crear variables?

Razón de la queja: