Questions des débutants MQL5 MT5 MetaTrader 5 - page 919
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
Le calcul de votre indicateur se fait du début à la fin (des données historiques les plus récentes aux données actuelles les plus récentes). C'est une indication de l'indexation comme dans les séries chronologiques. Les tableaux doivent donc être indexés en conséquence, et c'est ce que vous avez.
Qu'est-ce qu'il y a de mal à ça ?
Tout fonctionne de la même manière que mon portage en MQL5 à partir de MQL4, mais je vois que le code est laid à cause deArraySetAsSeries(), c'est pourquoi j'ai demandé
Voici les deux codes
apprenez-moi comment écrire cet indicateur pour MT5 ! - Mon code n'est pas beau, point final ! )))
ZSZ ne se souvient pas comment écrire des indicateurs pour MT5, s'est assis et l'a réécrit en 40 minutes en utilisant l'aide, mais le résultat ... imho, pas bon (( !)
Oui, tout fonctionne exactement comme mon portage dans MQL5 à partir de MQL4, mais je vois que le code est laid à cause deArraySetAsSeries(), donc j'ai demandé
Voici les deux codes
apprenez-moi comment écrire cet indicateur pour MT5 ! - Mon code n'est pas beau, point final ! )))
Lorsque vous inversez la boucle, vous devez nécessairement faire des tableaux de séries temporelles, sinon l'indexation des tampons dans la boucle ne coïncidera pas avec l'indexation des données requises - l'index de la boucle dans le tableau des tampons d'indicateurs ira du début à la fin, tandis que dans open[], high[], low[], close[] et autres - de la fin au début. Ou bien, vous pouvez inverser la boucle pour faire correspondre son indexation des tableaux open[], high[], low[], close[] et le reste avec l'indexation des tampons, ce qui est plus compliqué.
Si vous voulez une allégorie pour rendre les choses plus claires, voici une allégorie pour vous :
Vous vous tenez devant la voie ferrée et vous regardez deux trains. Ils vont soit dans une seule direction, soit de gauche à droite (ArraySetAsSeries(array,true) - premier train et une boucle de la limite à 0 - deuxième train),
Ou ils vont l'un vers l'autre - (ArraySetAsSeries(array,false) - de droite à gauche - premier train, et la boucle de la limite à 0 - de gauche à droite - deuxième train)
Et, oui : je n'ai pas regardé le code - je ne veux pas télécharger, sauvegarder (j'ai beaucoup de codes inutiles du forum), les comparer entre eux...
Il serait plus facile de les mettre en codes dans le message - un et deux - alors on verrait tout de suite quoi à quoi.
Ou inverser la boucle pour qu'elle corresponde à l'indexation des tableaux open[], high[], low[], close[] et le reste, ce qui est plus difficile.
J'ai fait marche arrière toute la nuit aujourd'hui, ma patience est à bout (((
D'après ce que je comprends du problème :
- dans MT5, les tableaux qui sont affectés aux tampons d'indicateurs sont indexés de gauche à droite par défaut ;
- dans les séries temporelles MT5,open[], high[], low[], close[] disponibles à partir de OnCalculate() sont toujours transmises indexées de droite à gauche.
- c'est-à-dire sur la base des étapes 1 et 2, afin de calculer l'indicateur de la fin de l'historique à la barre zéro
a) ou réaffecter l'indexation des tableaux de tampons
b) soit de faire une boucle dans laquelle les éléments du tableau seront recalculés de gauche à droite, et dans une autre boucle de droite à gauche :
c'est-à-dire qu'il n'y a pas de belle solution à ma question ? option a) - dans mes sources, c'est implémenté, option b) - je ne vois pas l'intérêt de faire des calculs supplémentaires
sources :
MT5 :
MT4 :
J'ai retourné toute la nuit, mais ma patience est à bout ((()
D'après ce que je comprends du problème :
- dans MT5, les tableaux qui sont affectés aux tampons d'indicateurs sont indexés de gauche à droite par défaut ;
- dans les séries temporelles MT5,open[], high[], low[], close[] disponibles à partir de OnCalculate() sont toujours transmises indexées de droite à gauche.
- c'est-à-dire sur la base des étapes 1 et 2, afin de calculer l'indicateur de la fin de l'historique à la barre zéro
a) ou réaffecter l'indexation des tableaux de tampons
b) soit de faire une boucle dans laquelle les éléments du tableau seront recalculés de gauche à droite, et dans une autre boucle de droite à gauche :
c'est-à-dire qu'iln'y a pas de belle solution à ma question ? variante a) - dans mon code source est implémenté, variante b) - je ne vois pas l'intérêt de faire des calculs supplémentaires
Tous les tableaux sont indexés de droite à gauche. Par conséquent, pour respecter pleinement la boucle de gauche à droite (et c'est bien de gauche à droite - de la limite à 0), vous devez définir tous les tableaux utilisés avec l'indexation requise : les tampons dans OnInit(), les serveurs de temps utilisés - dans OnCalculate().
Ou bien, faire le cycle de 0 à la limite, ce qui n'est pas toujours facile à faire lorsque mql4 est porté à mql5.
Par conséquent, l'option ArraySetAsSeries() est préférable dans ce cas.
Tous les tableaux sont indexés de droite à gauche. Par conséquent, pour respecter pleinement la boucle de gauche à droite (et c'est de gauche à droite de la limite à 0), vous devez définir tous les tableaux utilisés à l'indexation requise : les tampons dans OnInit(), les serveurs de temps utilisés - dans OnCalculate().
Ou bien, il faut faire le cycle de 0 à la limite, ce qui n'est pas toujours facile à faire lorsque mql4 est porté à mql5.
C'est pourquoi, dans ce cas, la méthode ArraySetAsSeries() fonctionne mieux.
Regardez, supprimez tous lesArraySetAsSeries() de votre code(ci-dessus dans Init() et OnCalculate() dans les premières lignes) et corrigez la boucle:
pour(i=0;i<limite;i++)
Théoriquement, tout devrait s'emboîter ! Mais non ! Les cartes sont différentes - c'est ce que je n'arrive pas à comprendre !
Regardez, j'ai supprimé tous lesArraySetAsSeries() de mon code(en haut dans Init() et dans OnCalculate() dans les premières lignes) et j'ai réparé la boucle:
pour(i=0;i<limite;i++)
En théorie, tout devrait s'emboîter ! Mais non ! Les tableaux sont différents, et c'est ce que je n'arrive pas à comprendre !
Je vous le dis, c'est plus compliqué que ça. Vous devez changer la logique. Il ne suffit pas d'inverser la boucle.
Voici un petit exemple : dans le code il y a
Buf_NTLine1[i+1])
Où ira l'indice i+1 lorsque les tableaux seront indexés différemment ?
Et il y en a beaucoup. IHighest() - début et numéro. Où commence-t-on à une indexation et où commence-t-on à une autre ?
Et ainsi de suite...
et il y en a beaucoup. IHighest() - début et nombre de... Où commence-t-il à une indexation et à une autre ?
oh mec ! c'est vrai ! bien joué ! !! ouais, c'est la partie délicate ! !!
Ouais... beaucoup de différences dans MT5, beaucoup de contrôles et toutes sortes de précautions sur la tête du programmeur...
Quand j'ai vu ce message il y a quelques temps, il semblait que dans MT5 tout n'est pas toujoursinitialisé correctement dansInit(), il semble queInit() puisse se terminer même si les timeframes ne sont pas prêts.
J'ai vu un bug hier : si cet indicateur dans MT5 change de timeframes, parfois les tampons de l'indicateur ne sont pas vides - il semble que les anciennes valeurs restent sinon pour assigner une valeur spécifique à chaque élément du tableau de l'indicateur dans OnCalculate(), j'ai essayéde mettre ArrayInitialize(arr, 0.0) dansInit()- ça marche aussi, puis plus...
pour autant que je comprenne bien :
- dans MT5, à l'initialisation dansInit(), les tampons des indicateurs ne sont pas initialisés automatiquement ? (dans MT4, je ne me souviens pas que quelque chose soit resté dans les tampons).
- dans MT5 dansInit() les tailles des tableaux de tampons peuvent être inconnues si l'historique n'est pas chargé, c'est pourquoiArrayInitialize(arr, 0.0) n'initialise pas toujours les tampons correctement ?
Bon sang ! C'est ça ! Bien joué ! !! Ouais, c'est la partie amusante ! !!
Ouais... Il y a beaucoup de différences dans MT5, beaucoup de contrôles et toutes sortes de précautions sur la tête du programmeur...
Quand j'ai vu ce message il y a quelques temps, il semblait que dans MT5 tout n'est pas toujoursinitialisé correctement dansInit(), il semble queInit() peut se terminer même si les timeframes ne sont pas prêts.
J'ai vu un bug hier : si cet indicateur dans MT5 change de timeframes, parfois les tampons de l'indicateur ne sont pas vides - il semble que les anciennes valeurs restent sinon pour assigner une valeur spécifique à chaque élément du tableau de l'indicateur dans OnCalculate(), j'ai essayéde mettre ArrayInitialize(arr, 0.0) dansInit()- ça marche aussi, puis plus...
pour autant que je comprenne bien :
- dans MT5, à l'initialisation dansInit(), les tampons des indicateurs ne sont pas initialisés automatiquement ? (dans MT4, je ne me souviens pas que quelque chose soit resté dans les tampons).
- dans MT5 dansInit() les tailles des tableaux de tampons peuvent être inconnues si l'historique n'est pas chargé, c'est pourquoiArrayInitialize(arr, 0.0) n'initialise pas toujours les tampons correctement ?
Je ne suis pas vraiment entré dans la logique de tout ça.
Je ne suis pas vraiment entré dans la logique de tout ça.
C'est la bonne façon de procéder : ne pas placer les points d'entrée au prix max/min - mieux vaut les placer au prix d'ouverture.
Et les lignes devraient être supprimées - à quoi servent-elles sur le graphique ? Ne serait-ce que pour leur mettre un frein ?
déclaration sans type
Si je compile un fichier include, il n'y a pas d'erreur. Si je compile le fichier du programme principal où j'inclus ce fichier include, il y a une erreur de déclaration sans type. Il ne voit pas l'objet déclaré dans le fichier include protected CSomeClass *object. Le fichier d'inclusion contient la directive #include "SomeClass.mqh". Et dans le fichier principal, un objet de la classe du fichier inclus est créé et l'une des méthodes est appelée.