vorher_berechnet - Seite 10

 
Dmitry Fedoseev:
Das ist nicht der Fall. Es kommt zu einer Verbindungsunterbrechung von mehreren Takten, mehrere Takte werden mit Müll nicht initialisiert.
Alexey Kozitsyn:
Entweder gab es, wie Dmitry oben sagte, eine Verbindungsunterbrechung von mehreren Takten... Übrigens, wird prev_calculated auch 0 zurückgeben, wenn die Verbindung fehlschlägt?

Offenbar gab es zu diesem Zeitpunkt tatsächlich eine Unterbrechung der Kommunikation.

2016.10.19 04:46:13.770 Network '4092672': scanning network finished
2016.10.19 04:45:37.260 Network '4092672': scanning network for access points
2016.10.19 04:45:36.630 Network '4092672': trading has been enabled - hedging mode
2016.10.19 04:45:36.630 Network '4092672': terminal synchronized with MetaQuotes Software Corp.
2016.10.19 04:45:36.000 Network '4092672': previous successful authorization performed from 31.173.80.3 on 2016.10.18 17:51:14
2016.10.19 04:45:36.000 Network '4092672': authorized on MetaQuotes-Demo through Access Point SG Singapore (ping: 583.86 ms)
2016.10.19 04:42:57.680 Network '4092672': connection to MetaQuotes-Demo lost

Und es ist sehr wahrscheinlich, dass prev_calculated bei einem Bruch 0 zurückgibt.

OK, es war eine lange Pause, aber was hat die anderen prev_calculated Nullen verursacht?

Aus diesen Zeilen.

2016.10.18 23:51:34.895 Network '4092672': scanning network finished
2016.10.18 23:51:20.865 Network '4092672': scanning network for access points

Bis auf die oben genannten gibt es keine anderen Rekorde als Handelsrekorde wie diesen.

2016.10.19 00:00:36.066 Trades  '4092672': cancel order #103987819 buy stop 0.10 USDJPY at 103.977 sl: 103.377 tp: 104.077

Und Sie können sehen, wie viele Nullen von prev_calculated in meinem vorherigen Beitrag waren.

 
Alexey Kozitsyn:

Möglicherweise liegt der Fehler hier:

if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

Wenn ein neuer Balken eintrifft, setzen Sie die Werte auf 0 zurück - gut. Aber dann prüft man minEquity und 0 auf Gleichheit, was nicht empfehlenswert ist.

Um meine Worte zu beweisen, hier ist Ihr Bild. Sie können sehen, dass die "Müll"-Werte, wie Sie sagten, gegen Null gehen.

Natürlich sollten Sie ein Datenfenster mit dem Wert "Papierkorb" in das Bild einfügen.

Können Sie näher erläutern, warum diese Methode nicht empfohlen wird?

Dieser Teil des Codes (minEquity == 0? bal : minEquity) gibt , wenn minEquity == 0 ist, den Wert von bal zurück, der zuvor ermittelt wurde; der Wert von minEquity ändert sich nicht, bis die Funktion fmin() beendet wird.

Obwohl ich zustimme, dass ein solches Schreiben ein wenig riskant ist... aber das ist nicht das Problem.

 
Alexey Viktorov:

Können Sie näher erläutern, warum diese Methode nicht empfohlen wird?

dieser (minEquity == 0? bal : minEquity) Teil des Codes gibt , wenn minEquity == 0 ist , den zuvor ermittelten Wert von bal zurück; der Wert von minEquity ändert sich erst, wenn die Funktion fmin() beendet ist

Obwohl ich zustimme, dass diese Art, den Code zu schreiben, ein wenig riskant ist... aber das ist nicht das Problem.

Ich habe genau davon gesprochen: minEquity ==0. Du vergleichst mit der gleichen Anzahl von Doppelgängern. Dies könnte den Rückgang der Werte auf 0 erklären.
 
Alexey Kozitsyn:
Ich habe genau davon gesprochen: minEquity ==0. Du vergleichst mit der Gleichheit der beiden Zahlen. Das könnte den Rückgang der Werte auf 0 erklären.

Ich sehe, die richtige Antwort ist minEquity ==0.0 ... Ich kann mich nicht daran gewöhnen.

Und den letzten Satz verstehe ich überhaupt nicht. Welche Werte bis 0?

 
Alexey Viktorov:

Ich sehe, die richtige Antwort ist minEquity ==0.0 ... Ich kann mich nicht daran gewöhnen.

Und den letzten Satz verstehe ich überhaupt nicht. Welche Werte bis 0?

Aber ich weiß nicht, ob eine implizite Typkonvertierung einen Fehler verursachen kann. Ich meinte den Vergleich von realen Typen. D.h. hier würde ich es sicherheitshalber so schreiben:

CompareDoubles( minEquity, 0.0 );

bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }
 
Alexey Kozitsyn:

Ich weiß jedoch nicht, ob eine implizite Typumwandlung einen Fehler verursachen kann, ich sprach im Prinzip über den Vergleich realer Typen. D.h. hier würde ich es aus Gründen der Zuverlässigkeit so schreiben:

CompareDoubles( minEquity, 0.0 );

bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }


Ja, meine Version zählt Geld mit zwei Dezimalstellen. Dies ist kein Zitat, bei dem man so akribisch vorgehen muss.
 
Alexey Viktorov:
Ja, meine Version zählt Geld mit zwei Dezimalstellen. Dies ist kein Zitat, also kann man es nicht so genau nehmen.

Es geht nicht um Akribie, es geht um Genauigkeit. In Ihrem Fall könnte dies dazu führen, dass ein Nullwert in den Puffer geschrieben wird. Wenn Sie es nicht so genau nehmen wollen, machen Sie es so:

if(rates_total > prev_calculated)
   {
    minEquity = -1.0;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin((minEquity < 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

Dann tritt kein Fehler auf.

 
Alexey Kozitsyn:

Es geht nicht um Akribie, es geht um Genauigkeit. In Ihrem Fall könnte dies dazu führen, dass ein Nullwert in den Puffer geschrieben wird. Wenn Sie diese Präzision nicht wünschen, machen Sie es so:

if(rates_total > prev_calculated)
   {
    minEquity = -1.0;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin((minEquity < 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

In diesem Fall liegt kein Fehler vor.

Warum bin ich so dumm? Wie konnte ich nicht ahnen, dass es besser ist, minEquity mit einem Wert ungleich Null zu initialisieren? Dann wird alles einfacher sein...

if(rates_total > prev_calculated)
   {
    minEquity = DBL_MAX;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin(minEquity, equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

Sie können auch maxEquity = DBL_MIN verwenden;

 
Alexey Viktorov:

Warum bin ich so dumm? Wie konnte ich nicht ahnen, dass es besser ist, minEquity mit einem Wert ungleich Null zu initialisieren? Dann wäre alles einfacher...

if(rates_total > prev_calculated)
   {
    minEquity = DBL_MAX;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin(minEquity, equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);


Na ja... oder so...
 
Alexey Kozitsyn:
Na ja... Oder so...
Das ist nicht wirklich das Problem. Obwohl das Problem irgendwie umgangen wurde, ist der Müll im Indikatorpuffer beim Start des Indikators nicht richtig.
Grund der Beschwerde: