Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1206

 
Maxim Kuznetsov:

Alert("Разбег "+DoubleToString(delta,_Digits));

oder Alert(StringFormat("Spread %.5f",delta));

im Allgemeinen, gewöhnen Sie sich daran, es sind nur verschiedene Darstellungen derselben Zahl. Denken Sie an Ihre wunderbare Schulzeit zurück - daher kommt es.

Ich danke Ihnen. Was aber, wenn ich den Deltawert als Zahl verwenden und vergleichen muss? Zum Beispiel.

if(delta>0.00005)
  {
   //------------
  }
Wäre das richtig?
 
prom18:

Ich danke Ihnen. Was ist, wenn ich den Deltawert als Zahl verwenden und vergleichen muss? Zum Beispiel.

Ist dies richtig?

Sie können zwei reelle Zahlen auf diese Weise vergleichen:

bool EqualDoubles(double d1,double d2,double epsilon)
  {
   if(epsilon<0) 
      epsilon=-epsilon;
//---
   if(d1-d2>epsilon) 
      return false;
   if(d1-d2<-epsilon) 
      return false;
//---
   return true;
  }

https://www.mql5.com/ru/docs/basis/types/double

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL5 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования. Константы с плавающей точкой...
 
Mihail Matkovskij:

Sie können zwei reelle Zahlen auf diese Weise vergleichen:

https://www.mql5.com/ru/docs/basis/types/double

Das können Sie, wenn Sie sicher sind, dass sie sich in ihrer Bedeutung nicht sehr nahe kommen. Schließlich wird "weich" mit "warm" verglichen.
 
Alexey Viktorov:
Das können Sie, wenn Sie sicher sind, dass der Wert nicht sehr nahe beieinander liegt. Schließlich wird "weich" mit "warm" verglichen.

Das verstehe ich nicht. Zum Beispiel. Ich nehme die Anzahl der Pips, die der Kurs in einem Tick überschritten hat. Wenn der Kurs um mehr als 20 Punkte gefallen ist, erhalte ich einen Alert.

Ich vergleiche die Preisdifferenz (1,12300-1,12321=0,00021) mit dem erforderlichen Höchstwert (0,00020).

0.00021>0.00020.

Was hat das mit weich und warm zu tun?

 
prom18:

Das verstehe ich nicht. Zum Beispiel. Ich nehme die Anzahl der Pips, die der Kurs in einem Tick überschritten hat. Wenn der Kurs um mehr als 20 Punkte gefallen ist, erhalte ich einen Alert.

Ich vergleiche die Preisdifferenz (1,12300-1,12321=0,00021) mit dem erforderlichen Höchstwert (0,00020).

0.00021>0.00020.

Was hat das mit weich und warm zu tun?

Sie brauchen Punkte, also vergleichen Sie die Punkte.

und double wird mit epsilon verglichen (DBL_EPS, wenn ich mich recht erinnere), sonst könnte man 3.0-0.2 > 2.0+0.8 erhalten (im übertragenen Sinne, die Zahlen können unterschiedlich sein)

 
Maxim Kuznetsov:

Du brauchst Punkte, also vergleiche die Punkte. Es sind übrigens ganze Zahlen.

während double mit epsilon verglichen wird (DBL_EPS, wenn ich mich recht erinnere), sonst erhält man 3.0-0.2 > 2.0+0.8 (im übertragenen Sinne, die Zahlen können unterschiedlich sein)

Verwenden Sie zu diesem Zweck besser das Beispiel von @fxsaber:

int PriceToInteger( const double Price, const double point )
{
   return((int)(Price / point + 0.1));
}

Skript zu überprüfen:

//+------------------------------------------------------------------+
void OnStart()
{
   int bar1 = PriceToInteger(iClose(NULL, 0, 1), _Point);
   int bar2 = PriceToInteger(iClose(NULL, 0, 2), _Point);
   printf("bar2 - bar1 = %i point", bar2 - bar1);
}
//+------------------------------------------------------------------+
int PriceToInteger( const double Price, const double point )
{
   return((int)(Price / point + 0.1));
}
//+------------------------------------------------------------------+
 
prom18:

Das verstehe ich nicht. Zum Beispiel. Ich nehme die Anzahl der Pips, die der Preis in einem Tick überschritten hat. Wenn der Kurs um mehr als 20 Punkte gefallen ist, erhalte ich einen Alert.

Ich vergleiche die Preisdifferenz (1,12300-1,12321=0,00021) mit dem erforderlichen Höchstwert (0,00020).

0.00021>0.00020.

Was hat das mit weich und warm zu tun?

Nun, manchmal muss man nicht alles lesen, was geschrieben wird.

Sie haben Zahlen genommen, die normalerweise vom System dargestellt werden. Nehmen Sie diese...

  double a=1.12328,
         b=1.12309,
         c=0.00019,
         d=a-b;

und Sie erhalten

1.1232800000000001
1.1230899999999999
0.00019
0.000190000000000135

Die Idee ist a-b==c, aber der Computer wird Ihnen solche Fehler anzeigen. Es wurde viel darüber im Forum geschrieben, suchen und lesen Sie.

Aber man kann die normalisierte Differenz und den normalisierten Kontrollwert nehmen und sie vergleichen.

 
Иван:
Ich wünsche Ihnen allen eine gute Zeit. Frage: Wie berechnet der MT4-Tester bei der Arbeit mit Crosses (Paare ohne Pfund) die Ergebnisse geschlossener Positionen, wenn es sich bei dem Konto, auf dem die Tests durchgeführt werden, um ein Dollarkonto handelt? Nimmt der Prüfer für die Neuberechnung der Positionssummen in Dollar den Wechselkurs der Basiswährung des Kreuzes zum Dollar zum aktuellen Zeitpunkt oder zum Zeitpunkt des geprüften Intervalls? Ich habe den starken Verdacht, dass dies zum jetzigen Zeitpunkt der Fall ist. Wenn ja, ist es unmöglich, sie zum Zeitpunkt des Intervalls zu berechnen?
Weiß das jemand?
 
Иван:
Weiß das jemand?

den MODE_TICKVALUE selbst für jeden Tick zählen.

 
Alexey Viktorov:
Das können Sie, wenn Sie sicher sind, dass der Wert nicht sehr nahe beieinander liegen kann. Schließlich wird "weich" mit "warm" verglichen.

Wennprom18 zwei Zahlen innerhalb von Ziffernzeichen vergleichen muss, ist dies die einzige Methode, die funktioniert:

double price1 = 1.23450;
double price2 = 1.23447;

if(EqualDoubles(price1, price2, ((_Digits == 4) ? 0.0100 : 0.00100)) {
  ...
}

Aber wie Sie sehen können, gibt es noch mehr Variationen: https://www.mql5.com/ru/forum/160683/page1205#comment_17247843. Deshalb habe ich im Beispiel die Vergleichsgenauigkeit absichtlich um zwei Stellen reduziert. Natürlich ist eine solche Preisspanne ziemlich ungenau... Aber wie soll man sonst in solchen Fällen zwei Zahlen vergleichen...? Wenn die Abweichung über Digits liegt, können wir nicht EqualDoubles verwenden, sondern NormalizeDouble, um alles Unnötige abzuschneiden.

Sie könnten es aber auch so machen:

int digits = Digits() - 2;

double price1 = NormalizeDouble(1.23450, digits);
double price2 = NormalizeDouble(1.23447, digits);

if(price1 == price2) {
  ...
}
Grund der Beschwerde: