Merkmale der Sprache mql4, Feinheiten und Techniken - Seite 29

 
Vladimir Karputov:

Ist die Uhrzeit imDatenfenster dieselbe?

Ja.

 
Andrey Khatimlianskii:

Ja.

Verstehe, es ist also wirklich Zeit für die Bar. Ich hatte nur einen Verdacht bezüglich des Parameters"Präzise Zeitleiste".

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

Hallo!
Wie verwendet man "double" in der "for"-Schleife richtig? Es scheint kein Verbot zu geben, in der Hilfe "double" zu verwenden. Ich verstehe, dass ich das "i" normalisieren muss, aber das funktioniert bei mir nicht.

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

Wenn "expr2=2.6" für 9 Iterationen noch in Ordnung ist, aber wenn "expr2=2.8" bereits 9 falsche Iterationen anzeigt (der richtige Wert ist 10).

 
Nauris Zukas:

Hallo!
Wie kann man "double" in der "for"-Schleife richtig verwenden? Es scheint kein Verbot zu geben, in der Hilfe "double" zu verwenden. Ich verstehe, dass ich das "i" normalisieren muss, aber das funktioniert bei mir nicht.

Wenn "expr2=2.6" ist noch in Ordnung für 9 Iterationen, aber wenn "expr2=2.8" zeigt bereits falsch 9 Iterationen (der richtige Wert ist 10).

Wahrscheinlich muss ich die Werte normalisieren.

 
Alexey Viktorov:

Wahrscheinlich müssen die Werte normalisiert werden.

Wenn Sie das so gemeint haben, hat es auch nicht geholfen:

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:

Wenn Sie das so gemeint haben, hat es auch nicht geholfen:

Nein. Zumindest müssen Sie es optimieren.

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);

denn dadurch erhalten Sie den falschen Wert. Und die anderen müssen das vielleicht nicht.

 
Nauris Zukas:

Hallo!
Wie verwendet man "double" in der "for"-Schleife richtig? Es scheint kein Verbot zu geben, in der Hilfe "double" zu verwenden. Ich verstehe, dass ich das "i" normalisieren muss, aber das funktioniert bei mir nicht.

Wenn "expr2=2.6", dann ist alles normal 9 Iterationen, aber wenn "expr2=2.8" zeigt nicht korrekt 9 Iterationen (richtig 10).

Hier finden Sie, lesen Sie Nikolay's Post, sehr detaillierte und sehr qualitative Beschreibung der doppeltenhttps://www.mql5.com/ru/forum/1111/page2623#comment_14473837

Wenn Sie den Stoff nicht gleich beim ersten Mal verinnerlichen können, versuchen Sie, Print() durch printf() in Ihrem Code zu ersetzen, wobei Sie double mindestens bis zur 15-ten Stelle ausgebenhttps://www.mql5.com/ru/forum/1111/page2623#comment_14474138.

Vielleicht verstehen Sie dann, warum das so ist

 
Alexey Viktorov:

Nein. Zumindest müssen Sie dies optimieren

denn dadurch erhalten Sie den falschen Wert. Und die anderen müssen das vielleicht nicht.

Danke, aber auch Ihr Beispiel hat uns nicht das richtige Ergebnis geliefert. In printf kann man sehen, dass keine Normalisierung stattfindet:

0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.0000000000000000000000000000000000000000000000000000000000000000000000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.1999999999999999995559107901499373838305473327636718750000
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.5999999999999999999866773237044981212151491164199829101562500000000
0 10:29:31595 Test_Double_For EURCHF,H4: i = 1.7999999999999999982236431605997495353221893310546875000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.9999999999999997779553950749686919152736638618359375000000
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.39999999999999999999119182158029987476766109466552734375000000000
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: Letzter i = 2.8000000000000002664535259100375697016716003417968750000000

 
Igor Makanu:

hier finden Sie Nikolays Beitrag, in dem er die Arbeit mit Double sehr detailliert und qualitativ hochwertig beschreibthttps://www.mql5.com/ru/forum/1111/page2623#comment_14473837

Wenn Sie den Stoff nicht gleich beim ersten Mal verdauen können, versuchen Sie, Print() durch printf() mit der Ausgabe von double mindestens bis zur 15-ten Stelle zu ersetzenhttps://www.mql5.com/ru/forum/1111/page2623#comment_14474138.

Vielleicht wird Ihnen dann klar, warum das so ist.

Danke, ich verstehe, warum das passiert, deshalb habe ich versucht, es zu normalisieren. Bei mir hat es nicht funktioniert. Die Option von Alexey Viktorov hat das Problem auch nicht behoben, die Werte bleiben nicht normalisiert. Es bleibt also die Frage, ob "double" in einer Schleife verwendet werden kann und immer die richtige Anzahl von Iterationen erhält.

 
Nauris Zukas:

Es bleibt also die Frage, ob "double" in der Schleife verwendet werden kann

kann

Nauris Zukas:

und immer die richtige Anzahl von Iterationen erhalten?

der Wert von double ist immer korrekt, aber er entspricht nicht dem Positionsdezimalsystem, das Sie gerne sehen oder bekommen würden

Nauris Zukas:

Danke, ich verstehe, warum das passiert, deshalb habe ich versucht, es zu normalisieren. Bei mir hat es nicht funktioniert. Die Option von Alexey Viktorov hat das Problem auch nicht behoben, die Werte bleiben nicht normalisiert

Jede Manipulation mit der doppelten Konvertierung wird immer Grenzen haben, ich bezweifle, dass dieses Problem so gelöst werden kann wie in Ihren Beispielen

Machen Sie eine zuverlässige Lösung: Verwenden Sie int in der Schleife und die Formel, um den Ergebniswert von double zu berechnen und verwenden Sie nicht die Addition von double als Ergebnis, wenn Sie in der Schleife iterieren - sehen Sie sich noch einmal mein Beispiel im Dialog mit Nikolaev an