OnTradeTransaction

 
Je suis intéressé par la réponse du développeur - pourquoi l'événementOnTradeTransaction n'est-ilpas garanti ?
 
Alexey Oreshkin:
Je suis intéressé par la réponse des développeurs - pourquoil' événementOnTradeTransaction n'est pas garanti ?

Les développeurs sont probablement fatigués de répondre. Je vais essayer de répondre à leur place : OnTradeTransaction ne peut pas être garanti par définition car il s'agit d'un événement. Même si l'envoi de l'événement est garanti, son acceptation ne peut être garantie. Imaginez que lorsqu'un événement se produit, le terminal de l'utilisateur s'éteint ou la connexion avec l'Internet est interrompue et que cet événement ne peut pas être traité. La probabilité est faible, mais pas impossible.

Au lieu d'analyser les événements, il est nécessaire d'analyser l'environnement commercial et de prendre les décisions nécessaires uniquement si l'environnement commercial a changé. OnTransaction ne peut être utilisé que dans des cas très limités, et il est généralement préférable de travailler sans lui. Regardez MetaTrader 4, il n'a pas de OnTransaction et se débrouille très bien sans.

 
Vasiliy Sokolov:

Les développeurs sont probablement fatigués de répondre. Je vais essayer d'y répondre pour eux : OnTradeTransaction ne peut pas être garanti par définition car il s'agit d'un événement. Même si l'envoi de l'événement est garanti, son acceptation ne peut être garantie. Imaginez que lorsqu'un événement se produit, le terminal de l'utilisateur s'éteint ou la connexion avec l'Internet est interrompue et que cet événement ne peut pas être traité. La probabilité est faible, mais pas impossible.

Au lieu d'analyser les événements, il est nécessaire d'analyser l'environnement commercial et de prendre les décisions nécessaires uniquement si l'environnement commercial a changé. OnTransaction ne peut être utilisé que dans des cas très limités, et il est généralement préférable de travailler sans lui. Regardez MetaTrader 4, il n'y a pas de OnTransaction et tout le monde s'en passe très bien.

Contrairement à mt5, il est beaucoup plus facile de gérer les positions dans mt4 en raison de l'absence de compensation, donc OnTransaction est bon ou mauvais dans ce cas.
C'est-à-dire que l'événement n'est pas garanti uniquement pour des raisons techniques ? Si tout fonctionne, alors le terminal devrait garantir à 100% cet événement ?

 
Alexey Oreshkin:

Dans MT4, il est beaucoup plus facile de gérer les positions que dans MT5 en raison de l'absence de compensation. C'est pourquoi OnTransaction est chaud ou froid dans MetaTrader.
L'événement n'est donc pas garanti uniquement pour des raisons techniques ? Si tout fonctionne, alors le terminal devrait garantir à 100% cet événement ?

La compensation n'a aucun effet sur le besoin de OnTradeTransaction.

La deuxième question ne peut être répondue que par les développeurs eux-mêmes. Tout ce que j'ai remarqué, c'est que OnTradeTransaction est extrêmement stable. Aucune perte de réception d'événement n'a été détectée.

 
Vasiliy Sokolov:

La compensation n'a aucun effet sur le besoin de OnTradeTransaction.

La compensation affecte la comptabilisation des positions et est à l'origine de tant de problèmes pour une question aussi simple, tandis que OnTradeTransaction est également nécessaire pour comptabiliser les positions.

 
Alexey Oreshkin:

Dans MT4, en raison de l'absence de compensation en général, il est beaucoup plus facile de gérer les positions, contrairement à MT5, donc OnTransaction est chaud ou froid là-bas.
L'événement n'est donc pas garanti uniquement pour des raisons techniques ? Si tout fonctionne, alors le terminal devrait garantir à 100% cet événement ?

Les développeurs choisissent les propriétés prioritaires des produits. La propriété prioritaire de MT4 était la facilité d'utilisation avec MQL4.

Avec MT5, la priorité de premier niveau est évidemment la vitesse (et la flexibilité). Il est impossible d'obtenir toutes les caractéristiques du produit au maximum. Cela contredit la théorie.

Le produit le plus rapide exigera inévitablement beaucoup plus (connaissances, expérience et efforts) de la part du programmeur client.


C'est quoi ce bordel avec ces problèmes techniques. Réfléchissons-y sobrement.

Supposons que vous développez un MT5 et que vous avez une tâche à accomplir : écrire un bloc HFT pour les actions de trading.

D'une part, les enregistrements de transactions sont mis en file d'attente depuis le serveur, d'autre part, ces enregistrements doivent être transmis à XXX-expert.

Dans l'expert XXX, à l'intérieur du handler OnTradeTransaction(), l'utilisateur peut avoir n'importe quelle "pornographie" !

On ne sait absolument pas combien de temps cette fonction sera exécutée.

La file d'attente peut contenir des centaines d'enregistrements provenant du serveur mais pas encore transférés à XXX-expert.

Que pouvez-vous garantir dans cette situation ? Rapidité ou exhaustivité des données ?

Et y a-t-il un sens à "stocker" des informations profondément obsolètes pour une fonction qui, dans son essence, ne contribue qu'au HFT ?

 

Les gars !

Je le lis et je me demande...

OnTradeTransaction vous permet d'obtenir les informations les plus récentes sans avoir à "creuser" nulle part.

sur les commandes et les échanges !

Vous ne savez tout simplement pas comment utiliser cette fonction.

 
Михаил:

Les gars !

Je le lis et je me demande...

OnTradeTransaction vous permet d'obtenir les informations les plus récentes sans avoir à "creuser" nulle part.

sur les commandes et les échanges !

Vous ne savez tout simplement pas comment utiliser cette fonction.

Vous ne savez pas non plus comment l'utiliser. Vous avez déjà écrit des dizaines de pages sur OnTradeTransaction, mais vous n'avez pas compris une chose : OnTradeTransaction est une fonction de service pour résoudre des tâches spécifiques étroites, vous ne pouvez pas l'utiliser dans le trading comme vous le faites. Et puis des types intelligents lisent vos articles et créent des fils de discussion similaires : "Pourquoi OnTradeTransaction n'est-il pas garanti ?" - parce qu'un conseiller expert ne devrait pas créer son environnement de négociation par le biais de OnTradeTransaction, comme vous le faites, mais se fier uniquement à ce qui est disponible dans le système, en particulier dans l'historique des ordres et des transactions.
 
Vasiliy Sokolov:
Vous ne savez pas non plus comment faire. Vous avez déjà écrit des dizaines de pages sur le sujet de OnTradeTransaction, mais vous n'avez pas compris une chose : OnTradeTransaction est une fonction de service destinée à résoudre des tâches spécifiques étroites, vous ne pouvez pas l'utiliser dans le trading comme vous le faites. Et puis des types intelligents lisent vos articles et créent des fils de discussion similaires : "Pourquoi OnTradeTransaction n'est-il pas garanti ?" - parce qu'un conseiller expert ne devrait pas créer son environnement de négociation par le biais de OnTradeTransaction, comme vous le faites, mais se fier uniquement à ce qui est disponible dans le système, en particulier dans l'historique des ordres et des transactions.

D'un côté, oui. D'autre part, qu'en est-il des cas où une demande a été envoyée au serveur, mais où l'opération n'a pas encore été exécutée ? Comment pouvons-nous savoir dans quel état nous sommes si nous n'avons qu'une liste d'ordres et de positions (et l'historique du compte) ?

Ce problème ne se pose pas dans MT4, car toutes les opérations de trading y sont synchrones. Mais le résultat est une performance plus lente.

 
Игорь Герасько:

D'un côté, oui. D'autre part, qu'en est-il des cas où une demande a été envoyée au serveur, mais où l'opération n'a pas encore été exécutée ? Comment pouvons-nous savoir dans quel état nous sommes si nous n'avons qu'une liste d'ordres et de positions (et l'historique du compte) ?

Ce problème ne se pose pas dans MT4, car toutes les opérations de trading y sont synchrones. Mais le résultat est une performance plus lente.

Si le temps entre l'envoi d'un ordre et le prochain signal d'entrée sur le marché dépasse le temps d'exécution de l'ordre, nous n'aurons rien à faire. La logique est simple : on envoie un ordre asynchrone, on quitte le fil et on l'oublie. Nous attendons le moment suivant pour vérifier le signal. Si, à ce moment-là, l'environnement commercial n'a pas changé, le conseiller expert recherche un signal pour entrer à nouveau sur le marché et répète l'ordre d'entrée sur le marché. Si, au contraire, tout s'est bien passé et que l'ordre a été exécuté, le conseiller expert se rendra compte qu'il a une position après avoir analysé l'environnement et n'ouvrira pas à nouveau une nouvelle position. C'est-à-dire que dans cette approche, la condition du conseiller expert est garantie pour être cohérente avec l'environnement du marché.

La situation est plus compliquée dans le trading à haute fréquence, où un nouveau signal peut survenir après un temps comparable à l'exécution d'un ordre (6-100 msec). Dans ce cas, vous ne pouvez pas vous passer du verrouillage. Le conseiller expert doit se souvenir de l'heure de l'envoi du dernier ordre. Si une erreur se produit dans OnTransaction, le verrouillage est réinitialisé et le conseiller expert peut à nouveau effectuer des transactions.

Il faut noter que le OnTradeTransacton que tant de gens aiment prier n'aide pas à HFT. Un nouveau signal d'entrée peut arriver plus rapidement que la réponse concernant l'exécution réussie d'une transaction dans OnTradeTransaction. Le blocage est nécessaire, que vous utilisiez ou non OnTradeTransacton.

Comment, me direz-vous, pouvons-nous contrôler les erreurs survenant dans OnTradeTransaction ? Vous pouvez répondre par une contre-question : Comment allez-vous modifier la logique de trading du conseiller expert à la volée lorsqu'une erreur se produit? - Vous ne pouvez pas. Des erreurs se produisent si vous ne faites pas les vérifications appropriées avant (présence d'argent, volume, etc., etc.). Mais une fois qu'il s'est produit, vous ne pourrez pas le corriger. Par conséquent, la meilleure chose que vous puissiez faire dans OnTradeTransaction, est d'imprimer cette erreur dans le journal (pour corriger la logique du conseiller expert plus tard), et de supprimer le verrou, s'il est utilisé. Pour cela et rien d'autre, il faut utiliser OnTradeTransaction.

Maintenant, divers adeptes de Mikalas vont arriver en courant et commencer à me jeter des tomates - laissez-les faire. Mais j'ai toujours répété qu'une logique de trading fiable ne peut être organisée que si elle est basée sur l'environnement de trading du terminal. Toute autre solution ne fonctionnera pas.

 
Alexey Oreshkin:
Je suis intéressé par la réponse des développeurs - pourquoil' événementOnTradeTransaction n'est pas garanti ?

OnTradeTransaction est le résultat de la réponse du serveur à la demande OrderSendAsinc.

La fonction OrderSendAsinc elle-même est asynchrone, ce qui est indiqué même dans son nom. Cela signifie que cette fonction a lancé une requête au serveur et a renvoyé la réponse au programme concernant les résultats de l'envoi (si la requête a été envoyée avec succès ou non).

C'est selon le principe que le coq a chanté et qu'il ne se lèvera pas. C'est pourquoi la réponse du serveur dansOnTradeTransaction n'est pas garantie. On ne sait jamais ce qui peut s'y passer.

Il existe deux fonctions similaires : OrderSend et OrderSendAsinc.

La première est synchrone et attend silencieusement la réponse du serveur, quel que soit le temps que cela prend (elle renvoie le résultat du traitement de la demande par le serveur).

La seconde est asynchrone, elle n'attend pas la réponse du serveur, mais renvoie immédiatement le résultat de l'opération (mais renvoie le résultat de savoir si la requête a été envoyée au serveur avec succès ou non).

OrderSendAsinc est nécessaire lorsque les décisions doivent être prises rapidement. Des tests ont montré que OrderSendAsinc peut gérer l'envoi de centaines de demandes par seconde (mais cette vitesse est due au fait qu'il n'attend pas de réponse du serveur).

C'est exactement pour la réception d'une réponse "retardée" que le terminal génère l'événement OnTradeTransaction (retardée conditionnellement au fait que le programme a continué à recevoir la réponse, en fait, le décalage est compté en secondes ou en millisecondes).

La différence avec OrderSend est que OnTradeTransaction peut être généré pour un ordre plusieurs fois en notifiant au terminal les nouvelles informations reçues sur la façon dont la demande a été traitée par le serveur. Cela signifie que nous pouvons voir les étapes du traitement des ordres dans OnTradeTransaction.

Ordre accepté par le serveur OnTradeTransaction

L'ordre a été placé dans la file d'attente OnTradeTransaction.

Commander ... OnTradeTransaction

Commander ... OnTradeTransaction etc.

Tous les événements autres que le premier événement sur l'ordre sont signés avec un ticket pour identifier exactement quel ordre a reçu la réponse à l'événement OnTradeTransaction.

Le premier événement est signé par le ticket et le request_id. Le request_id est obtenu par l'utilisateur juste après la soumission de la commande à partir de la fonction OrderSendAsinc. Ainsi, une itération spécifique de OrderSendAsinc est liée aux résultats obtenus dans OnTradeTransaction.

Raison: