Erreurs, bugs, questions - page 2708

 

C'est censé être comme ça ?

class cA
  {
public:
   int               Add(int i1,int i2)
     {
      return i1+i2;
     };
                     cA()
     {
      Print("+++");
     };
                    ~cA()
     {
      Print("---");
     };
  };

void OnStart()
  {
   cA a=cA();
  }

Journal :

2020.04.17 18:39:32.996 test3 (EURUSD,M1)       +++
2020.04.17 18:39:32.996 test3 (EURUSD,M1)       +++
2020.04.17 18:39:32.996 test3 (EURUSD,M1)       ---
2020.04.17 18:39:32.996 test3 (EURUSD,M1)       ---

Double appel au constructeur et au destructeur, comme si deux objets étaient créés et supprimés. Tout va bien quand on utilise les fonctions "nouveau" et "supprimer".

Construire 2380.

 
Aliaksandr Hryshyn:

comme si deux objets étaient créés et supprimés.

C'est comme ça.

 
fxsaber:

Elle l'est.

Et mon objet est créé en second :

class cA
  {
public:
   int               my_i;
   int               Add(int i1,int i2)
     {
      return i1+i2;
     };
                     cA()
     {
      static int i=0;
      my_i=i;
      i++;
      Print("+++");
     };
                    ~cA()
     {
      Print("---");
     };
  };

void OnStart()
  {
   cA a=cA();
   Print(a.my_i);
  }
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       +++
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       +++
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       ---
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       1
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       ---
 
Aliaksandr Hryshyn:

Et mon objet est créé en second :

Premier objet.

cA a=cA();


Deuxième objet.

cA a=cA();
 

Alors c'est comme ça que ça doit être :

cA a;
Print(a.my_i);
 
Stanislav Korotky:

Sur mon ordinateur, une année est testée en quelques minutes. Il est impossible de savoir pour l'instant ce qui se passe réellement dans l'autovalidateur et pourquoi il ralentit.

Un an en quelques minutes, c'est beaucoup. Presque personne n'aurait attendu (s'il s'agissait d'une EA).
Est-ce qu'il dessine visuellement normalement ? Est-il possible de comprendre quelque chose en observant le testeur ?

Ajouter une fiche pour le marché - accélérer les calculs au détriment de la précision (si possible), ou dessiner carrément "quelque chose de similaire". Le produit est clairement spécifique, et quiconque en a besoin sera en mesure de commuter le bon paramètre.

 
Andrey Khatimlianskii:

Un an en quelques minutes, c'est beaucoup. Presque personne n'aurait attendu (s'il s'agissait d'une EA).
Et visuellement, le dessin est-il correct ? Est-il possible de comprendre quelque chose en observant le testeur ?

Ajoutez un talon pour le marché - en accélérant les calculs au détriment de la précision (si possible), ou en dessinant "quelque chose de similaire". Le produit est clairement spécifique, et quiconque en a besoin sera en mesure de commuter le bon paramètre.

A mon avis, un an en quelques minutes en mode potic est très bien. Il y avait autrefois une limite de 15-20 minutes pour les championnats (je ne me souviens plus exactement). Une stalle a déjà été ajoutée (time-lapse trottling). Vous pouvez sauter des ticks, mais alors l'intérêt du produit disparaît. La spécificité est un concept relatif : je sais que beaucoup fonctionnent en mode tic-tac (et ils ont tous un add-on avec vérification du prix et/ou du volume). Et d'autant plus important, pour avoir des critères plus précis, plus un retour d'information de l'autovalidateur (si on dit "votre terminal ne fonctionne pas" dans le forum, on MQ qu'est-ce qu'on demande ? - Donnez les journaux et les conditions de reproduction ; ici, nous recevons un message indiquant que notre produit ne fonctionne pas, mais pas de précisions). Et il est plus correct de prendre en compte les spécificités du produit. Après tout, le temps d'exécution total du produit n'est pas seulement le temps du code MQL, mais le terminal lui-même. Il existe des appels plus coûteux tels que CopyTicksRange. Ces frais généraux sont maintenant considérés comme des défauts dans le produit MQL.

PS. Dans le cas des indicateurs, il semble que ce ne soit pas le fonctionnement par ticks qui soit le plus critique, mais le nombre de buffers (ils sont nombreux en raison des particularités de la tâche). J'essaierai d'en limiter le nombre pour le testeur (cela rend le produit plus compliqué et plein d'erreurs, ainsi que d'autres drapeaux imposés par des conditions extérieures, comme le trot). Cela prouve une fois de plus la nécessité pour l'autovalidateur de faire varier la note de performance sur plusieurs paramètres.

PPS. Je demande des tics pour le dernier jour, et le testeur les charge pour 2 ans - et cela prend aussi du temps.

 
Stanislav Korotky:

PPS. Je demande des ticks pour le dernier jour et le testeur les charge pour 2 ans.

Pour une raison quelconque, ce comportement est officiel.

Je suppose qu'ils ne devraient pas générer de barres du tout pour les conseillers experts qui n'utilisent pas d'indicateurs ou de barres d'adresse, etc.

Par exemple, s'il n'y a que SymbolInfoTick - ne pas générer de barres, ne pas stocker l'historique pour les copyticks.


Pas du tout clair sur cette barophilie pour un outil d'algotrading sérieux comme le Tester. Mais puisque même les esthètes du MO continuent de croquer ce cactus, il n'y a probablement pas de compréhension.

 

Pourquoi en MQL je ne peux pas appeler le constructeur protégé à partir de ma méthode d'usine ?

class A1
{
  protected:
    A1(const bool x = false){}
  public:  
    static A1 *creator()
    {
      return new A1(true);
    }
};

void OnStart()
{
  A1 *a = A1::creator();
}

Le code donne une erreur de compilation "'A1::A1' - cannot access protected member function", et il spécifie la ligne où la description de la classe commence, pas celle où le constructeur est appelé (c'est-à-dire que je dois chercher manuellement où se trouve le problème).

Mais le fait est qu'il ne devrait pas y avoir d'erreur du tout. Le C++ se compile sans problème.

 
Stanislav Korotky:

Pourquoi ne puis-je pas appeler un constructeur protégé à partir de ma méthode d'usine en MQL ?

Le problème est la valeur par défaut, si vous la supprimez, tout fonctionne comme il se doit :

class A1
{
  protected:
    A1(const bool x = false){}
  public:  
    static A1 *creator()
    {
      return new A1(true);
    }
};

void OnStart()
{
  A1 *a = A1::creator();
}