Développeurs ! Est-ce que vous testez au moins ce que vous créez ? - page 10
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
Oh, mon Dieu ! Est-il valable dans l'histoire ?
papaklass voulait probablement dire que OnTradeTransaction renvoie des erreurs ?
Si les informations contenues dans OnTradeTransaction ne sont pas valides, nous devons les extraire de l'historique pour nous assurer qu'elles le sont.
Si l'information onTradeTransaction n'est pas toujours fiable, nous devons la prendre dans l'historique pour nous assurer que l'information a été traitée.
La question est de savoir pourquoi nous avons besoin de OnTradeTransaction si nous devons de toute façon prendre les informations dans l'historique. - Il n'en a besoin que pour la vérification des erreurs. Le courtier a rejeté l'ordre et nous avons reçu la réponse pourquoi il a été rejeté dans OnTradeTransaction et l'avons analysé.
mais pourquoi baver sur 9 pages ?
S'il vous plaît, ne soyez pas grossier ! Au fait, il est déjà 10 heures !
Et vous avez le droit de ne pas lire du tout ce qui est écrit ici !
C-4, seront traitées, bien sûr, mais pourquoi avoir besoin de OnRefresh() ?
Plusieurs événements -> un seul gestionnaire.
Des erreurs de tous les coins dans une seule pile ! :)
Ce ne sont pas les erreurs qui sont envoyées, mais les données. Les erreurs peuvent se trouver dans le gestionnaire, mais elles sont faciles à corriger car il n'y a qu'un seul gestionnaire.
C'est exactement ce que je veux dire. Vous devez séparer les événements.
Ce ne sont pas les erreurs qui sont envoyées, mais les données. Les erreurs peuvent se trouver dans le gestionnaire, mais elles sont faciles à corriger car il n'y a qu'un seul gestionnaire.
Vous n'avez pas besoin de séparer les événements, vous avez besoin de séparer les gestionnaires. Les événements génèrent des données. Chaque type de données gère son propre gestionnaire. Peu importe qui a reçu les données, l'important est qu'il existe un gestionnaire unique pour chaque type de données.Qu'est-ce qui n'est pas partagé ici ?
Et puis il y a
Qu'est-ce qui n'est pas partagé ici ?
Ce que vous suggérez (traitement des types de données) est ce dont dispose MK pour le moment. Le gestionnaire OnTradeTransaction gère un certain type de données MqlTradeTransaction. C'est vrai, ils ont mis beaucoup de choses dans ce type de données, c'est-à-dire des types de données correspondant à différents événements.
Je suggère que chaque événement ait ses propres données et son propre gestionnaire. Autant d'événements, autant de gestionnaires. La division des événements (ouverture d'une position, fermeture d'une position, placement d'un ordre, modification d'un ordre, modification d'une position, etc.) Et c'est aux développeurs de décider quels types de données attribuer à quels événements.
Par le mot "gestionnaire", je n'entends pas une fonction système qui reçoit un événement, mais un module Expert Advisor qui analyse tel ou tel événement. Pour multiplier le nombre de fonctions sur... Chacun pour son propre événement - n'a aucun sens, d'autant plus qu'il est élémentaire de créer des gestionnaires d'utilisateurs en quantité suffisante. C'est ainsi que cela se passe dans mon cas :
Il peut sembler étrange qu'une seule et même classe d'événement soit transmise à des gestionnaires complètement différents qui nécessitent des types de données complètement différents. Par exemple, OnMouseMove requiert un masque des touches pressées sur la souris et ses coordonnées, OnKeyDown() requiert le code d'une touche pressée, OnOrderChange requiert un ticket de la commande qui a été modifiée et probablement un enum décrivant la modification exacte. Vous pourriez penser que la classe d'événements contient des champs pour tous les événements possibles. Mais ce n'est pas le cas. En fait, l'objet de la classe événement ne peut même pas exister, puisque son constructeur est caché dans la zone protégée. Mais ses descendants existent en abondance - chaque descendant ne gérant qu'un événement différent. Cependant, pour tout événement, il existe un identifiant qui indique à quel type il appartient. En connaissant cet identifiant, vous pouvez passer sans risque d'un type plus grand à un type plus petit. Il s'agit du type de l'enfant pour lequel la conversion implicite se produit lorsque le gestionnaire est passé. Voyons comment nos gestionnaires voient réellement l'événement :
Magnifique... Il semble qu'il n'y ait qu'un seul événement, mais en fait il pourrait y en avoir des dizaines. L'événement semble ne contenir pratiquement aucune information, à l'exception de son type, mais en fait, les gestionnaires font librement référence à des méthodes connues d'eux seuls.Il n'y a pas d'événements "externes" et "internes", juste des événements. Et le nombre de ces événements est potentiellement infini. Un événement peut être n'importe quoi. Un événement peut contenir toutes sortes de données. En suivant cette philosophie, nous atteignons un nouveau niveau, plus élevé, d'abstraction des données. Pourquoi créer des restrictions dans votre tête, pourquoi imposer une classification limitant l'abstraction !
La différence essentielle entre les événements internes et externes est le temps d'exécution. Les événements internes ont un temps d'exécution pratiquement nul, tandis que les événements externes ont des centaines de millisecondes ou de secondes.
Les événements n'ont pas de temps d'exécution. Si un événement est arrivé, il est déjà exécuté. C'est ainsi que le mode asynchrone fonctionne. Il est donc erroné de classer les événements en internes et externes en fonction de la vitesse à laquelle ils sont exécutés. Il est correct de ne pas classer du tout, mais de penser de manière très abstraite à partir de la mise en œuvre concrète.