J'ai pensé utiliser un tableau de temps, etc. mais, pendant que j'essaie de trouver les barres, que se passerait-il si une nouvelle barre apparaissait ? les quarts seraient modifiés et ma recherche serait illogique.
Une nouvelle barre ne devrait pas apparaître pendant qu'un EA exécute son code. Il fonctionne avec les données chargées lorsque OnTick() est appelé.
Je ne suis pas sûr de ce qui se passerait si RefreshRates() était utilisé.
Bien que cela n'arrive pas souvent (en fait, très rarement), lors de l'utilisation de RefreshRates(), il m'est arrivé que les données des barres soient décalées en raison de la formation d'une nouvelle barre. Pour contourner ce problème, j'essaie de copier toutes les données nécessaires dans des variables, au début, puis de ne plus faire appel aux tableaux de données historiques ou aux fonctions équivalentes pendant le reste de l'exécution de l'événement. De cette façon, même si dans mon code j'ai besoin d'utiliser la fonction RefreshRates(), je peux toujours me référer en toute sécurité aux conditions initiales.
@paranoyakX : Donc, indépendamment de l'utilisation de la fonction RefreshRates() ou non, vous pouvez essayer une approche similaire. En fait, dans MQL5, vous n'avez pas la même capacité que dans MQL4 et vous DEVEZ copier les données dans vos propres tableaux afin de les traiter. Ainsi, en procédant de cette manière, vous vous rapprochez un peu plus de la possibilité de rendre votre code compatible avec MQL4 et MQL5.
Cependant, la meilleure solution n'est pas de coder tout cela dans l'EA, mais plutôt de coder la plupart de cette logique dans un Indicateur, qui ne souffre pas de ce problème, car l'approche est totalement différente. Essayez de programmer autant que possible la logique du signal dans un indicateur. Ceci est également utile car vous pouvez alors utiliser et tester l'indicateur visuellement jusqu'à ce qu'il fonctionne exactement comme vous le souhaitez. Une autre utilisation de la solution de l'indicateur, est qu'il fournira le signal non seulement pour l'EA mais aussi pour le trading manuel. L'EA n'a alors qu'à se concentrer sur la gestion du trading et non sur la signalisation.
[...] J'ai pensé à utiliser un tableau de temps, etc. mais, pendant que j'essaie de trouver les barres, que se passerait-il si une nouvelle barre apparaissait ? Les décalages seraient modifiés et ma recherche serait illogique.
Ce que vous demandez est potentiellement si simple que je me demande si je ne passe pas à côté de l'essentiel. Étant donné un OrderSelect() précédent, vous pouvez rechercher le décalage de barre associé à son OrderOpenTime() simplement en faisant ce qui suit :
int BarShiftOfOrderOpen = iBarShift(Symbol(), Period(), OrderOpenTime(), false);
Par exemple :
- Graphique H1
- L'heure actuelle est 16:32
- L'ordre a été ouvert à 14:23
- Le code ci-dessus devrait retourner BarShiftOfOrderOpen = 2, c'est-à-dire la barre H1 à 14:00, et Time[BarShiftOfOrderOpen] sera 14:00.
Par exemple :
- Graphique H1
- L'heure actuelle est 16:32
- L'ordre a été ouvert à 14:23
- Le code ci-dessus devrait retourner BarShiftOfOrderOpen = 2, c'est à dire la barre H1 à 14:00, et Time[BarShiftOfOrderOpen] sera 14:00
Oui, c'est exactement ce que l'OP dit, mais ce qu'il se demande, ce n'est pas comment le faire, mais comment empêcher qu'il devienne invalide en raison d'un décalage de barre causé par un nouveau tick entrant formant une nouvelle barre, pendant qu'il traite les données.
Cependant, cela ne devrait PAS se produire, sauf lorsque vous utilisez RefreshRates(). Pour cette possibilité (qui est rare), j'ai suggéré les méthodes alternatives de la même manière que MQL5 le fait.
mais comment éviter qu'il ne devienne invalide en raison d'un décalage de barre causé par un nouveau tick entrant formant une nouvelle barre.
Bonjour les gars,
merci beaucoup pour les réponses,
@FMIC, il est intéressant de noter que je n'ai jamais pensé à utiliser des indicateurs et comme vous le dites, cela pourrait être beaucoup plus facile si je crée et utilise un indicateur, mais bien sûr, cela va apporter de nouvelles questions, comme comment trouver la valeur de l'indicateur qui correspond à mon ordre, etc. En outre, je ne vais pas faire ce processus à chaque fois, juste une fois OnInit(), donc peut-être que l'utilisation d'un EA est acceptable pour cela.
@jjc, merci aussi pour votre solution. J'étais en fait un peu inquiet au sujet de la "nouvelle barre" mais comme vous l'avez tous dit, pendant que l'EA fonctionne, il n'y aura pas de changement de quart (et je n'utilise pas la fonction RefreshRates()) donc je peux utiliser votre code aussi. Je suis juste curieux maintenant après ce que @FMIC a dit, serait-il plus agréable si je crée ceci comme un indicateur ?
Où est-ce que l'OP dit cela ? C'est peut-être la question, mais je pense que vous entendez des bruits de sabots et que vous pensez à des zèbres plutôt qu'à des chevaux. La mention de la persistance de l'état de l'EA dans un fichier à travers les redémarrages de MT4 me suggère que la question est en fait beaucoup, beaucoup plus simple.
Même GumRai s'en est aperçu et l'a cité, ce que je vais faire à nouveau ici :
paranoyakX:
J'ai pensé utiliser Time array etc. mais, pendant que j'essayais de trouver les barres, que se passerait-il si une nouvelle barre apparaissait ? les décalages seraient modifiés et ma recherche serait illogique.
@FMIC, il est intéressant de noter que je n'ai jamais pensé à utiliser des indicateurs et comme vous le dites, cela pourrait être beaucoup plus facile si j'en crée et utilise un, mais bien sûr, cela apportera de nouvelles questions, comme comment trouver la valeur de l'indicateur qui correspond à mon ordre, etc. En outre, je ne vais pas faire ce processus à chaque fois, juste une fois OnInit(), donc peut-être que l'utilisation d'un EA est acceptable pour cela.
@jjc, merci aussi pour votre solution. J'étais en fait un peu inquiet au sujet de la "nouvelle barre" mais comme vous l'avez tous dit, pendant que l'EA fonctionne, il n'y aura pas de changement de quart (et je n'utilise pas la fonction RefreshRates()) donc je peux utiliser votre code aussi. Je suis juste curieux maintenant après ce que @FMIC a dit, serait-il plus agréable si je crée ceci comme un indicateur ?
Ne faites pas attention à ma suggestion si c'est trop compliqué pour vous ! Faites-le de la manière la plus facile pour vous maintenant et quand vous serez plus à l'aise avec, essayez l'autre manière aussi.
PS ! Vous ne devriez pas mettre de code logique dans votre OnInit(), c'est seulement là où vous initialisez les choses et jamais rien à voir avec les données d'un tableau de séries de données historiques. Toute votre logique et votre code principal doivent se trouver dans le OnTick() ou dans le OnCalculate().
Même GumRai l'a remarqué et l'a cité, ce que je vais faire à nouveau ici :
Vous et Gumrai faites une hypothèse massive sur la signification de "si une nouvelle barre apparaît" que les preuves ne justifient pas encore. L'OP n'a pas encore dit "si une nouvelle barre apparaît pendant OnStart".
Je soupçonne que paranoyakX stocke les détails des transactions/signaux dans des variables globales de l'EA. Le problème, je le soupçonne, n'est pas la formation de nouvelles barres pendant un appel à OnStart(), mais plutôt la formation de nouvelles barrespendant la durée de vie de l'EA.
Vous et Gumrai faites une énorme supposition sur la signification de "si une nouvelle barre apparaît" que les preuves ne justifient pas encore. L'OP n'a pas encore dit "si une nouvelle barre apparaît pendant OnStart".
Je soupçonne que paranoyakX stocke les détails des transactions/signaux dans des variables globales de l'EA. Le problème, je le soupçonne, n'est pas la formation de nouvelles barres pendant un appel à OnStart(), mais plutôt la formation de nouvelles barrespendant la durée de vie de l'EA.
Il n'y a pas de OnStart() dans les EA mais je comprends ce que vous voulez dire. Cependant, le PO même en réponse à vos commentaires a dit et je cite :
J'étais en fait un peu inquiet au sujet de la "nouvelle barre", mais comme vous le dites tous, pendant que l'EA fonctionne, il n'y aura pas de changement d'équipe (et je n'utilise pas la fonction RefreshRates()).
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Bonjour à tous,
C'est peut-être une question vraiment idiote mais je n'ai vraiment pas trouvé le moyen de le faire. J'essaie de créer un EA. Après avoir analysé quelques barres, il décide d'ouvrir un ordre ou non. Disons qu'il ouvre un ordre. Si mon EA s'arrête ou que metatrader s'éteint, lorsque je le rouvre, je veux trouver les barres qui ont provoqué l'ouverture de l'ordre. Donc je cherche les ordres et je trouve mon ordre (que l'EA vient d'ouvrir) et je veux commencer à analyser les barres en arrière. Comment puis-je faire cela ? Comment puis-je trouver la barre d'ouverture de mon ordre et commencer à revenir en arrière sur les barres.
Par exemple :
Je fonctionne sur la période H1 et je cherche les barres à 12:00, 13:00, 14:00 et 15:00 puis je décide d'ouvrir un ordre à 16:00. Les barres importantes sont de 12:00 à 15:00 et je veux identifier ces barres à nouveau. Ainsi, lorsque je relance l'EA, je trouve d'abord l'ordre et sa date d'ouverture, je détecte à quelle barre appartient cette date et je commence à revenir en arrière sur les barres avant cette date.
J'ai pensé à utiliser un tableau de temps, etc. mais, pendant que j'essaie de trouver les barres, que se passerait-il si une nouvelle barre apparaissait ? les quarts seraient modifiés et ma recherche serait illogique.
Je ne veux pas non plus écrire ces informations dans un fichier. Cela demande trop de temps et beaucoup de gestion des exceptions, etc.
merci.