MetaTrader 5 Strategy Tester: bug, errori, suggerimenti per il miglioramento - pagina 34

 
Artyom Trishkin:

Neanche io lo guardo mai. Ma occupa uno spazio utile...

Tuttavia, è stato utile.

 
Artyom Trishkin:

Neanche io lo guardo mai. Ma occupa uno spazio utile...

Nessuno si scandalizzerà se prima ci sono messaggi dal tester sulla sincronizzazione, il caricamento di Expert Advisor ecc. con l'ora locale, e poi ci sono messaggi da Expert Advisor e dal server di trading di prova con l'ora di prova, a volte intervallati da messaggi dal tester con l'ora locale?
 
Ho trovato uno dei posti dove Tester può essere accelerato. Si scopre che ogni volta che Tester confronta due prezzi (ad esempio BuyLimit e Tick.ask), lo fa attraverso una costosa normalizzazione. Non c'è bisogno di farlo!
 
Slava:
Nessuno sarà scioccato quando prima ci sono messaggi dal tester sulla sincronizzazione, il caricamento dell'Expert Advisor, ecc. con l'ora locale, e poi ci sono messaggi dall'Expert Advisor e dal Test Trading Server con l'ora di prova, a volte intervallati da messaggi dal tester con l'ora locale?

Slava, ho pensato al modo migliore per organizzarlo. Volevo suggerire che l'ora di inizio, la sincronizzazione, ecc. dovrebbero essere inviati prima, e poi il resto - dall'esperto e dal tester con messaggi importanti.

Mi sembra la stessa cosa che hai suggerito tu :)

 
fxsaber:
Ho trovato uno dei posti dove Tester può essere accelerato. Si scopre che ogni volta che Tester confronta due prezzi (ad esempio BuyLimit e Tick.ask), lo fa attraverso una costosa normalizzazione. Non c'è bisogno di farlo!

I prezzi nella storia del Terminal non sono normalizzati!

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)
  }
}


Risultato (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 


Come è possibile? Un errore sul lato del server commerciale?

Di conseguenza, il Tester sta guidando gli EA a prezzi storti anche su simboli reali.


Sembra che il problema sia che gli sviluppatori hanno usato un algoritmo di normalizzazione diverso.

 
Andrey Khatimlianskii:

Riprodotto un bug con un valore vuoto nei parametri intu.

1. Assemblare l'EA:

2. ottimizzare su qualsiasi cosa entrambi i parametri:

3. Deselezionare enam e ottimizzare solo x:

4. Caricate la 1a cache di ottimizzazione, poi la 2a cache di ottimizzazione, eseguite una singola corsa dai risultati. Invece di -1 otteniamo INT_MAX:


Rilevante per tutti gli enum che iniziano con -1.

C'è il sospetto che quando si deseleziona t, l'input è completamente disabilitato
e la variabile t contiene un valoreINT_MAX non inizializzato invece di uno vuoto.

 
fxsaber:

I prezzi nella storia del Terminal non sono normalizzati!


Risultato (EURUSD, MQ-Beta)


Come è possibile? Un errore sul lato del server commerciale?

Di conseguenza, il Tester sta guidando gli EA a prezzi storti anche su simboli reali.


Sembra che il problema sia che gli sviluppatori hanno usato un algoritmo di normalizzazione diverso.

Questi non sono prezzi truffaldini! Sono abbastanza normalizzati. Questo è molto chiaro dalla tua stampa

Il server di trading usa sempre un epsilon per confrontare il prezzo in entrata con il prezzo corrente quando si fa trading.

Siete consapevoli che il risultato di <qualche_numero_reale>*0,5 può essere diverso dal risultato di <lo stesso_numero_reale>/2,0?

Sei consapevole che alcuni compilatori possono sostituire un'operazione con un'altra quando ottimizzano il codice? Inoltre, in un caso viene sostituito e in un altro no, all'interno dello stesso progetto. Senza dichiarare una guerra.

 
Roman:

C'è il sospetto che quando si deseleziona t, l'input è completamente disabilitato
e la variabile t contiene un valore INT_MAX non inizializzato invece di uno vuoto.

Quale sia la ragione all'interno non è importante.

L'importante è che lo riproducano e lo riparino. Il bug è vecchio.

 
Slava:

Questi non sono prezzi truffaldini! Sono abbastanza normalizzati. Questo è molto chiaro dalla tua stampa

Il prezzo è normalizzato solo se supera questa condizione.

Forum sul trading, sistemi di trading automatico e tester di strategie

MetaTrader 5 strategy tester: bug, errori, suggerimenti per il miglioramento

fxsaber, 2019.12.11 07:47

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

Il server di trading usa sempre l'epsilon durante il trading per confrontare il prezzo in arrivo e il prezzo corrente.

È corretto che il server commerciale fa esattamente questo.

Siete consapevoli che il risultato <qualche_numero_reale>*0,5 può essere diverso dal risultato <lo stesso_numero_reale>/2,0?

Sei consapevole che alcuni compilatori possono sostituire un'operazione con un'altra quando ottimizzano il codice? E in un caso sostituire e in un altro no, all'interno dello stesso progetto. Senza dichiarare guerra.

La risposta a entrambe le domande è affermativa - sono consapevole.


Ancora una volta, i prezzi originali del terminale non sono normalizzati. Quindi questa situazione si verifica facilmente.

Forum sul trading, sistemi di trading automatico e test di strategia

Prezzi non normalizzati in MT4

fxsaber, 2019.02.20 23:03

Ma la situazione è molto peggiore, e allo stesso tempo su 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
}


Il prezzo di apertura della posizione corrente non è uguale al prezzo del loro ordine/commercio.