MetaTrader 5 Strategy Tester: Bugs, Bugs, Verbesserungsvorschläge - Seite 34

 
Artyom Trishkin:

Ich schaue es auch nie an. Aber es nimmt nützlichen Platz weg...

Es war jedoch sehr nützlich.

 
Artyom Trishkin:

Ich schaue es auch nie an. Aber es nimmt nützlichen Platz weg...

Es wird niemanden schockieren, wenn zuerst Meldungen vom Tester über die Synchronisierung, das Laden des Expert Advisors usw. mit der lokalen Zeit erscheinen und dann Meldungen vom Expert Advisor und dem Testhandelsserver mit der Testzeit, manchmal unterbrochen von Meldungen vom Tester mit der lokalen Zeit?
 
Ich habe einen der Orte gefunden, an denen Tester beschleunigt werden können. Es stellt sich heraus, dass der Tester jedes Mal, wenn er zwei Preise vergleicht (z. B. BuyLimit und Tick.ask), eine teure Normalisierung durchführt. Das ist nicht nötig!
 
Slava:
Schockiert es niemanden, wenn zuerst Meldungen des Testers über die Synchronisierung, das Laden des Expert Advisors usw. mit der Ortszeit erscheinen und dann Meldungen des Expert Advisors und des Test Trading Servers mit der Testzeit, manchmal unterbrochen von Meldungen des Testers mit der Ortszeit?

Slava, ich habe darüber nachgedacht, wie ich das am besten organisieren kann. Ich wollte vorschlagen, dass die Startzeit, die Synchronisierung usw. zuerst gesendet werden sollten und dann der Rest - vom Experten und Tester mit wichtigen Meldungen.

Klingt für mich genauso wie von Ihnen vorgeschlagen :)

 
fxsaber:
Ich habe einen der Orte gefunden, an denen Tester beschleunigt werden können. Es stellt sich heraus, dass Tester jedes Mal, wenn er zwei Preise vergleicht (z. B. BuyLimit und Tick.ask), eine teure Normalisierung durchführt. Das ist nicht nötig!

Die Preise in der Terminal-Historie sind nicht normalisiert!

bool IsNorm( const double Price )
{
  return(NormalizeDouble(Price, _Digits) == Price);
}

#define  TOSTRING(A) #A + " = " + DoubleToString(A, 16) + " "
#define  PRINT(A) Print(TOSTRING(A) + TOSTRING(NormalizeDouble(A, _Digits)))
#define  ISNORM(A) if (!IsNorm(A)) { PRINT(A); Count++; };

void OnStart()
{
  MqlTick Ticks[];
  
  const int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, 1000 * (long)D'2019.12.01');
  Print(Size);
  
  for (int i = 0, Count  = 0; (i < Size) && (Count < 10); i++)
  {
    ISNORM(Ticks[i].bid)
    ISNORM(Ticks[i].ask)
    ISNORM(Ticks[i].last)
  }
}


Ergebnis (EURUSD, MQ-Beta)

Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 


Wie ist das möglich? Ein Fehler auf der Seite des Handelsservers?

Infolgedessen steuert der Tester EAs zu krummen Preisen, selbst bei echten Symbolen.


Das Problem scheint darin zu liegen, dass die Entwickler einen anderen Normalisierungsalgorithmus verwendet haben.

 
Andrey Khatimlianskii:

Es wurde ein Fehler mit einem leeren Wert in den intu-Parametern reproduziert.

1. Bauen Sie den EA zusammen:

2. Optimieren Sie beide Parameter auf irgendeine Weise:

3. Deaktivieren Sie enam und optimieren Sie nur x:

4. Laden Sie den 1. Optimierungscache, dann den 2. Optimierungscache, führen Sie einen einzelnen Lauf aus den Ergebnissen durch. Anstelle von -1 erhalten wir INT_MAX:


Relevant für alle Enums, die mit -1 beginnen.

Es besteht der Verdacht, dass die Eingabe vollständig deaktiviert wird, wenn Sie das Häkchen bei t entfernen.
und die Variable t enthält einen nicht initialisiertenINT_MAX-Wert anstelle eines leeren Wertes.

 
fxsaber:

