Testeur de stratégie MetaTrader 5 : bugs, anomalies, suggestions d'amélioration - page 34

 
Artyom Trishkin:

Je ne le regarde jamais non plus. Mais il prend un espace utile...

Cependant, il s'est avéré utile.

 
Artyom Trishkin:

Je ne le regarde jamais non plus. Mais il prend un espace utile...

Personne ne sera choqué par le fait qu'il y ait d'abord des messages du testeur concernant la synchronisation, le chargement du conseiller expert, etc. avec l'heure locale, puis des messages du conseiller expert et du serveur de trading de test avec l'heure de test, parfois entrecoupés de messages du testeur avec l'heure locale ?
 
J'ai trouvé un des endroits où Tester peut être accéléré. Il s'avère que chaque fois que Tester compare deux prix (par exemple BuyLimit et Tick.ask), il le fait via une normalisation coûteuse. Il n'y a pas besoin de faire ça !
 
Slava:
N'est-il pas choquant de constater que l'on trouve d'abord des messages du testeur concernant la synchronisation, le chargement du conseiller expert, etc. avec l'heure locale, puis des messages du conseiller expert et du serveur de trading de test avec l'heure de test, parfois entrecoupés de messages du testeur avec l'heure locale ?

Slava, j'ai réfléchi à la meilleure façon de l'organiser. Je voulais suggérer que l'heure de démarrage, la synchronisation, etc. soient envoyées en premier, et ensuite le reste - de l'expert et du testeur avec des messages importants.

Cela me semble être la même chose que ce que vous avez suggéré :)

 
fxsaber:
J'ai trouvé un des endroits où Tester peut être accéléré. Il s'avère que chaque fois que Tester compare deux prix (par exemple BuyLimit et Tick.ask), il le fait via une normalisation coûteuse. Il n'y a pas besoin de faire ça !

Les prix dans l'historique du terminal ne sont pas normalisés !

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


Résultat (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 


Comment est-ce possible ? Une erreur du côté du serveur commercial ?

Par conséquent, le testeur fait fonctionner les EA à des prix frauduleux, même sur des symboles réels.


Il semble que le problème soit que les développeurs ont utilisé un algorithme de normalisation différent.

 
Andrey Khatimlianskii:

Reproduction d'un bug avec une valeur vide dans les paramètres d'intuition.

1. Assemblez l'EA :

2. optimiser les deux paramètres :

3. Décochez enam et optimisez seulement x :

4. Chargez le 1er cache d'optimisation, puis le 2ème cache d'optimisation, lancez une seule exécution à partir des résultats. Au lieu de -1, nous obtenons INT_MAX:


Pertinent pour tous les enums commençant par -1.

Il y a une suspicion que lorsque vous décochez t, l'entrée est complètement désactivée.
et la variable t contient une valeurINT_MAX non initialisée au lieu d'une valeur vide.

 
fxsaber:

Les prix dans l'historique du terminal ne sont pas normalisés !


Résultat (EURUSD, MQ-Beta)


Comment est-ce possible ? Une erreur du côté du serveur commercial ?

Par conséquent, le testeur fait fonctionner les EA à des prix frauduleux, même sur des symboles réels.


Il semble que le problème soit que les développeurs ont utilisé un algorithme de normalisation différent.

Ce ne sont pas des prix abusifs ! Ils sont tout à fait normalisés. Cela ressort très clairement de votre empreinte

Le serveur de négociation utilise toujours un epsilon pour comparer le prix entrant au prix actuel lors de la négociation.

Savez-vous que le résultat de <un_nombre_réel>*0,5 peut être différent du résultat de <le_même_nombre_réel>/2,0 ?

Savez-vous que certains compilateurs peuvent remplacer une opération par une autre lorsqu'ils optimisent le code ? De plus, dans un cas, il est remplacé et dans un autre cas, il ne l'est pas, dans le même projet. Sans déclarer la guerre.

 
Roman:

Il y a une suspicion que lorsque vous décochez t, l'entrée est complètement désactivée.
et la variable t contient une valeur INT_MAX non initialisée au lieu d'une valeur vide.

Ce que la raison est à l'intérieur n'est pas important.

Ce qui est important, c'est qu'ils le reproduisent et le réparent. Le bug est vieux.

 
Slava:

Ce ne sont pas des prix abusifs ! Ils sont tout à fait normalisés. Cela ressort très clairement de votre empreinte

Le prix n'est normalisé que s'il passe cette condition.

Le serveur de négociation utilise toujours epsilon lors de la négociation pour comparer le prix entrant et le prix actuel.

Il est exact que le serveur commercial fait exactement cela.

Savez-vous que le résultat <un_nombre_réel>*0,5 peut être différent du résultat <le_même_nombre_réel>/2,0 ?

Savez-vous que certains compilateurs peuvent remplacer une opération par une autre lors de l'optimisation du code ? Et dans un cas remplacer et dans un autre non, au sein du même projet. Sans déclarer la guerre.

La réponse aux deux questions est affirmative - je suis au courant.


Une fois de plus, les prix originaux dans le terminal ne sont pas normalisés. Cette situation se produit donc facilement.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Prix non normalisés dans MT4

fxsaber, 2019.02.20 23:03

Mais la situation est bien pire, et en même temps sur 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
}


Le prix d'ouverture de la position actuelle n'est pas égal au prix de leur ordre/transaction.