Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 495

 

En el primer caso se resuelve - poner entre paréntesis para dos comparaciones y no jura - había un error lógico - es decir, los resultados de la comparación podría ser sustituido por el "o"?

Queda una pregunta abierta con la segunda expresión, ¿qué es lo que falla ahí, alguna idea?

 
-Aleks-:

El primer caso está resuelto - poner entre paréntesis dos comparaciones y no jura - ¿había un error lógico - es decir, los resultados de la comparación podrían ser reemplazados por "o"?

Queda una pregunta abierta en relación con la segunda expresión: ¿qué es lo que falla ahí?

Recuerde que la comprobación de una condición en el nuevo mql4 no se realiza completamente. Es decir, en la condición

if(Low[X]>PriceBuy && High[X]>PriceBuy ||
               Low[X]<PriceBuy && High[X]<PriceBuy)

Si Low[x] no es mayor que PriceBuy, no se realizará ninguna otra comprobación. Esto es lo que nos dice la descripción del error. En consecuencia, si el primer par está entre corchetes, el segundo par de condiciones se comprobará si falla.

Segunda pregunta.

for(calc_day;calc_day>0; calc_day--)

¿A qué equivale calc_day? ¿Puede ser inferior a cero? El compilador no sabe qué hay en la lógica... Por eso advierte de un posible bucle ineficaz.

 
Alexey Viktorov:

Recuerde que la comprobación de condiciones en el nuevo mql4 no se realiza completamente. Es decir, en la condición

if(Low[X]>PriceBuy && High[X]>PriceBuy ||
               Low[X]<PriceBuy && High[X]<PriceBuy)

Si Low[x] no es mayor que PriceBuy, no se realizará ninguna otra comprobación. Esto es lo que nos dice la descripción del error. En consecuencia, si el primer par está entre corchetes, el segundo par de condiciones se comprobará si falla.

Gracias por la respuesta.

Sorprendido - como visualmente la lógica siempre ha funcionado correctamente, hmmm...


Alexey Viktorov:

Segunda pregunta.

for(calc_day;calc_day>0; calc_day--)

¿A qué equivale calc_day? ¿Puede ser inferior a cero? El compilador no sabe qué hay en la lógica... Por eso advierte de un posible bucle ineficaz.

El número calc_day es siempre mayor que 0. Otros valores no llaman al código.
 
-Aleks-:

Gracias por la respuesta.

Sorprendido - como visualmente la lógica siempre ha funcionado correctamente, hmmm...

Antes de las builds 6** era así, comprobaba toda la cadena de condiciones y todo funcionaba, pero ahora todo ha cambiado. Y en las construcciones antiguas en este caso la condición es ambigua. ¿Cómo está diseñado?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

¿O no?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Un cerebro humano puede resolverlo, pero ¿qué puede hacer un compilador? No tiene cerebro.

-Aleks-:

El número calc_day es siempre mayor que 0. Otros valores no hacen que se llame al código.

Díselo al compilador...

 
Alexey Viktorov:

Hasta la build 6** era así, se comprobaba toda la cadena de condiciones y todo funcionaba, pero ahora todo ha cambiado. Y en las construcciones antiguas la condición es ambigua también en este caso. ¿Cómo está diseñado?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

¿o es eso?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Un cerebro humano puede resolverlo, pero ¿qué puede hacer un compilador? No tiene cerebro...


Díselo al compilador...

Convenciendo - Estaré más atento.

¿Cómo se lo digo al compilador? Escríbelo, pero ¿lo entenderá?

if (calc_day<0)  calc_day=calc_day*(-1);

 
Alexey Viktorov:

Así era antes de las builds 6**, se comprobaba toda la cadena de condiciones y todo funcionaba, pero ahora todo ha cambiado. Sí y en las construcciones antiguas en este caso condicionan la ambigüedad. ¿Cómo está diseñado?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

¿o sí?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Un cerebro humano puede resolverlo, pero ¿qué puede hacer un compilador? No tiene cerebro...


Díselo al compilador...

compruebe la precedencia de los operadores para detectar un posible error; utilice paréntesis para aclarar la precedencia - esto no es un error. Es una advertencia. Aparece en los códigos antiguos.

Lo añadieron para el usuario y no para el compilador. El compilador se guía por las prioridades de operación. Allí todo está claro. La prioridad de && es mayor que la de ||. Por eso los paréntesis deben estar dispuestos de esta manera

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

Actualización: En este caso tanto para MT4 como para MT5 la prioridad es la misma.

 
-Aleks-:

Convenciendo - Estaré más atento.

¿Cómo se lo digo al compilador? Escríbelo, pero ¿lo entenderá?

if (calc_day<0)  calc_day=calc_day*(-1);

for( calc_day = 365; calc_day > 0; calc_day --)
Así que pruébalo.
 
Alexey Kozitsyn:

compruebe la precedencia de los operadores para detectar un posible error; utilice paréntesis para aclarar la precedencia - esto no es un error. Es una advertencia. Aparece en los códigos antiguos.

Lo hemos añadido para el usuario y no para el compilador. El compilador se guía por las prioridades de operación. Allí todo está claro. La prioridad de && es mayor que la de ||. Por eso los paréntesis deben estar dispuestos de esta manera

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

Actualización: En este caso tanto para MT4 como para MT5 la prioridad es la misma.

Pues en esencia sí, el aviso no es un error. Pero, ¿cómo funcionará la variante inicial if( Low[X]>PriceBuy && High[X]>PriceBuy || Low[X]<PriceBuy && High[X]<PriceBuy )? ¿O es una chapuza poner un par de corchetes?

 
-Aleks-:

Convenciendo - Estaré más atento.

¿Cómo se lo digo al compilador? Escríbelo, pero ¿lo entenderá?

if (calc_day<0)  calc_day=calc_day*(-1);

for(int i=calc_day; i>0; i--) {}
 
Alexey Viktorov:

Bueno, en esencia, sí, el aviso no es un error. Pero, ¿cómo funciona el if( Low[X]>PriceBuy && High[X]>PriceBuy || Low[X]<PriceBuy && High[X]<PriceBuy ) inicial?¿O fallará al poner un par de corchetes?

Funcionará de la manera que escribí arriba.

El compilador advierte al usuario que no sea perezoso y ponga paréntesis para evitar posibles errores no evidentes.