Die Preise in der Terminal-Historie sind nicht normalisiert!


Ergebnis (EURUSD, MQ-Beta)


Wie ist das möglich? Ein Fehler auf der Seite des Handelsservers?

Infolgedessen steuert der Tester EAs zu krummen Preisen, selbst bei echten Symbolen.


Das Problem scheint darin zu liegen, dass die Entwickler einen anderen Normalisierungsalgorithmus verwendet haben.

Das sind keine krummen Preise! Sie sind völlig normalisiert. Dies geht eindeutig aus Ihrem Ausdruck hervor

Der Handelsserver verwendet immer ein Epsilon, um den eingehenden Preis mit dem aktuellen Preis beim Handel zu vergleichen.

Ist Ihnen bewusst, dass das Ergebnis von <irgendeine_reale_Zahl>*0,5 sich von dem Ergebnis von <die_gleiche_reale_Zahl>/2,0 unterscheiden kann?

Ist Ihnen bewusst, dass einige Compiler bei der Optimierung des Codes eine Operation durch eine andere ersetzen können? Außerdem wird sie in einem Fall ersetzt und in einem anderen Fall nicht, und zwar innerhalb desselben Projekts. Ohne einen Krieg zu erklären.

 
Roman:

Es besteht der Verdacht, dass die Eingabe vollständig deaktiviert wird, wenn Sie das Häkchen bei t entfernen.
und die Variable t enthält einen nicht initialisierten INT_MAX-Wert anstelle eines leeren Wertes.

Was der innere Grund ist, ist nicht wichtig.

Wichtig ist, dass sie den Fehler reproduzieren und beheben. Der Fehler ist alt.

 
Slava:

Das sind keine krummen Preise! Sie sind völlig normalisiert. Dies geht eindeutig aus Ihrem Ausdruck hervor

Der Preis wird nur dann normalisiert, wenn er diese Bedingung erfüllt.

Forum zum Thema Handel, automatische Handelssysteme und Strategietester

MetaTrader 5 Strategie-Tester: Bugs, Bugs, Verbesserungsvorschläge

fxsaber, 2019.12.11 07:47

bool IsNorm( const double Price )
{
  return(NormalizeDouble(Price, _Digits) == Price);
}

Der Handelsserver verwendet beim Handel immer Epsilon, um den eingehenden Preis mit dem aktuellen Preis zu vergleichen.

Es ist richtig, dass der Handelsserver genau das tut.

Ist Ihnen bewusst, dass das Ergebnis <irgendeine_reale_Zahl>*0,5 sich von dem Ergebnis <die_gleiche_reale_Zahl>/2,0 unterscheiden kann?

Ist Ihnen bekannt, dass einige Compiler bei der Optimierung des Codes eine Operation durch eine andere ersetzen können? Außerdem werden sie in einem Fall ersetzt und in einem anderen nicht, und zwar innerhalb desselben Projekts. Ohne den Krieg zu erklären.

Die Antwort auf beide Fragen lautet: Ja, ich bin mir dessen bewusst.


Auch hier sind die ursprünglichen Preise im Terminal nicht normalisiert. Daher kommt es leicht zu dieser Situation.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Nicht-normalisierte Preise in MT4

fxsaber, 2019.02.20 23:03

Aber die Situation ist viel schlimmer, und zur gleichen Zeit auf MQ-Demo
// 15326434
// wmefo5sa
// MetaQuotes-Demo
void OnStart()
{
  const double Price1 = HistoryOrderSelect(356138100) ? HistoryOrderGetDouble(HistoryOrderGetTicket(0), ORDER_PRICE_CURRENT) : 0;
  const double Price2 = PositionSelectByTicket(356138100) ? PositionGetDouble(POSITION_PRICE_OPEN) : 0;  
  
  Print(Price1 - Price2); // -2.220446049250313e-16
}


Der Eröffnungskurs der aktuellen Position ist nicht gleich dem Kurs ihres Auftrags/Handels.