Algorithmen, Lösungsmethoden, Vergleich ihrer Leistung - Seite 22

 

Aktualisiert auf 2269. Profilergebnisse eines großen (nicht-synthetischen) EA.


Tester



Virtuell


Wahrscheinlich macht der Profiler falsche Messungen. Ansonsten zeigt sich, dass OrderSend five im Durchschnitt 912 ms benötigt.

 

Alle mit demselben Algorithmus normalisierten Dubbles (z. B. über NormalizeDouble) können direkt miteinander verglichen werden.


Diese offensichtliche Tatsache ermöglicht es, in vielen Fällen kostspielige Konstruktionen zum Vergleich reeller Zahlen zu vermeiden. Dies kann bei einigen Aufgaben zu einer erheblichen Leistungssteigerung führen.

Eine der beispielhaftesten Aufgaben ist vielleicht der Tester. Lassen Sie uns das anhand eines Beispiels analysieren.


Es gibt das BuyLimit. Bei jedem Tick muss der Prüfer das BuyLimit mit dem Ask-Kurs vergleichen. Der Standardtester geht derzeit folgendermaßen vor

if (NormalizeDouble(BuyLimit_Price - Ask , Symbol_Digits) >= 0)
  BuyLimit -> Buy;


D.h. jede Handelsstufe(Pending Order oder SL/TP) löst eine Normalisierung aus.


Aber wir können immer mit einem sehr effektiven Vergleichskonstrukt auskommen, wenn die Preise vorher (vor dem Backtest) normalisiert wurden.

if (BuyLimit_Price >= Ask)
  BuyLimit -> Buy;


Lassen Sie uns einen Vergleich anstellen. Ich habe diesen Roboter im Testgerät durch Virtual laufen lassen.

#include <MT4Orders.mqh>

#define  VIRTUAL_TESTER // Запуск в виртуальном торговом окружении
#include <fxsaber\Virtual\Virtual.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

input int inAmountOrders = 10;
input int inFakeRange = 0;

void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    for (int i = 0; i < inAmountOrders; i++)    
      OrderSend(_Symbol, OP_BUYLIMIT, 0.1, Ask - 10000 * _Point, 0, 0, 0);
      
    FirstRun = false;
  }
}


Vergleich der Preise durch Normalisierung.

pass 0 returned result 100000.000000 in 0:00:01.578
pass 1 returned result 100000.000000 in 0:00:00.759
pass 2 returned result 100000.000000 in 0:00:00.894
pass 3 returned result 100000.000000 in 0:00:00.769
pass 4 returned result 100000.000000 in 0:00:00.806
pass 5 returned result 100000.000000 in 0:00:00.772
pass 6 returned result 100000.000000 in 0:00:01.253
pass 7 returned result 100000.000000 in 0:00:01.200
pass 8 returned result 100000.000000 in 0:00:01.089
pass 9 returned result 100000.000000 in 0:00:00.780
pass 10 returned result 100000.000000 in 0:00:01.258
optimization finished, total passes 11
optimization done in 0 minutes 11 seconds
shortest pass 0:00:00.759, longest pass 0:00:01.578, average pass 0:00:01.014


Ohne Normalisierung.

pass 0 returned result 100000.000000 in 0:00:01.743
pass 1 returned result 100000.000000 in 0:00:00.844
pass 2 returned result 100000.000000 in 0:00:00.672
pass 3 returned result 100000.000000 in 0:00:00.817
pass 4 returned result 100000.000000 in 0:00:00.635
pass 5 returned result 100000.000000 in 0:00:00.604
pass 6 returned result 100000.000000 in 0:00:00.867
pass 7 returned result 100000.000000 in 0:00:00.611
pass 8 returned result 100000.000000 in 0:00:00.899
pass 9 returned result 100000.000000 in 0:00:00.649
pass 10 returned result 100000.000000 in 0:00:00.742
optimization finished, total passes 11
optimization done in 0 minutes 09 seconds
shortest pass 0:00:00.604, longest pass 0:00:01.743, average pass 0:00:00.825


Wir können sehen, dass der Gewinn mehr als 20 % beträgt, wenn wir beim Preisvergleich keine Normalisierung vornehmen.


Folglich kann eine erhebliche Leistungsverbesserung erzielt werden, wenn der interne Tester auf normalisierte Preise umgestellt wird und beim Preisvergleich keine interne Normalisierung vornimmt.

 
Nach direkter Zuweisung ohne Matrixoperationen, auch
 
TheXpert:
Nach direkter Zuordnung ohne Mat. Operationen auch

Durch die Voranstellung wird die Byte-Darstellung der Zahl natürlich unverändert übernommen.

 

Sollten wir einen Test durchführen, der länger als eine Sekunde dauert, um Klarheit zu schaffen?

Es gibt eine Streuung von 3 Zeiten in einer Version: kürzester Durchgang 0:00:00.604, längster Durchgang 0:00:01.743. was können wir vergleichen?

 
Andrey Khatimlianskii:

Vielleicht sollten Sie einen Test von mehr als einer Sekunde durchführen, um Klarheit zu schaffen?

Es gibt eine Streuung von 3 Zeiten in einer Version: kürzester Durchgang 0:00:00.604, längster Durchgang 0:00:01.743. was können wir vergleichen?

Der Vergleich der kürzesten, natürlich. Ich bin es gewohnt, mit gefilterten Zecken zu fahren. Ich werde die ungefilterten später zubereiten.

 
fxsaber:

Wir vergleichen natürlich den kürzesten Weg.

Und warum? Die Optimierung besteht nicht aus einem einzigen Durchgang. Was macht es für einen Unterschied, dass ein Durchgang so schnell ist, wenn der Durchschnitt nicht viel anders ist.


fxsaber:

Ich bin es gewohnt, mit gefilterten Zecken zu fahren. Die ungefilterten werde ich später zubereiten.

Ich kann einfach eine längere Pause machen. Mindestens 30 Sekunden für den Test.

 
Andrey Khatimlianskii:

Und warum? Es ist ja nicht so, dass die Optimierung in einem Durchgang erfolgt. Was macht es für einen Unterschied, dass ein Durchgang so schnell ist, wenn der Durchschnitt nicht viel anders ist.

Dieser Parameter wird optimiert.

input int inFakeRange = 0;

Und die Logik wird dadurch nicht beeinträchtigt. Deshalb ist sie auch am kürzesten.

 
fxsaber:

Dieser Parameter wird optimiert

Und die Logik wird dadurch nicht beeinträchtigt. Deshalb ist sie auch am kürzesten.

Was hat die EA-Logik damit zu tun? Wir messen die Geschwindigkeit des Prüfgeräts.

 
Andrey Khatimlianskii:

Was hat die Logik von EA damit zu tun? Wir messen die Geschwindigkeit des Prüfgeräts.

So funktioniert ein Agent, der fortlaufend dasselbe zählt. Wenn man alle Zufälligkeiten wegnimmt, ist die Nettoleistung fast die kürzeste.