Le problème du transfert de MT4 à MT5. Ou, plus précisément, l'impossibilité d'exécuter certains algorithmes dans MT5 sans "err". - page 4

 
Eugeni Neumoin:

Il n'y a pas de problème avec OnCalculate(). L'ensemble de l'interface graphique fonctionne grâce à OnChartEvent() . Il y a plus de 400 boutons dans l'interface graphique. Certains boutons n'interagissent en aucune façon avec la série chronologique. Les fonctions OnCalculate() et OnTrade() peuvent attendre le prochain tick. Cela n'est pas perceptible sur le plan psychologique. Et c'est plus compliqué avec OnChartEvent(). La psychologie humaine est ici impliquée. L'utilisateur du programme appuie sur le bouton GUI. Et il/elle n'obtient pas la réponse qu'il/elle souhaite. Quelle est sa réaction ? L'une des réactions est qu'il/elle appuie une seconde fois sur le même bouton. J'ai fait en sorte qu'une deuxième pression sur de nombreux boutons désactive la fonctionnalité liée à ce bouton. J'anticipe votre suggestion de rendre l'action du bouton désactivable d'une autre manière. Mais il existe le même programme pour MT4. Il y fonctionne normalement. Il s'avère que MT4 a un algorithme d'interaction avec l'interface graphique tandis que MT5 en a un autre. Un tel comportement du même programme ne peut que provoquer le rejet.

J'ai fait quelque chose de similaire lors de la traduction vers MT5 - j'ai activé la sortie de OnChartEvent(). Je ne veux pas mentir, c'est pourquoi l'interface graphique était en train de mourir.

Et dans mon cas, la référence à la timeseries dans OnTimer() se produit après 5 minutes. Je le ferai après 2 minutes. Je vais vérifier ce qui va se passer.

Artem, vos suggestions ont déjà été utiles auparavant.

Non, il n'y aura certainement aucune suggestion visant à modifier la logique de travail avec les graphiques - le code multiplateforme devrait fonctionner de la même manière.

  1. L'application aux séries temporelles doit être effectuée au moins une fois toutes les deux minutes - ce n'est que dans ce cas qu'il sera garanti d'être toujours à jour. C'est-à-dire, en multi... indicateurs, cette partie du code doit être par défaut.
  2. Dans MQL5, contrairement à MQL4, le graphique doit être mis à jour en utilisant CartRedraw() pour afficher les modifications du graphique après toutes les manipulations nécessaires avec tous les objets graphiques qui peuvent être mis à jour en une seule fois - vous n'avez pas besoin de mettre à jour le graphique après chaque modification d'un élément. Je ne sais pas si j'ai été clair. Par exemple, si un utilisateur a cliqué sur un bouton et que quelque chose doit être dessiné en plus, par exemple un objet tableau composé de plusieurs éléments, alors tous les éléments doivent être dessinés et seulement ensuite le graphique doit être mis à jour une fois. Ne pas mettre à jour après chaque élément dessiné d'un seul objet.
    Il se peut que lorsque l'utilisateur a cliqué sur le bouton mais ne voit rien, tout est bien là, mais le graphique n'est pas encore mis à jour (il ne se mettra à jour qu'à l'arrivée du tic-tac).
 
Artyom Trishkin:

Non, il ne sera certainement pas proposé de modifier la logique graphique - le code multiplateforme doit fonctionner de la même manière.

La seule chose que je peux suggérer pour améliorer les boutons est que dans tous les cas, lorsque la série chronologique requise n'est pas encore disponible, il n'est toujours pas possible de construire un graphique sur ses données. Dans ce cas, nous devons attendre le moment où les données seront disponibles et rendre les boutons inactifs pendant l'attente - par exemple en les rendant similaires aux interfaces Windows : si aucune action n'est disponible sur le bouton, celui-ci est grisé. Cette logique peut être présente pour les deux plateformes, de sorte qu'il n'y a pas de différence dans le code.

 

J'ai ChartRedraw() déclenché à la sortie de grands blocs, par exemple OnChartEvent() et autres. Il n'y a donc rien de mal à cette fonction.

À propos des infobulles. Ils sont comme des indicateurs qui indiquent que lorsque vous cliquez sur un chiffre ou un symbole, tout fonctionnera.

Si vous cliquez sur le nombre et le symbole, l'un des éléments OnChartEvent() - CHARTEVENT_OBJECT_CLICK doit se déclencher. Il n'est pas déclenché si l'infobulle n'apparaît pas. J'aimerais savoir pourquoi cela se produit. CHARTEVENT_OBJECT_CLICK ne fonctionne pas .

Et je surveillerai de près l'accès aux séries chronologiques.

 
Eugeni Neumoin:

J'ai ChartRedraw() déclenché à la sortie de gros blocs, comme OnChartEvent() et autres. Il n'y a donc rien de mal à cette fonction.

À propos des infobulles. Ils sont comme des indicateurs qui indiquent que lorsque vous cliquez sur un chiffre ou un symbole, tout fonctionnera.

Si vous cliquez sur le nombre et le symbole, l'un des éléments OnChartEvent() - CHARTEVENT_OBJECT_CLICK doit se déclencher. Il n'est pas déclenché si l'infobulle n'apparaît pas. J'aimerais savoir pourquoi cela se produit. CHARTEVENT_OBJECT_CLICK ne fonctionne pas .

Et je surveillerai de près l'accès aux séries chronologiques.

Au tout début du gestionnaire d'événements du graphique, enregistrez le paramètre sparam - ensuite, toute action sera enregistrée. Ensuite, commencez à limiter la sortie - s'il y a un événement de clic d'objet (id==CHARTEVENT_OBJECT_CLICK), alors la sortie sparam dans le journal. Et ainsi vous arriverez lentement à la cause.

 
Artyom Trishkin:

