Características da linguagem mql4, sutilezas e técnicas - página 30

 
Nauris Zukas:

Olá!
Qual é a maneira correta de usar o "duplo" no loop "para"? Não parece haver nenhuma proibição de usar "duplo" na ajuda.

De qualquer forma, minha conclusão é que "duplo" não é recomendado no loop"para" por falta de normalização do ExpressionZ após cada iteração. Isto pode levar a pelo menos 2 problemas:
1) Número errado de iterações;
2) Resultados errados se você usar ExpressionZ para calcular em uma declaração.

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

Obrigado, eu entendo porque isto acontece, é por isso que tentei normalizar. Não funcionou para mim. A opção de Alexey Viktorov também não a corrigiu, os valores permanecem não normalizados. Então a pergunta permanece, pode "dobrar" ser usado em loop e sempre obter o número correto de iterações?

Multiplicar por 10 até obter números inteiros. No início também tive dificuldades, agora até converto o preço para inteiros e trabalho com inteiros ou arredondamento para inteiros. Eu tenho menos erros, melhor legibilidade.

Em geral, como disse um programador após receber resumos da Bolsa, não entendo porque os números de uma certa capacidade de dígitos são representados por números reais, em vez de números inteiros. Isto não é logicamente correto. ))))

 
Valeriy Yastremskiy:

Multiplicar por 10 até obter números inteiros. No início também tive dificuldades, mas agora até converto o preço para um inteiro e trabalho com inteiros ou arredondamento para inteiros. Eu tenho menos erros, melhor legibilidade.

Em geral, como disse um programador após receber resumos da Bolsa, não entendo porque os números de uma certa capacidade de dígitos são representados por números reais, em vez de números inteiros. Isto não é logicamente correto. ))))

Obrigado, vou usar int da maneira antiga e depois dividir pelo dobro. ;)

 
Nauris Zukas:

Obrigado, mas seu exemplo também não deu o resultado certo. No printf você pode ver que não ocorre nenhuma normalização:

Desculpe, eu deveria ter verificado. E aqui temos "eu queria fazer bem, mas acabou sendo o mesmo de sempre".

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 correto

/********************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 correto

Tenha cuidado para não colocar o passo=0,04 ;)

 
Andrey Khatimlianskii:

Tenha cuidado para não colocar o passo=0,04 ;)

Este é apenas um conselho para aqueles que não sabem como usar o cérebro))))

 
Alexey Viktorov:

Desculpe, eu deveria ter verificado. É que: "Eu queria dizer bem, mas é sempre a mesma coisa".

Resultado

Código correto.

i=NormalizeDouble(i+step, 1)

Ah, obrigado! Eu mesmo não pensei nisso. Esse é exatamente o tipo de coisa que nos ajuda os novatos em programação! ;)

 
Estou procurandométodos para ordenar uma série de estruturas. Alguém tem alguma variante de trabalho?
 
Vladimir Pastushak:
Estou procurandométodos para ordenar uma série de estruturas. Alguém tem alguma variante de trabalho?

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

Não funciona...

Razão: