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

 
Vladimir Karputov:

¿La hora es la misma en la ventana dedatos?

Sí.

 
Andrey Khatimlianskii:

Sí.

Ya veo. Así que realmente es la hora del bar. Sólo tenía una sospecha sobre el parámetro"Línea de tiempo precisa".

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

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. Entiendo que tengo que normalizar la "i", pero no me funciona.

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);
  }
//+------------------------------------------------------------------+

Si "expr2=2.6" sigue bien para 9 iteraciones, pero cuando "expr2=2.8" ya muestra 9 iteraciones mal (el valor correcto es 10).

 
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. Entiendo que tengo que normalizar la "i", pero no me funciona.

Si "expr2=2,6" sigue estando bien para 9 iteraciones, pero cuando "expr2=2,8" ya muestra 9 iteraciones incorrectas (el valor correcto es 10).

Probablemente tenga que normalizar los valores.

 
Alexey Viktorov:

Probablemente haya que normalizar los valores.

Si te refieres a esto, tampoco ha servido de nada:

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:

Si te refieres a esto, tampoco ha servido de nada:

No. Como mínimo hay que optimizarlo

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 eso es lo que te da el valor equivocado. Y puede que los demás no tengan que hacerlo.

 
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. Entiendo que tengo que normalizar la "i", pero no me funciona.

Si "expr2=2,6", entonces todo es normal 9 iteraciones, pero cuando "expr2=2,8" muestra no correcto 9 iteraciones (correctamente 10).

Aquí puedes encontrar, leyendo el post de Nikolay, una descripción muy detallada y muy cualitativa del doblehttps://www.mql5.com/ru/forum/1111/page2623#comment_14473837

Si no puede asimilar el material de la primera vez, intente sustituir Print() por printf() en su código con salida de doble al menos a la 15ª cifrahttps://www.mql5.com/ru/forum/1111/page2623#comment_14474138.

Tal vez entonces vea por qué esto es así

 
Alexey Viktorov:

No. Al menos deberíamos optimizar esto

porque eso es lo que te da el valor equivocado. Y puede que los demás no tengan que hacerlo.

Gracias, pero tu ejemplo tampoco nos ha dado el resultado correcto. En printf puedes ver que no se produce ninguna normalización:

0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.0000000000000000000000000000000000000000000000000000000000
0 10:29:31.595 Test_Double_Para EURCHF,H4: i = 1.1999999999999995591079014993738305473327636718750000
0 10:29:31.595 Test_Double_Para EURCHF,H4: i = 1.399999999999991111182158029987476766109466552734375000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.59999999999999999866773237044981212151491164199829101562500000000
0 10:29:31595 Test_Double_Para EURCHF,H4: i = 1.7999999999999999982236431605997495353221893310546875000000
0 10:29:31.595 Test_Double_Para EURCHF,H4: i = 1.999999999997779553950749686919152736638618359375000000
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.39999999999999991191821580299876766109466552734375000000000
0 10:29:31595 Test_Double_For EURCHF,H4: i = 2.6000000000088817841970012523233890533447265625000000000
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.800000000002664535259100375697016716003417968750000000

 
Igor Makanu:

aquí puedes encontrar, leer el post de Nikolay, él describió el trabajo con el doble de una manera muy detallada y muy cualitativahttps://www.mql5.com/ru/forum/1111/page2623#comment_14473837

Si no puede digerir el material de la primera vez, intente sustituir Print() por printf() con salida de doble al menos a 15º dígitohttps://www.mql5.com/ru/forum/1111/page2623#comment_14474138.

Tal vez entonces vea por qué esto es así.

Gracias, entiendo por qué ocurre, por eso intenté normalizarlo. 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?

 
Nauris Zukas:

Así que la pregunta sigue siendo, "doble" se puede utilizar en el bucle

puede

Nauris Zukas:

y obtener siempre el número correcto de iteraciones?

el valor de double es siempre correcto, pero no se corresponde con el sistema decimal posicional que se quiere ver u obtener

Nauris Zukas:

Gracias, entiendo por qué sucede 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

Cualquier manipulación con la doble conversión siempre tendrá limitaciones, dudo que este problema se pueda resolver de la manera como en tus ejemplos

Hacer una solución fiable: en el bucle utilizar int y la fórmula para calcular el valor resultante de doble y no utilizar la adición de doble como resultado durante las iteraciones en el bucle - una vez más mirar mi ejemplo en el diálogo con Nikolaev