Erreurs, bugs, questions - page 2823

 
Nikolai Semko:

La performance de l'opération de comparaison de deux doubles dépend-elle des valeurs des variables elles-mêmes ? J'en doute.

Il semble que ce soit le cas. C'est plutôt étrange.
Si vous remplacez la ligne dans l'exemple ci-dessus

double test = 1.11;

à

double test = NormalizeDouble(1.11,2);

la simple comparaison de deux doubles commence à fonctionner plus rapidement que les autres options. Bien qu'elle puisse être double ou double. Quelle différence cela fait-il ? Mais les performances résultantes sont deux fois plus rapides. C'est comme un miracle.

2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   простое сравнение предварительно нормализированых double 1 - 552 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   простое сравнение предварительно нормализированых double 2 - 954 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   сравнение double через эпсилон                             - 778 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   сравнение double через преобразование в int                - 854 микросекунд, всего совпадений = 507
Dossiers :
 
Alexey Navoykov:

Le test est incorrect. Pourquoi divisez-vous par 100000.0 une seule fois à la fin ? Cela devrait être fait à chaque itération et ensuite additionné. C'est une comparaison juste. Mais ce n'est pas du tout une normalisation - vous avez juste optimisé votre algorithme de test. Bien sûr, il sera plus rapide et plus précis (puisque l'erreur accumulée est réduite).

Oui, vous avez raison. La précision sera la même qu'avec NormalizeDouble si vous la divisez à chaque itération. Mais la vitesse sera toujours plus élevée qu'avec NormalizeDouble.

2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   простая сумма                            - 1394 микросекунд, сумма = -3604329.1567609389312565
2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   сумма с NormalizeDouble                  - 5861 микросекунд, сумма = -3604329.1543100476264954
2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   сумма, нормализированная через int       - 2179 микросекунд, сумма = -3604329.1543100476264954

Merci.

 

En général, après avoir arrondi à un nombre entier, il n'est pas bon de renvoyer un nombre non entier. Auparavant, dans les imprimantes, j'ai vu des nombres presque entiers avec des zéros après la virgule et un à la fin, ou avec des neuf après la virgule. Je pensais que c'était un bug. Il s'avère qu'il s'agit d'une position peu claire des développeurs. Eh bien, en arrondissant à l'entier, vous devriez enlever le reste après le point décimal sous forme binaire mais apparemment il est difficile/impossible de mettre à zéro la mantisse. La normalisation est encore plus compliquée, même si nous déplaçons une virgule vers 5 chiffres et un entier en binaire, l'arrondi inverse vers le double donnera une différence avec le type entier.

Malheureusement, il faut s'en remettre à des opérations de comparaison apparemment simples.

Pas python.))))

 
Valeriy Yastremskiy:

En général, après avoir arrondi à un nombre entier, il n'est pas bon de renvoyer un nombre non entier. Auparavant, dans les imprimantes, j'ai vu des nombres presque entiers avec des zéros après la virgule et un à la fin, ou avec des neuf après la virgule. Je pensais que c'était un bug. Il s'avère qu'une position incompréhensible se développe. Eh bien, en arrondissant à l'entier, vous devriez enlever le reste après le point décimal sous forme binaire mais apparemment il est difficile/impossible de mettre à zéro la mantisse. La normalisation est encore plus compliquée, même si nous déplaçons une virgule vers 5 chiffres et un entier en binaire, l'arrondi inverse vers le double donnera une différence avec le type entier.

Malheureusement, nous devons craquer sur des opérations de comparaison apparemment simples.

Les expressions après arrondi peuvent contenir d'autres opérations sur les données résultantes, et pas nécessairement des opérations sur les entiers. Ensuite, nous devrons le reconvertir en double à partir de int, créant ainsi un surcoût sur place.

Personne ne vous empêche de créer vos propres fonctions RoundInt ou RoundLong, qui renverront le type requis.

 

Il y a un problème avec le testeur sur le marché.

Si je teste un EA multi-devises, le testeur se bloque.

La raison : pendant l'analyse de l'instrument financier, le conseiller expert tombe sur les instruments sans historique ou l'instrument n'est pas correctement conçu.

