Erreurs, bugs, questions - page 2556

 
Alexey Navoykov:
C'est vraiment quelque chose d'horrible. Il faudrait en savoir beaucoup sur les perversions pour envelopper le retour dans une macro :) Comment traiter un tel code alors... Nous devrions au moins rendre le nom de la macro plus descriptif - TRY_OR_RETURN, etc.

)))

J'ai vu à quoi ça ressemble et je ne l'utilise pas, je l'écris à l'ancienne if(!myfunc()) return ; dans OnTick() - le code est plein de ifs ... Il a l'air plutôt mignon et drôle aussi ))))

 

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

Nouvelle version de MetaTrader 5 build 2085 : Intégration avec Python et améliorations massives dans le testeur de stratégie

Andrey Barinov, 2019.09.06 06:25

Pouvez-vous encore expliquer pourquoi il y a un avertissement dans ce code maintenant ?

Les méthodes ont des signatures différentes...

class A
  {
   public:
                     A(void) {}
                    ~A(void) {}
      //===============
      void           Test(void) {}
      //===============
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+  
class B : public A
  {
   public:
                     B(void) {}
                    ~B (void) {}
      //===============
      void           Test(int a) {}
      //===============
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   B b;

   b.Test(); //deprecated behavior, hidden method calling will be disabled in a future MQL compiler versions
   b.Test(5);
//---
   return(INIT_SUCCEEDED);
  }

 

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

Nouvelle version de MetaTrader 5 build 2085 : Intégration avec Python et améliorations massives dans le testeur de stratégie

Andrey Barinov, 2019.09.06 06:11

typename() cassé dans la build 2136

S'il vous plaît, réparez-le.

enum eTest
  {
   TEST
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Alert(typename(eTest)); // eTest::eTest а правильно (и раньше так было) eTest
//---
   return(INIT_SUCCEEDED);
  }

typename


 
@Ilyas

Cet indicateur fait planter le système.
Et avec le changement de résolution d'écran et avec des pixels clignotants et le redémarrage nécessaire de l'ordinateur.
De plus, si vous n'appelez pas la fonction apparemment inoffensive Crash(), vous ne vous écraserez pas.
Reproduit comme suit :

  • exécuter l'indicateur
  • commencer à changer la période de temps jusqu'à ce qu'il y ait des décalages
  • après cela, essayez de minimiser MT5



J'ai eu ce crash à chaque fois que je l'ai fait ( 6-8 fois)

Dossiers :
AnyTF.mq5  10 kb
iCanvas.mqh  21 kb
 
il ne s'est pas planté sur LTSC, erreur de journalisation : MemoryException 4424265936 bytes not available, 0 heapmin result

il s'est planté, après quelques autres changements de TF et le système a tout juste démarré, la roue de démarrage a fait 100 tours, je pensais qu'il ne démarrerait pas, mieux vaut ne pas vérifier)
 
Fast235:
Il ne s'est pas planté sur LTSC, l'erreur suivante dans le journal : MemoryException 4424265936 bytes not available, 0 heapmin result

j'ai quand même planté après quelques autres changements de TF et le système a à peine démarré, la roue de chargement a fait 100 tours, je ne pensais pas qu'il démarrerait, mieux vaut ne pas le vérifier)

Oui, le crash est très dur. Mieux vaut ne pas prendre de risques.
C'est une question de mémoire, bien sûr.
Si vous nettoyez la mémoire comme ceci :

int OnInit()
  {
   ChartSetInteger(0,CHART_FOREGROUND,false);
   if(erase)
      ChartSetInteger(0,CHART_SHOW,false);
   Canvas.Erase();
   Canvas.Comm("Идет загрузка всех тиков. Подождите пожалуйста");
   Canvas.Update();
   N=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,(TimeCurrent()-Weeks*7*24*60*60)*1000,INT_MAX);
   Print("Скачено "+string(N)+" тиков");
   if(N>0) N=CalculateNewTF(ticks,bars,TF);
   ArrayFree(ticks);
   Print("Сформировано "+string(N)+" баров");
   if(N>0) ShowBars(bars);
   Crash();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason) 
  {
    ArrayFree(bars); 
    if(erase) ChartSetInteger(0,CHART_SHOW,true); 
  }

