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

 
Vladimir Karputov:

O tempo é o mesmo na janela dedados?

Sim.

 
Andrey Khatimlianskii:

Sim.

Estou vendo. Então é realmente a hora do bar. Acabei de ter uma suspeita sobre o parâmetro"Linha do tempo precisa".

Настройки платформы - Начало работы - Справка по MetaTrader 5
Настройки платформы - Начало работы - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая платформа обладает множеством настроек, что позволяет организовать работу в ней так, как это удобно именно вам. Выполните команду " Настройки" меню "Сервис" или нажмите "Ctrl+O". Графики — общая настройка отображения ценовых графиков, а также настройка параметров управления объектами: выделение объектов после их создания, немедленная...
 

Olá!
Qual é a maneira correta de usar o "duplo" no loop "para"? Não parece haver nenhuma proibição de usar "duplo" na ajuda. Entendo que tenho que normalizar o "i", mas isso não funciona para mim.

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

Se "expr2=2,6" ainda estiver ok para 9 iterações, mas quando "expr2=2,8" já estiver mostrando 9 iterações incorretas (o valor correto é 10).

 
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. Entendo que tenho que normalizar o "i", mas isso não funciona para mim.

Se "expr2=2,6" ainda estiver bem para 9 iterações, mas quando "expr2=2,8" já estiver mostrando 9 iterações incorretas (o valor correto é 10).

Provavelmente preciso normalizar os valores.

 
Alexey Viktorov:

Provavelmente, será necessário normalizar os valores.

Se você quis dizer desta forma, também não ajudou:

double expr1=1.0;
double expr2=2.8;
double step=0.2;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int count=0;
   for(i=NormalizeDouble(expr1,1); i<=NormalizeDouble(expr2,1); i+=NormalizeDouble(step,1))
     {
      NormalizeDouble(i,1);
      count++;
      Print(" i: ",DoubleToStr(i,8)," step: ",DoubleToStr(step,8));
     }
   int MaxPass=(int)NormalizeDouble(((expr2-expr1)/step),0)+1;
   Print(" MaxPass: ",MaxPass," count: ",count," i: ",i);
  }
 
Nauris Zukas:

Se você quis dizer desta forma, também não ajudou:

Não. No mínimo, você tem que otimizá-lo

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

porque isso é o que lhe dá o valor errado. E os outros podem não ter que fazê-lo.

 
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. Entendo que tenho que normalizar o "i", mas isso não funciona para mim.

Se "expr2=2,6", então ainda assim 9 iterações, mas quando "expr2=2,8" mostra não corrigir 9 iterações (corretamente 10).

Aqui você pode encontrar, leia o post de Nikolay, descrição muito detalhada e muito qualitativa do duplohttps://www.mql5.com/ru/forum/1111/page2623#comment_14473837

Se você não conseguir assimilar o material desde a primeira vez, tente substituir Print() por printf() em seu código com saída de pelo menos o dobro a 15º dígitohttps://www.mql5.com/ru/forum/1111/page2623#comment_14474138.

Talvez então você veja porque isto é assim

 
Alexey Viktorov:

Não. No mínimo, você tem que otimizar isto

porque isso é o que lhe dá o valor errado. E os outros podem não ter que fazê-lo.

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

0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.0000000000000000000000000000000000000000000000000000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.1999999999999999999999555910790149937383830305473327636636718750000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.399999999999991111182158029987476766109466552734375000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.599999999999999999999866773237044981212121514911641998291015625000000000000
0 10:29:31595 Test_Double_For EURCHF,H4: i = 1.79999999999999999999982236431605997495353221893310546875000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.999999999999999777779553950749686919151527366386186359375000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 2.1999999999999997335464740899624302983283996582031250000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 2.399999999999999999999999119182158029987476766766109466552734375000000000
0 10:29:31595 Test_Double_For EURCHF,H4: i = 2.6000000000000088817841970012523233890533447265625000000000
0 10:29:31595 Test_Double_For EURCHF,H4: MaxPass: 10 count: 9
0 10:29:31.595 Test_Double_For EURCHF,H4: Last i = 2.8000000000000002664535259100375697016716003417968750000000

 
Igor Makanu:

aqui está, leia o post de Nikolay, ele descreveu o trabalho com o dobro de detalhes e com grande qualidadehttps://www.mql5.com/ru/forum/1111/page2623#comment_14473837

Se você não puder digerir o material desde a primeira vez, tente substituir Print() por printtf() com saída de pelo menos o dobro do 15º dígitohttps://www.mql5.com/ru/forum/1111/page2623#comment_14474138.

Talvez então você veja porque isto é assim.

Obrigado, eu entendo porque isso acontece, é por isso que tentei normalizá-lo. 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?

 
Nauris Zukas:

Portanto, a questão permanece, "duplo" pode ser usado no loop

pode

Nauris Zukas:

e obter sempre o número correto de iterações?

o valor do dobro é sempre correto, mas não corresponde ao sistema decimal posicional que você gostaria de ver ou obter

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

Qualquer manipulação com a dupla conversão sempre terá limitações, duvido que este problema possa ser resolvido da maneira como em seus exemplos

Faça uma solução confiável: no loop use int e fórmula para calcular o valor do resultado do dobro e não use a adição do dobro como resultado durante as iterações no loop - mais uma vez veja o meu exemplo no diálogo com Nikolaev

Razão: