Questions des débutants MQL5 MT5 MetaTrader 5 - page 1332
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
En fouillant dans la documentation et les forums ...
Comment rendre les variables de type pointeur globales [dans l'exemple var], si elles sont créées dans OnInit() par string :
et le nombre d'objets et les paramètres du constructeur sont inconnus à l'avance et sont calculés dans OnInit() ?
C'est facile.
Bonjour
mt5 a un bouton crosshair
Lorsque vous appuyez sur ce bouton sur le graphique, il indique le nombre de barres, le nombre de pips et le pourcentage.
Aidez-moi à calculer correctement cette valeur afin que je puisse la lier à mon robot.
Merci.
La nouvelle classe de bar est-elle déjà en place ?
Et à quoi ressemblent exactement les paramètres d'entrée ?
La classe est empruntée à: https://www.mql5.com/ru/code/768, modifications mineures apportées
Il est destiné à être appliqué comme suit :
Facile.
Merci pour la réponse)
C'est ce que j'ai fait au début.
L'objet est donc créé deux fois, d'abord vide, puis comme il devrait l'être par un constructeur avec des paramètres.
Mais... Dans ce cas, le compilateur imprime un avertissement sur la ligne dans OnInit() :
la déclaration de 'var1' cache la variable globale -> sur la ligne dans OnInit()
voir la déclaration précédente de 'var1'.
Donc une variable locale cache une variable globale ... Alors, que se passe-t-il ?
Quelle variable sera ensuite vue par une autre fonction, OnTick(), par exemple ? La variable globale est =NULL, la variable locale est initialisée correctement mais ne peut être vue par une autre fonction ...
La classe est empruntée à: https://www.mql5.com/ru/code/768, avec des modifications mineures
Il est censé être appliqué comme suit :
Extraire toutes les sous-chaînes des paramètres d'entrée et les utiliser pour créer les noms des symboles et des délais correspondants.
Créez ensuite de nouveaux objets barres à partir de ces listes et placez le pointeur de chaque objet à créer - "New Bar" - dans CArrayObj qui est déclaré globalement.
Ensuite, il reçoit un pointeur vers le prochain objet de la liste dans la boucle OnTimer() et vérifie la présence d'une nouvelle barre. S'il n'y a pas de nouvel objet, vous devez passer au suivant, s'il y en a un, vous devez faire ce que vous devez faire lorsqu'un nouveau bar s'ouvre.
Le minuteur doit être réglé en fonction de vos besoins - milliseconde, seconde, minute - en général, avec la fréquence que vous jugez suffisante pour répondre à une nouvelle barre sur un symbole non courant.
Merci pour la réponse)
Au début, je l'ai fait.
L'objet est donc créé deux fois, d'abord vide, puis comme il devrait l'être par un constructeur avec des paramètres.
Mais... Dans ce cas, le compilateur imprime un avertissement sur la ligne dans OnInit() :
la déclaration de 'var1' cache la variable globale -> sur la ligne dans OnInit()
voir la déclaration précédente de 'var1'.
Donc une variable locale cache une variable globale ... Alors, que se passe-t-il ?
Quelle variable sera ensuite vue par une autre fonction, OnTick(), par exemple ? La variable globale est =NULL et la variable locale est initialisée correctement, mais ne peut pas être vue par une autre fonction.
Regardez bien. Ce n'est pas ce que vous avez fait.
À partir des paramètres d'entrée, toutes les sous-chaînes doivent être extraites, à partir desquelles les noms des symboles et les délais correspondants doivent être compilés.
Ensuite, créez de nouveaux objets barres à partir de ces listes et placez un pointeur vers chaque nouvel objet dans CArrayObj qui est déclaré au niveau global.
Ensuite, il reçoit un pointeur vers l'objet suivant de la liste dans la boucle OnTimer() et vérifie la présence d'une nouvelle barre. S'il n'y a pas de nouvel objet, vous devez passer au suivant, s'il y en a un, vous devez faire ce que vous devez faire lorsqu'un nouveau bar s'ouvre.
Créez un minuteur en fonction de vos besoins - milliseconde, seconde, minute - en général, avec la fréquence que vous jugez suffisante pour répondre à une nouvelle barre sur un symbole non courant.
C'est ce que je faisais, mais ArrObj.At(0) n'appelle pas les fonctions membres de laclasse...
Regardez de plus près. Ce n'est pas ce que tu faisais.
Déjà remarqué)
La solution consiste donc à déclarer des objets globalement vides.....
Et si vous ne savez pas à l'avance combien il y en aura ? Il suffit de déclarer "avec réserve" :)
P.S. Je n'ai pas trouvé cette façon de déclarer des objets dans l'aide intégrée.
CObj* var1 = NULL;
Déjà remarqué)
La solution consiste donc à déclarer des objets globalement vides.....
Et si vous ne savez pas à l'avance combien il y en aura ? Il suffit de les déclarer "avec réserve" :)
Mettre dansCArrayObj.
La fonctionArrObj.At(0) renvoie un pointeur vers la classe de base, qui ne sait rien des membres de la classe dérivée.
Pour y faire référence, il suffit d'effectuer une conversion de type.
CIsNewBar* newBar = (CIsNewBar*)ArrayObj.At(0); newBar.method( parameter );
Mettre dansCArrayObj.
La fonctionArrObj.At(0) renvoie un pointeur vers la classe de base, qui ne sait rien des membres de la classe dérivée.
Il suffit de faire une conversion de type pour s'y référer.
Merci pour la réponse, vous n'êtes pas maléfique du tout)
Tout s'explique maintenant)
UPD
C'est la construction qui fonctionne aussi
CIsNewBar* newBar = ArrayObj.At(0); newBar.method( parameter )