Au tout début du gestionnaire d'événements du graphique, enregistrez le paramètre sparam - ensuite, toute action sera enregistrée. Ensuite, commencez à limiter la sortie - s'il y a un événement de clic d'objet (id== CHARTEVENT_OBJECT_CLICK), alors la sortie sparam dans le journal. Et ainsi vous arriverez lentement à la cause.

C'est exactement comme ça que j'ai tout débogué. Et dans le code, les bits pour le débogage dans OnChartEvent() sont toujours présents dans la forme commentée. Mais, merci. Je vais le faire de cette façon. Je vais en chercher la cause.
 

Pour éviter les problèmes de liaison des nombres et des symboles, vous devez augmenter la priorité des nombres et des symboles avec OBJPROP_ZORDER.

Il fonctionne dans MT4 sans lui. Cependant, j'ai augmenté la priorité dans MT4 juste au cas où. De plus, la priorité des symboles d'ondes était plus élevée que celle des chiffres.

J'ai réglé le problème.

J'essaie de modifier toutes les séries temporelles au bout de 2 minutes - je sélectionne différentes variantes pour que cette tâche soit la plus fluide possible.

Le processus a commencé...

 
Eugeni Neumoin:

Pour éviter les problèmes de liaison des nombres et des symboles, vous devez augmenter la priorité des nombres et des symboles avec OBJPROP_ZORDER.

Il fonctionne dans MT4 sans lui. Cependant, j'ai augmenté la priorité dans MT4 juste au cas où. De plus, la priorité des symboles d'ondes était plus élevée que celle des chiffres.

J'ai réglé le problème.

J'essaie de modifier toutes les séries temporelles au bout de 2 minutes - je sélectionne différentes variantes pour que cette tâche soit la plus fluide possible.

Le processus a commencé...

La douceur n'a rien à voir avec cela :)
J'ai juste besoin d'accéder à tous les tf qui fonctionnent au moins une fois toutes les deux minutes. J'accède généralement toutes les 90 secondes. Vous pouvez répartir le temps d'accès pour les différents commerçants, afin de ne pas les tirer tous à la fois. Mais chacun d'eux doit être consulté au moins une fois toutes les deux minutes.
 
Artyom Trishkin:
La douceur n'est pas une option ici :)
Il suffit d'accéder à toutes les cf's en fonctionnement au moins une fois toutes les deux minutes. J'appelle généralement toutes les 90 secondes. Vous pouvez répartir les temps d'accès pour les différents trafics afin de ne pas avoir à les tirer tous en même temps. Mais chacun d'eux doit être consulté au moins une fois toutes les deux minutes.

Il y a des freins.

Mais nous devons nous contenter de ce que nous avons.

Il est impossible d'embrasser l'immensité).

 
Artyom Trishkin:
La douceur n'est pas une option ici :)
Il suffit d'accéder à toutes les cf's en fonctionnement au moins une fois toutes les deux minutes. J'appelle généralement toutes les 90 secondes. Vous pouvez répartir les temps d'accès pour les différents trafics afin de ne pas avoir à les tirer tous en même temps. Mais chacun d'eux doit être consulté au moins une fois toutes les deux minutes.

Il est impossible de le séparer. Si au moins une transaction n'est pas mise à jour, l'indicateur peut rendre certaines constructions graphiques incorrectes.

D'autre part, j'ai vérifié la disponibilité des séries temporelles avant OnCalculate et OnChartEvent. Comme suggéré.

La mise à jour des séries temporelles et la vérification de la disponibilité des séries temporelles provoquent des ralentissements importants.

J'ai toujours des interruptions d'accès aux séries chronologiques. Comme je l'ai dit lors de la création de la branche dans l'un des premiers messages. Cela confirme que nous devons mettre à jour les séries chronologiques de manière programmatique.

C'est le premier.

Deuxièmement. Pourquoi chaque développeur doit-il se soucier d'organiser l'accès aux séries chronologiques ?

Pourquoi n'y a-t-il pas un "mécanisme" supplémentaire qui élimine ces tracas ?

Si quelqu'un a besoin de ce tracas, personne n'interdit l'utilisation de ce qui est maintenant disponible. Et pour ceux qui pensent qu'un accès alternatif universel aux séries chronologiques est bien, il est préférable que cet accès soit fait par les développeurs.

Plusieurs personnes m'ont demandé de traduire un programme de MT4 à MT5. Je l'ai fait. Je ne suis pas satisfait de la traduction. Mais tant que j'ai téléchargé le programme, je n'ai pas à me plaindre. Peut-être qu'ils en sont satisfaits. Bien que j'en doute.

Je voudrais ajouter quelque chose de mon côté. J'ai arrêté d'expérimenter l'optimisation de l'accès aux séries chronologiques. C'est une utilisation improductive du temps. Il y a des choses plus intéressantes à faire. Que ceux qui sont intéressés travaillent avec MT5. La seule chose qui peut être mâchée dans MT5 est l'historique des cotations. A utiliser dans l'enseignement des NS.

 
Eugeni Neumoin:

D'autre part, j'ai vérifié la disponibilité des séries temporelles avant les fonctions OnCalculate et OnChartEvent. Comme suggéré.

La mise à jour des séries temporelles et la vérification de la disponibilité des séries temporelles provoquent des ralentissements importants.

Il a été suggéré de le faire sur une minuterie toutes les minutes et demie. Pas avant chaque tick, et certainement pas sur un événement graphique.

L'accès aux séries chronologiques dans MT5 n'est vraiment pas idéal. Mais si vous devez résoudre un problème plutôt que de trouver une excuse, c'est possible.