Algoritmi, metodi di soluzione, confronto delle loro prestazioni - pagina 22

 

Aggiornato al 2269. Risultati del profiler di un grande EA (non sintetico).


Tester



Virtuale


Probabilmente, il profiler fa delle misurazioni sbagliate. Altrimenti risulta che OrderSend cinque richiede 912 ms in media.

 

Tutti i doppi normalizzati con lo stesso algoritmo (ad esempio tramite NormalizeDouble) possono essere confrontati direttamente tra loro.


Questo fatto ovvio permette di evitare costose costruzioni di confronto di numeri reali in molti casi. Che in alcuni compiti può aumentare significativamente le prestazioni.

Forse uno dei più esemplari di questi compiti è Tester. Analizziamolo con un esempio.


C'è BuyLimit. Ad ogni tick, il tester deve confrontare BuyLimit con il prezzo Ask. Il tester standard lo fa attualmente in questo modo

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


Cioè qualsiasi livello di trade(ordine pendente o SL/TP) fa scattare una normalizzazione.


Ma possiamo sempre cavarcela con un costrutto di confronto molto efficace se i prezzi sono stati normalizzati in precedenza (prima del backtest).

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


Proviamo un confronto. Ho eseguito questo robot in Tester attraverso Virtual.

#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;
  }
}


Confronto dei prezzi attraverso la normalizzazione.

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


Senza normalizzazione.

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


Possiamo vedere che il guadagno è più del 20% se non facciamo la normalizzazione quando confrontiamo i prezzi.


Di conseguenza, se il Tester interno viene passato ai prezzi normalizzati e non fa la normalizzazione interna quando confronta i prezzi, si può ottenere un serio miglioramento delle prestazioni.

 
Dopo l'assegnazione diretta senza operazioni di matrice, anche
 
TheXpert:
Dopo l'assegnazione diretta senza mat. operazioni anche

Il prefisso, ovviamente, copia la rappresentazione in byte del numero in modo invariato.

 

Dovremmo fare un test più lungo di un secondo per chiarezza?

C'è una diffusione di 3 volte in una versione: passaggio più breve 0:00:00.604, passaggio più lungo 0:00:01.743. cosa confrontiamo?

 
Andrey Khatimlianskii:

Forse fare un test di più di un secondo per chiarezza?

C'è una diffusione di 3 volte in una versione: passaggio più breve 0:00:00.604, passaggio più lungo 0:00:01.743. cosa confrontiamo?

Confrontando il più corto, naturalmente. Sono abituato a correre su zecche filtrate. Preparerà quelli non filtrati più tardi.

 
fxsaber:

Stiamo confrontando il più corto, ovviamente.

Perché? L'ottimizzazione non consiste in un solo passaggio. Che differenza fa che un passaggio sia così veloce, se la media non è molto diversa.


fxsaber:

Sono abituato a correre su zecche filtrate. Più tardi preparerò quelli non filtrati.

Posso semplicemente fare un intervallo più lungo. Almeno 30 secondi per il test.

 
Andrey Khatimlianskii:

Perché? Non è che l'ottimizzazione consista in un solo passaggio. Che differenza fa che un passaggio sia così veloce, se la media non è molto diversa.

Questo parametro è ottimizzato.

input int inFakeRange = 0;

E non influisce sulla logica. Ecco perché è più breve.

 
fxsaber:

Questo parametro è ottimizzato

E non influisce sulla logica. Ecco perché è più breve.

Cosa c'entra la logica EA? Stiamo misurando la velocità del tester.

 
Andrey Khatimlianskii:

Cosa c'entra la logica dell'EA? Stiamo misurando la velocità del tester.

Questo è il modo in cui funziona un agente, conta consecutivamente la stessa cosa. Se si toglie tutta la casualità, la performance netta è vicina a quella più breve.