Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1740

 
Maxim Kuznetsov #:

ne dites pas aux gens ce qu'ils doivent faire.

Vous devez vous souvenir de vos données et travailler avec elles.

Maxim, dans cette situation, tu n'as pas besoin de te souvenir de quoi que ce soit. Il est beaucoup plus sûr de regarder simplement la position fermée précédente.

Vous n'avez rien à faire pour mémoriser les données et les restaurer après une situation anormale. Si la borne est fermée, les données de position seront perdues. Par conséquent, lorsque vous les mémorisez, vous devez immédiatement envisager la possibilité de les restaurer rapidement et efficacement.

(On ne peut pas dire que la mémorisation d'un ordre dans les commentaires soit une solution fiable - cela revient à s'en remettre à la volonté du courtier/commerçant).

Et ce qui est intéressant, c'est qu'il va lire ces données de quelque part de toute façon. Alors ne serait-il pas plus facile de le lire directement à la source ?

 
Sergey Zhukov #:

Comment puis-je forcer le compilateur à compiler pour MT4 et non MT5 ?

#ifdef __MQL4__

#else

#endif
 
Artyom Trishkin #:

Maxim, dans cette situation, tu n'as pas besoin de mémoriser quoi que ce soit, nulle part. Il est beaucoup plus sûr de regarder simplement la position fermée passée.

Vous n'avez pas à vous soucier de mémoriser les données et de les restaurer en cas d'urgence. Si la borne est fermée, les données de position seront perdues. Par conséquent, lorsque vous les mémorisez, vous devez immédiatement envisager la possibilité de les restaurer rapidement et efficacement.

(On ne peut pas dire que la mémorisation d'un ordre dans les commentaires soit une solution fiable - cela reviendrait à s'en remettre à la volonté du courtier/commerçant).

Et ce qui est intéressant, c'est qu'il va lire ces données de quelque part de toute façon. Alors ne serait-il pas plus facile de le lire directement à la source ?

et ensuite "pourquoi OnTimer ne tient pas en quelques secondes ou OnTick rate complètement" :-)

Restaurer l'état une fois à l'initialisation (soit en lisant un fichier ou en parcourant l'historique/environnement) et c'est tout... La dernière commande ainsi que ses caractéristiques sont stockées dans une variable et sont toujours connues.

 
Maxim Kuznetsov #:

et ensuite le thème "pourquoi OnTimer ne tient pas dans quelques secondes ou OnTick rate sauvagement" suit :-)

Lors de l'initialisation, il faut restaurer l'état une fois (soit en lisant un fichier, soit en consultant l'historique/environnement) et c'est tout... La dernière commande ainsi que ses caractéristiques sont stockées dans une variable et sont toujours connues.

Pour savoir comment la dernière position a été fermée, vous devez la trouver. Après tout, tant qu'elle est ouverte, il n'y a aucun moyen d'enregistrer et de se rappeler comment elle a été fermée, car elle est toujours ouverte.

Il est possible de stocker un ticket de la dernière position ouverte et de l'utiliser pour déterminer comment elle a été fermée, mais ... Lorsque l'on manipule une position, alors qu'elle est ouverte, son ticket peut changer. Par conséquent, nous devons implémenter une fonctionnalité pour réécrire le ticket modifié. Tout cela complique le code.

J'ai seulement suggéré de rechercher la dernière position fermée. Et il combine la recherche de toutes les positions lors du redémarrage de l'EA et lit les données d'une seule position lors de la fermeture d'une nouvelle position.

Après tout, j'espère que tout le monde comprend que nous n'avons pas besoin de passer en boucle toutes les positions historiques, mais seulement la dernière. C'est-à-dire que nous ne retenons qu'une seule variable de l'index de la boucle - sa valeur actuelle, et nous démarrons une nouvelle boucle (lorsque le nombre d'ordres historiques augmente) à partir de la valeur de cette variable, et non à partir de zéro. Et la valeur de cette variable est écrite dans OnInit() au démarrage et au redémarrage de l'Expert Advisor, ainsi qu'à la fermeture d'une nouvelle position. De cette façon, nous évitons d'avoir à écrire et à lire les données de position et à travailler avec le lecteur.

Je pense que cette approche est la plus rentable, car

1. Vous devez seulement vous souvenir de la valeur de l'index de la boucle
2. Obtenir des données uniquement au moment nécessaire en utilisant un accès direct à un ordre fermé en utilisant son index
3. Vous n'avez pas besoin de créer une fonction de lecture/écriture
4. Il est plus rapide à la fois pour travailler et pour écrire.

Et, oui, je suis d'accord pour dire que vous devez connaître toutes vos données - je le fais moi-même. Mais il est souhaitable de les connaître, ce qui est bénéfique pour le programme et pour vous-même.

 
Ivan Butko #:

Merci pour ces informations !

Si vous avez le temps, veuillez répondre à la question suivante :

Sur un historique de N bougies, deux objectifs dirigés différemment sont définis : Close[N]+50*Point et Close[N]-50*Point.
Ensuite, il existe une condition selon laquelle le prix doit atteindre l'un des objectifs (si (High[i]> Close[N]+50*Point) ou (si (Low[i]<Close[N]-50*Point)
Lorsque la condition est remplie, la distance entre Close[N] et High[i] est écrite dans le tableau x[high]=High[i].
Ensuite, il est jeté au hasard sur n'importe lequel des graphiques à n'importe quel moment.

Et lors de la vérification via Print(x[high]), 1 à 2 valeurs sur 10 affichent moins de 50 ! L'un en a 12, l'autre 49. Bien qu'il soit strictement indiqué+50*Point. 8-9 sont corrects (plus de 50) et 1-2 sont anormaux. Ce n'est pas par le biais du testeur, mais avec un graphique réel je place un Expert Advisor (sans aucune fonction de trading), mais avec les susmentionnés il travaille avec l'historique et affiche des résultats incorrects.

Plus la valeur est grande, moins ces erreurs se produisent. Je pensais que c'était la propagation qui interférait, mais... Je ne pense pas qu'il existe un spread sur l'historique dans MT4.

Résolu.

 
Dois-je ajouter RefreshRates() à OnTimer(), ou le timer se met-il à jour par défaut ?
 
Ivan Butko #:
Dois-je ajouter RefreshRates() à OnTimer(), ou le timer se met-il à jour par défaut ?
Ce n'est pas le cas.
 
Aliaksandr Hryshyn #:
Ne se met pas à jour

Merci.

 
Artyom Trishkin #:

Pour savoir comment la dernière position a été fermée, il faut la trouver. Tant qu'il est ouvert, il n'y a aucun moyen d'enregistrer et de se rappeler comment il a été fermé - il est toujours ouvert.

Il est possible de stocker un ticket de la dernière position ouverte et de l'utiliser pour déterminer comment elle a été fermée, mais ... Lorsque l'on manipule une position, alors qu'elle est ouverte, son ticket peut changer. Par conséquent, nous devons implémenter une fonctionnalité pour réécrire le ticket modifié. Tout cela complique le code.

J'ai seulement suggéré de rechercher la dernière position fermée. Et il combine la recherche de toutes les positions lors du redémarrage de l'EA et lit les données d'une seule position lors de la fermeture d'une nouvelle position.

Après tout, j'espère que tout le monde comprend que nous n'avons pas besoin de passer en boucle toutes les positions historiques, mais seulement la dernière. C'est-à-dire que nous ne retenons qu'une seule variable de l'index de la boucle - sa valeur actuelle, et nous démarrons une nouvelle boucle (lorsque le nombre d'ordres historiques augmente) à partir de la valeur de cette variable, et non à partir de zéro. Et la valeur de cette variable est écrite dans OnInit() au démarrage et au redémarrage de l'Expert Advisor, ainsi qu'à la fermeture d'une nouvelle position. De cette façon, nous évitons d'avoir à écrire et à lire les données de position et à travailler avec le lecteur.

Je pense que cette approche est la plus rentable, car

1. Vous devez seulement vous souvenir de la valeur de l'index de la boucle
2. Obtenir des données seulement au moment nécessaire en utilisant un accès direct à un ordre fermé en utilisant son index
3. Vous n'avez pas besoin de créer une fonction de lecture/écriture
4. Il est plus rapide à la fois pour travailler et pour écrire.

Et, oui, je suis d'accord pour dire que vous devez connaître toutes vos données - je le fais moi-même. Mais il est souhaitable de les connaître dans l'intérêt du programme et de vous-même.

Je n'ai pas remarqué que le ticket d'une position change, alors qu'elle est ouverte. Il est généralement égal au ticket de la première commande, qui a ouvert cette position.

Dernier point - que se passe-t-il s'il y a plus d'un EA qui négocie sur le symbole, plus le trading manuel ?
 
JRandomTrader #:

Je n'ai pas remarqué que le ticket d'une position change lorsqu'elle est ouverte. Il est généralement le même que le ticket du premier ordre qui a ouvert la position.

Dernier point clos - mais que se passe-t-il s'il y a plus d'un EA qui négocie sur le symbole, plus le trading manuel ?

Un remplissage ou une fermeture partielle, et le ticket est différent. Nous devons déterminer quel ticket provient de quelle personne, et réécrire celui dont on se souvient. Cependant, il n'est pas évident de savoir de quelle plateforme il s'agit. Les deux sont légèrement différentes, mais il faut tout de même garder une trace.

Il s'agit du "dernier fermé appartenant à cet EA".

Raison: