Características del lenguaje mql4, sutilezas y técnicas - página 30

 
Nauris Zukas:

Hola!
¿Cuál es la forma correcta de utilizar "double" en el bucle "for"? Parece que no hay ninguna prohibición de utilizar "doble" en la ayuda.

De todos modos, mi conclusión es que no se recomienda "double" en el bucle"for" por la falta de normalización de ExpressionZ después de cada iteración. Esto puede llevar a al menos 2 problemas:
1) Número incorrecto de iteraciones;
2) Resultados erróneos si se utiliza ExpressionZ para calcular en una sentencia.

Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации. могут отсутствовать, однако разделяющие их точки с запятыми (;) опускать нельзя. Если опущено...
 
Nauris Zukas:

Gracias, entiendo por qué pasa esto, por eso intenté normalizar. A mí no me ha funcionado. La opción de Alexey Viktorov tampoco lo arregló, los valores siguen sin normalizarse. Así que la pregunta sigue siendo, ¿se puede usar "doble" en un bucle y obtener siempre el número correcto de iteraciones?

Multiplica por 10 hasta obtener números enteros. Al principio también me costó, ahora incluso convierto el precio a enteros y trabajo con enteros o redondeo a enteros. Tengo menos errores, mejor legibilidad.

En general, como dijo un programador tras recibir los resúmenes de la Bolsa, no entiendo por qué los números de cierta capacidad de dígitos se representan con números reales, en lugar de enteros. Esto no es lógicamente correcto. ))))

 
Valeriy Yastremskiy:

Multiplica por 10 hasta obtener números enteros. Al principio también me costó, pero ahora incluso convierto el precio en un entero y trabajo con enteros o redondeando a enteros. Tengo menos errores, mejor legibilidad.

En general, como dijo un programador tras recibir los resúmenes de la Bolsa, no entiendo por qué los números de cierta capacidad de dígitos se representan con números reales, en lugar de enteros. Esto no es lógicamente correcto. ))))

Gracias, usaré int de la manera antigua y luego dividiré por el doble. ;)

 
Nauris Zukas:

Gracias, pero tu ejemplo tampoco daba el resultado correcto. En printf se puede ver que no se produce ninguna normalización:

Lo siento, debería haberlo comprobado. Y aquí tenemos "quería hacerlo bien, pero resultó ser lo mismo de siempre".

Resultado

2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.0 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.2 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.4 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.6 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.8 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.0 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.2 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.4 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.6 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.8 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       MaxPass: 10 count: 10 i: 3.0

Código correcto

/********************Script program start function*******************/
double expr1=1.0;
double expr2=2.8;
double step=0.2;
double i;
int count=0;
void OnStart()
 {
  for(i=expr1; i<=expr2; i=NormalizeDouble(i+step, 1))
   {
    count++;
    Print(" i: ", DoubleToString(i, 1), " step: ", DoubleToString(step, 1));
   }
  int MaxPass=(int)NormalizeDouble(((expr2-expr1)/step), 0)+1;
  Print(" MaxPass: ", MaxPass, " count: ", count, " i: ", i);
 }/*******************************************************************/
 
Alexey Viktorov:

Código correcto

Ten cuidado de no poner paso=0,04 ;)

 
Andrey Khatimlianskii:

Ten cuidado de no poner paso=0,04 ;)

Esto es sólo un consejo para los que no saben usar el cerebro))).

 
Alexey Viktorov:

Lo siento, debería haberlo comprobado. Es sólo: "Tengo buenas intenciones, pero siempre es lo mismo".

Resultado

Código correcto.

i=NormalizeDouble(i+step, 1)

¡Ah, gracias! No se me ocurrió a mí. Este es el tipo de cosas que nos ayudan a los novatos en programación ;)

 
Estoy buscandométodos para ordenar un array de estructuras. ¿Alguien tiene alguna variante que funcione?
 
Vladimir Pastushak:
Estoy buscandométodos para ordenar un array de estructuras. ¿Alguien tiene alguna variante que funcione?

https://www.mql5.com/ru/forum/170952/page134#comment_11532251

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2019.04.19
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
fxsaber:

https://www.mql5.com/ru/forum/170952/page134#comment_11532251

No funciona...