il ne se plante pas non plus. Au moins, ça ne m'est pas arrivé.
Mais lorsque le TF est modifié, les tableaux doivent être automatiquement nettoyés!

Et je ne comprends pas ce que la fonction Crash() a à faire sans elle, car elle ne lit que les informations sur les indicateurs.
Peut-être que l'exécution de cette fonction ralentit OnDeinit lors du changement de TF et c'est pourquoi MT5 n'a pas le temps de vider la mémoire.
Nous avons des problèmes avec OnDeinit asynchrone depuis longtemps. Ce n'est pas bon ! Le système ne doit pas se planter à cause de l'asynchronisme...

 

Pourquoi lorsque vous faites défiler le graphique avec des indicateurs, le processeur charge le noyau à 100% ?

Après tout, les indicateurs ont été calculés et dessinés, selon l'idée, seule la charge de la mémoire devrait être.

 
Aleksey Vyazmikin:

Pourquoi lorsque vous faites défiler le graphique avec des indicateurs, le processeur charge le cœur à 100% ?

Après tout, les indicateurs sont calculés et dessinés, selon l'idée, seule la charge de la mémoire devrait l'être.

La charge du CPU lors du rendu des graphiques dépend directement des performances de la carte graphique.

Sur les vieux ordinateurs portables dotés de cartes faibles ou sur les serveurs dépourvus de cartes/pilotes vidéo, il y aura inévitablement un pic instantané mais bref de la charge du processeur.

Et le processeur lui-même doit être plus puissant afin d'absorber les demandes accrues sans laisser de trace.
 
Renat Fatkhullin:

La charge du processeur lors du rendu des graphiques est directement liée aux performances de la carte vidéo.

Sur les vieux ordinateurs portables dotés de cartes faibles ou sur les serveurs dépourvus de cartes/pilotes vidéo, il y aura inévitablement une augmentation immédiate mais brève de la charge du processeur.

Et le processeur lui-même doit être plus puissant pour absorber les demandes accrues sans laisser de trace.

Je parle du processeur FX-8350 et d'une carte graphique Radeon HD 7950. Je n'ai pas l'impression que la carte vidéo soit chargée par MT5.

 
Nikolai Semko:

Oui, s'écraser est très difficile. Mieux vaut ne pas prendre de risques.
C'est une question de mémoire, bien sûr.
Si vous nettoyez la mémoire avec l'aide de vos mains comme celles-ci :

alors le crash ne se produit pas non plus. Au moins, ça ne m'est pas arrivé.
Mais lorsque le TF est modifié, les tableaux doivent être automatiquement nettoyés !

Je ne comprends pas, pourquoi devrions-nous nous occuper de la fonction Crash() si elle ne le fait pas, car elle ne lit que les informations sur les indicateurs.
Peut-être que l'exécution de cette fonction ralentit OnDeinit lors du changement de TF, et donc MT5 n'a pas le temps de vider la mémoire.
Il y a des problèmes avec la fonction asynchrone OnDeinit depuis longtemps. Ce n'est pas bon ! Le système ne doit pas tomber en panne à cause de l'asynchronisme.

1) vous devez tronquer l'esturgeon avec INT_MAX(2 bn) ici :

CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,(TimeCurrent()-Weeks*7*24*60*60)*1000,INT_MAX);

nous allons régler cela de notre côté aussi.

2) Toute la mémoire doit être gérée de manière très stricte, pas de GC ici.

3) la réinitialisation des indicateurs lors d'un changement d'horizon temporel est chaude sans réinitialisation physique à partir de zéro, donc vous devez libérer de la mémoire par vous-même. surtout les ressources au niveau global

4) utiliser la POO, cela vous donnera au moins la possibilité de décrire et de contrôler correctement les ressources.