Caractéristiques du langage mql5, subtilités et techniques - page 214

 
fxsaber #:

Je n'ai jamais rencontré une entrée comme celle-là auparavant.

Utilisez-le)))

 
Vladimir Simakov #:

Utilisez-le))))

Vladimir, où trouvez-vous des schémas comme celui-ci, j'ai été aidé alors, dans mon sujet sur la recherche de barres, cycle minimal, existe-t-il une image toute faite quelque part ? je suis autodidacte, dans un profil différent à l'origine.

juste en assemblant des circuits logiques comme ça, en additionnant, en faisant défiler les cycles...
 
Vladimir Simakov #:

Donc c'est un bug féroce. Exemple :

La mémoire est allouée, le destructeur est appelé lors de sa libération (ce qui est un indice du comportement attendu selon RAII), mais le constructeur est oublié pour être appelé lors de la création d'un objet)))).

C'est la deuxième erreur {}.

Rappel : 1er avec survol, 3ème avec union

 
Vladimir Simakov #:

Profitez-en))))

Oh, ces laconiques post-incrémentaux... )
 
Fast235 #:

Vladimir, où trouvez-vous de tels schémas, j'ai été aidé alors, dans mon sujet sur la recherche de bars, par un cycle minimum, existe-t-il des images toutes faites quelque part ? je suis autodidacte, dans un profil différent à l'origine.

Il suffit d'assembler des circuits logiques, de les additionner, de faire défiler les cycles...

N'utilisez pas une telle chose, toute faite, sans comprendre. Avec de tels dossiers, si vous avez besoin de quelque chose d'un peu plus compliqué qu'ici, des insectes, pas toujours faciles à trouver, vous pouvez les remplir en un clin d'œil)))).

 
Vladimir Simakov #:

N'utilisez pas un tel produit, prêt à l'emploi, sans le comprendre. Avec de tels dossiers, si vous avez besoin de quelque chose d'un peu plus complexe qu'ici, vous pouvez créer des bugs, pas toujours faciles à trouver, en un tournemain))).

vos recherches de barres, étaient avec des énumérations et des modèles))

J'ai repoussé les modèles pour presque toujours, mais je les ai fait en une heure environ.

les a retirés du code, en même temps que les énumérations, vous aviez probablement une tâche plus sérieuse pour les utiliser

--

ajouter

tout est dans le forum, il suffit de vous remercier.

 
Vladimir Simakov #:

Donc c'est un bug féroce. Exemple :

La mémoire est allouée, le destructeur est appelé lors de sa libération (ce qui laisse entrevoir le comportement attendu selon RAII), mais le constructeur, lors de la création d'un objet, est oublié d'être appelé))).

Merci pour cet article.
Corrigé.

Ce code provoquera une erreur de compilation puisque les séquences d'initialisation dans MQL sont encore incomplètes.

Pour les structures, l'initialisation par séquence n'est pas remplacée par l'appel au constructeur avec les paramètres associés - nous prévoyons de l'ajouter (c'est reporté indéfiniment, mais du nouveau code a "fui" dans la production).



 

@A100

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

Particularités de mql5, trucs et astuces

A100, 2021.11.16 13:43

Cela n'a aucun sens parce que :

struct X {
    int i;
};
void OnStart()
{
    X x[200000] = {};
}

F5 raccroche. En outre, il s'agit d'une solution de rechange contradictoire.


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

Particularités de mql5, trucs et astuces

fxsaber, 2021.11.17 02:07

struct MqlTick2 : private MqlTick {};

void OnStart()
{
  MqlTick2 Ticks[4] = {}; // OK
  
  ZeroMemory(Ticks); // 'Ticks' - not allowed for objects with protected members or inheritance
}

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

Particularités de mql5, trucs et astuces

A100, 2021.11.17 02:20

Vous avez fait la 4ème erreur vous-même. Pourquoi ZeroMemory est-il pire que {} ? C'est-à-dire que nous avons un mécanisme non sanctionné d'accès au privé que le compilateur ne peut pas détecter pour une raison quelconque.

Vous pensez que les développeurs ne vont pas régler le problème ? Il fut un temps où le compilateurne réagissait pas non plus àZeroMemory.


Si vous vous souvenez que mql a été créé à partir de C++, ces deux exemples (leurs homologues) fonctionnent bien là-bas, car ces classes n'ont pas de constructeurs (c'est-à-dire un constructeur implicite) :

  • Déclarer ClassX x[n]={} ; entraîne une initialisation de la valeur de chaque élément du tableau.
  • Si ClassX n'a pas de constructeurs personnalisés (mais a un constructeur par défaut unset), alors l'initialisation zéro des objets de la classe est effectuée - indépendamment de l'existence de champs privés.
  • Mais s'il y a des champs const, le constructeur par défaut sera implicitement supprimé, donc erreur de compilation.

Exemple en C++ :

#include <iostream>
using namespace std;

class X
{
    int a;
    public:
    int get(){return a;}

    //X(){}   //так массив x не обнуляется
    //а если нет конструктора - то обнуляется
};

int main()
{
    X x[10]={};
    for (int i=0; i<10;i++)   cout<<x[i].get()<<endl;
}

Donc, s'il n'y a pas de champs constants dans la structure/classe, la logique est correcte.

 
J'ai oublié d'ajouter que si une classe a des champs (objets) non triviaux, leur c-tor par défaut sera appelé après zero-init de l'objet entier pour de tels champs.
 
fxsaber #:

Je n'ai jamais vu un tel record auparavant.

J'ai regardé mes recherches dans MQL5, c'est peut-être pire, j'ai même gonflé l'historique dans l'indicateur de plusieurs TF :

void FindHighLow(THL &hl[], const ENUM_TIMEFRAMES tf, const datetime start_time, const int sz_buf = 1000)
{
   ZeroMemory(hl);//hl структура
   datetime st = start_time;
   MqlRates rates[];
   for(int i = 0, c = CopyRates(_Symbol, tf, st, sz_buf, rates); ArraySize(rates) > 0 && i < ArraySize(hl);
         st = rates[0].time - PeriodSeconds(tf), c = CopyRates(_Symbol, tf, st, sz_buf, rates))
   {
        for(int j  = ArraySize(rates) - 1; j >= 0 && i < ArraySize(hl); j--)
      	{
		....	
	}
   }


Je peux écrire beaucoup de choses dans l'instruction for )))).