Merkmale der Sprache mql4, Feinheiten und Techniken - Seite 30

 
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.

Wie auch immer, meine Schlussfolgerung ist, dass "double" in der"for"-Schleife wegen der fehlenden Normalisierung von ExpressionZ nach jeder Iteration nicht empfohlen wird. Dies kann zu mindestens 2 Problemen führen:
1) Falsche Anzahl von Iterationen;
2) Falsche Ergebnisse, wenn Sie ExpressionZ für Berechnungen in einer Anweisung verwenden.

Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации. могут отсутствовать, однако разделяющие их точки с запятыми (;) опускать нельзя. Если опущено...
 
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. Es bleibt also die Frage, ob "double" in einer Schleife verwendet werden kann und immer die richtige Anzahl von Iterationen erhält.

Multipliziere mit 10 bis zum richtigen Grad, bis du ganze Zahlen erhältst. Am Anfang hatte ich auch Schwierigkeiten, jetzt konvertiere ich sogar Preise in ganze Zahlen und arbeite mit ganzen Zahlen oder runde auf ganze Zahlen. Ich habe weniger Fehler und eine bessere Lesbarkeit.

Wie ein Programmierer nach Erhalt der Zusammenfassungen der Börse sagte, verstehe ich im Allgemeinen nicht, warum Zahlen mit einer bestimmten Ziffernkapazität durch reelle Zahlen und nicht durch ganze Zahlen dargestellt werden. Dies ist logisch nicht korrekt. ))))

 
Valeriy Yastremskiy:

Multipliziere mit 10 bis zum richtigen Grad, bis du ganze Zahlen erhältst. Am Anfang hatte ich auch Schwierigkeiten, aber jetzt konvertiere ich sogar den Preis in eine ganze Zahl und arbeite mit ganzen Zahlen oder runde auf ganze Zahlen. Ich habe weniger Fehler und eine bessere Lesbarkeit.

Wie ein Programmierer nach dem Erhalt von Zusammenfassungen aus dem Austauschprogramm sagte, verstehe ich im Allgemeinen nicht, warum Zahlen mit einer bestimmten Ziffernkapazität durch reelle Zahlen und nicht durch ganze Zahlen dargestellt werden. Dies ist logisch nicht korrekt. ))))

Danke, ich werde int auf die alte Weise verwenden und dann durch double dividieren. ;)

 
Nauris Zukas:

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

Entschuldigung, ich hätte es überprüfen sollen. Und hier heißt es: "Ich wollte es richtig machen, aber es hat sich herausgestellt, dass es dasselbe ist wie immer".

Ergebnis

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

Korrekter Code

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

Korrekter Code

Achten Sie darauf, dass Sie nicht step=0.04 eingeben ;)

 
Andrey Khatimlianskii:

Achten Sie darauf, dass Sie nicht step=0.04 eingeben ;)

Dies ist nur ein Ratschlag für diejenigen, die nicht wissen, wie sie ihr Gehirn benutzen sollen.)))

 
Alexey Viktorov:

Entschuldigung, ich hätte es überprüfen sollen. Es heißt nur: "Ich habe es gut gemeint, aber es ist immer das Gleiche".

Ergebnis

Korrekter Code.

i=NormalizeDouble(i+step, 1)

Ah, danke! Daran habe ich selbst nicht gedacht. Das ist genau die Art von Dingen, die uns Neulingen beim Programmieren helfen ;)

 
Ich bin auf der Suche nachMethoden zum Sortieren eines Arrays von Strukturen. Hat jemand eine funktionierende Variante?
 
Vladimir Pastushak:
Ich bin auf der Suche nachMethoden zum Sortieren eines Arrays von Strukturen. Hat jemand eine funktionierende Variante?

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

Es funktioniert nicht...