Dans le terminal standard, il se bloque pendant 29 secondes, c'est sûr et c'est vérifié.

Le testeur du marché fait état de tests trop longs.

Je suppose que le conseiller expert rencontre plusieurs de ces instruments financiers cassés.

Ce problème a été abordé à plusieurs reprises et il y a un an, mais il est toujours d'actualité.....

 
Vladimir Pastushak:

Ce problème a été abordé à plusieurs reprises et il y a un an, mais il est toujours d'actualité.....

Ça ne marche pas pour moi. Veuillez joindre votre code source.

 

Pouvez-vous expliquer pourquoi la fonction ne fonctionne pas ? Il ne passe pas à la carte 0.

ChartSetInteger(0,CHART_BRING_TO_TOP,0,true);

La deuxième et dernière application du modèle reproduit les fenêtres

ChartApplyTemplate(0,"Template.tpl");

Ces fonctions fonctionnaient avant la mise à jour.

 
fxsaber:

Il ne joue pas pour moi. Joignez votre code source.

Test sur les serveurs Metakvotes de démonstration

void OnStart()
  {
   int m_all_symbols = SymbolsTotal(false);
   string m_sym_name = "";
   for(int i = 0; i < m_all_symbols; i++)
     {
      // ======================================================================
      // === Получили имя символа
      if((m_sym_name = SymbolName(i, false)) != NULL)
        {
         // ======================================================================
         // === Если символ не выбран в окне маркет ватч
         if(!SymbolInfoInteger(m_sym_name, SYMBOL_SELECT))
            if(!SymbolSelect(m_sym_name, true))
               Print(" SymbolSelect " + m_sym_name);
         ulong get = GetMicrosecondCount();
         MqlRates rateM1[1440];
         if(CopyRates(m_sym_name, PERIOD_M1, 0, 1440, rateM1) > 0)
           {
            Print(m_sym_name, "  ", (GetMicrosecondCount() - get));
           }
         else
            Print("Error  ",m_sym_name, "  ", (GetMicrosecondCount() - get));
        }
     }
  }


2020.08.11 20:20:55.657 test (EURUSD,M15) MXNJPY 1998

2020.08.11 20:20:55.659 test (EURUSD,M15) NZDMXN 1979

2020.08.11 20:20:55.661 test (EURUSD,M15) USDCOP 1973

2020.08.11 20:20:55.663 test (EURUSD,M15) USDARS 2093

2020.08.11 20:20:55.665 test (EURUSD,M15) USDCLP 1929

2020.08.11 20:21:25.259 test (EURUSD,M15) Erreur AUS200 29593673

2020.08.11 20:21:54.837 test (EURUSD,M15) Erreur FCHI40 29578404

2020.08.11 20:22:24.336 test (EURUSD,M15) Erreur GDAXIm 29498485

2020.08.11 20:22:53.949 test (EURUSD,M15) Erreur HSI50 29612968

2020.08.11 20:23:23.458 test (EURUSD,M15) Erreur Jap225 29509059

2020.08.11 20:23:52.919 test (EURUSD,M15) Erreur ND100m 29461316

2020.08.11 20:24:22.425 test (EURUSD,M15) Erreur SP500m 29505571

2020.08.11 20:24:51.860 test (EURUSD,M15) Erreur SPN35 29435460

2020.08.11 20:25:21.273 test (EURUSD,M15) Erreur STOX50 29412578

2020.08.11 20:25:50.663 test (EURUSD,M15) Erreur UK100 29389644

2020.08.11 20:26:20.205 test (EURUSD,M15) Erreur Brent 29542597

2020.08.11 20:26:49.667 test (EURUSD,M15) Erreur Brut 29462066

2020.08.11 20:27:19.194 test (EURUSD,M15) Erreur NatGas 29526780




 
Vladimir Pastushak:

Test sur les serveurs Demo Metacvots

Excusez-moi, ça raccroche maintenant. ....

Ce script n'a pas provoqué le blocage du terminal sur ma machine.

 
fxsaber:

Ce script n'a pas provoqué le blocage du terminal sur ma machine.

Il est fort probable que vous n'ayez pas reproduit les conditions du test. J'ai le même problème avec l'UPU. Exactement sur le serveur de démonstration metaquotes