Erreurs, bugs, questions - page 815

 
tol64:

Pouvez-vous me dire pourquoi une erreur se produit lors de la récupération d'un handle d'indicateur, si le nom de l'indicateur à appeler est contenu dans une variable ?

Je veux dire, il n'y a pas d'erreur comme ça :

C'est ainsi que nous obtenons l'erreur 4802 (Indicator cannot be created) :

Pour en savoir plus surtester_indicator , cliquez ici.
 
marketeer:
Pour en savoir plus surl'indicateur tester_indicator , cliquez ici.
Oui, j'ai tout lu et relu plusieurs fois déjà. )) Mais je n'ai pas réussi à obtenir ce dont j'ai besoin. Et je dois définir le nom de l'indicateur dans une variable.
 
tol64:
Je l'ai lu et relu en entier, encore et encore. )) Mais je ne peux pas obtenir ce dont j'ai besoin. Et je dois définir le nom de l'indicateur dans une variable.
Avez-vous ajouté la propriété test_indicator ? Je suppose que je ne peux pas le faire sans elle.
 
marketeer:
Avez-vous ajouté la propriété test_indicator ? Je ne pense pas que j'aurais pu le faire sans ça.

J'ai essayé. Quelque chose ne fonctionne pas comme ça. Pourriez-vous me montrer un exemple (peut-être que je m'y prends mal) ?

P.S. Ça a marché. C'est on ne peut plus simple. Va te reposer. ))

P.S2. Mais je suis dépendant du fait que je dois enregistrer tous les indicateurs à travers la propriété test_indicator. C'est-à-dire que si le nom de l'indicateur est spécifié par un paramètre externe et qu'un utilisateur a un nouvel indicateur, nous devons ouvrir le code à nouveau. Ce n'est pas exactement ce que nous voulons.

 
tol64:

P.S2. Mais nous avons toujours la dépendance de devoir écrire tous les indicateurs via la propriété test_indicator. C'est-à-dire que si le nom de l'indicateur est spécifié par un paramètre externe et qu'un utilisateur a un nouvel indicateur, nous devons ouvrir le code à nouveau. Ce n'est pas exactement ce que nous voulons.

Il se fait en cinq. Je l'ai utilisé pour construire des indices à partir d'autres indices choisis au hasard. Peut-être les développeurs nous diront-ils ce qu'ils en pensent.
 
marketeer:
C'est ainsi que cela se passe en cinq. Je l'ai moi-même utilisé pour construire des indices à partir de plusieurs autres indices choisis au hasard. Peut-être les développeurs nous diront-ils ce qu'ils en pensent.

Le problème est que les EA dans le testeur MT5 sont lancés en dehors du terminal et ne disposent pas de tout l'environnement de bibliothèque qui existait dans MT4.

Par exemple, le conseiller expert est envoyé au nuage du tout et pour passer des liens supplémentaires, nous devons :

  1. utiliser des noms d'indicateurs statiques dans les appels, ce qui permet au compilateur de prescrire automatiquement les dépendances de l'expert
  2. prescrire explicitement par propriété la liste des indicateurs requis pour construire manuellement la liste des dépendances.

Si des appels d'indicateurs dynamiques sont utilisés, vous devez alors prescrire manuellement la liste des indicateurs utilisés. Lors de l'exécution d'un test tiers, tous les fichiers dépendants sont envoyés avec le conseiller expert. Il peut s'agir d'agents locaux (qui se trouvent de toute façon à l'extérieur du terminal), d'agents distants ou d'agents en nuage.

C'est le prix à payer pour "appuyer sur démarrer et ne penser à rien d'autre, tout fonctionne automatiquement".

Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.
 
Renat:

Le fait est que les EA du testeur MT5 fonctionnent en dehors du terminal et ne disposent pas de tout l'environnement de bibliothèque dont disposait MT4.

C'est le prix à payer pour "appuyer sur démarrer et ne penser à rien d'autre, tout fonctionne automatiquement".

C'est compréhensible, mais d'un autre côté les utilisateurs ont régulièrement une contre question, car la flexibilité habituelle et efficace a été perdue. Vous n'avez en fait implémenté qu'un modèle de liaison statique. Et les gens demandent aussi des liens dynamiques. L'idée est que même si quelque chose est envoyé dans le nuage, commence à être compté et accède soudainement à une tourelle externe, vous pouvez l'interroger et le récupérer de la même manière que le reste de l'environnement, qui est transmis du terminal à l'agent. Eh bien, c'est juste une pensée à voix haute. Je n'ai pas posé cette question ;-).
 

Cette question a peut-être déjà été posée, mais je ne l'ai pas trouvée dans le forum.

Dans le code suivant (dans la méthode test()), lorsqu'on prend un descripteur constant (référence) à un objet et qu'on l'assigne à un objet non constant, le compilateur (MetaEditor 5.00, Build 687) ne génère pas d'erreur :

class A{
   public:
      void someDo() {}
};

class B{
   public:
      void B( A* aA ) : mA( aA ) {}
      const A* getA() { return (mA); }   
   private:
      A* mA;
};

void test(){
   A a;
   B b( GetPointer( a ) );

   //Ошибки нет. И это правильно   
   const A* a1 = b.getA();
   //Ошибка есть: "...someDo' - call non-const method for constant object..". И это правильно   
   a1.someDo();
   
   //Ошибки нет. Это НЕ правильно(CONST A* B::getA())!
   A* a2 = b.getA();
   //ошибки нет. Правильно (а2 не const)
   a2.someDo();
}
 
mvk:

Cette question a peut-être déjà été posée, mais je ne l'ai pas trouvée dans le forum.

Dans le code suivant (dans la méthode test()), lorsque l'on obtient un descripteur (référence) constant d'un objet et qu'on l'assigne à un objet non constant, le compilateur (MetaEditor 5.00, Build 687) ne génère pas d'erreur :

ce serait le cas sans l'erreur.

class A{
   public:
      void someDo() const {};
};
 

question pour les développeurs sur la vitesse des pointeurs d'objets


Pourquoi le premier code

class CSomeObj
{
public:
   double prm;
};

CSomeObj arr;

void OnStart()
{
        EventSetTimer(1);

        uint s0=GetTickCount();
        for (int i=0; i<100000000; i++) arr. prm=10;
        Print("1=", GetTickCount()-s0);
        
        s0=GetTickCount();
        CSomeObj *item=GetPointer(arr);
        for (int i=0; i<100000000; i++) item. prm=10;
        Print("2=", GetTickCount()-s0);
}

fonctionne deux fois plus vite que le second ?

2012.08.21 09:56:40 info (EURUSD,D1) 2=1654
2012.08.21 09:56:38 info (EURUSD,D1) 1=795

pouvez-vous l'optimiser pour augmenter la vitesse ?

Raison: