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
Karputov Vladimir Et simplifier OnTradeTransaction()- envisager d'ajouter uniquement une transaction à l'historique - pas d'ordres.
Vous vous en sortirez, ne prenez même pas la peine de l'écrire (ne perdez pas votre temps).
J'ai commencé à m'y intéresser parce que le vrai se plantait.
Il semble qu'ils aient mis à jour le serveur pendant le week-end. Les millisecondes sont apparues. Il peut y avoir d'autres surprises.
Apparemment, la fonctionOnTradeTransaction fonctionne indépendamment du journal des transactions.
Je pense que ce comportement de la fonction est raisonnable - il n'est pas nécessaire de ralentir le flux des opérations et d'attendre que le journal soit écrit et que tout soit calculé.
Dans votre cas, il est probablement préférable d'utiliserOnTrade,
ou attendre et vérifier périodiquement avec une pause minimale lorsque l'affaire apparaît dans l'historique.
On dirait qu'ils ont mis à jour le serveur ce week-end. Les millisecondes sont apparues. Il peut y avoir d'autres surprises.
Apparemment, la fonctionOnTradeTransaction fonctionne indépendamment du journal des opérations.
Je pense que ce comportement de la fonction est justifié - il n'est pas nécessaire de ralentir le flux des opérations et d'attendre que tout soit enregistré et comptabilisé dans le journal.
Dans votre cas, il est probablement préférable d'utiliserOnTrade,
ou attendre et vérifier périodiquement avec une pause minimale lorsque l'affaire apparaît dans l'historique.
Salut Sergei !
Oui, nous l'avons fait, mais pas le week-end, mais le jeudi après la session du soir (j'ai demandé à mon courtier).
Je ne peux pas utiliser l'événement Trade() et attendre que les données soient mises à jour dans le terminal.
Le conseiller expert a été écrit il y a longtemps et jusqu'à récemment, il fonctionnait "comme une horloge" (j'ai peut-être eu de la chance et l'événementTRADE_TRANSACTION_DEAL_ADD étaittoujours le premier à arriver).
Il est important pour le conseiller expert d'exécuter une transaction réciproque dès que possible, c'est pourquoi le mode asynchrone et OnTradeTransaction().
Maintenant, le conseiller expert envoie (parfois) des ordres en double pour ouvrir et fermer des positions.
Vous : "Je pense que ce comportement de la fonction est justifié, il n'est pas nécessaire de ralentir le flux des opérations et d'attendre que tout soit écrit et comptabilisé dans le journal".
De toute façon, tout est écrit et compté après l'arrivée deTRADE_TRANSACTION_DEAL_ADD :)
Le problème est queTRADE_TRANSACTION_DEAL_ADD peut être perdu etTRADE_TRANSACTION_HISTORY_ADD peut arriver et alors le terminal aura des données de position périmées.:(,
ce qui se passe réellement.
C'est étrange que les développeurs n'y aient pas pensé.
TRADE_TRANSACTION_HISTORY_ADD n'intervient que si l'ordre a été exécuté ou supprimé (annulé), donc
si l'état de la commande change (respectivement, la position peut changer), le terminal doit recevoir l'information sur le changement de position,
même siTRADE_TRANSACTION_DEAL_ADD est perdu.
Voyons ce que les développeurs ont à dire.
Karputov Vladimir Et simplifier OnTradeTransaction() - envisager d'ajouter uniquement une transaction à l'historique - pas d'ordres.
Vous vous en sortirez, ne prenez même pas la peine de l'écrire (ne perdez pas votre temps).
Veuillez demander aux "enseignants" et aux "je sais tout" de parler sur le fond,
et pas seulement pour mettre le pied sur le poteau pour marquer un point.
Avant de vous montrer aux personnes qui veulent vous aider, vous devez formuler votre question normalement. Quel est le rapport avec l'envoi asynchrone d'un ordre, si la clôture partielle est effectuée par la fonction OrderSend() ? Sur quoi porte votre question ?
Super !
Cela doit-il être considéré comme une aide ?
Et Karputov n'a rien à voir avec ça, c'est juste que lorsque j'ai écrit mon message, il avait déjà posté le sien et je ne l'ai pas vu.
Initialement, la question était posée comme suit (au cas où vous seriez trop paresseux pour la lire d'abord)
Comment créer une journalisation pour montrer l'erreur aux développeurs ?
Pourquoi, je l'ai fait moi-même et les logs montrent clairement que
aprèsTRADE_TRANSACTION_HISTORY_ADD (avantTRADE_TRANSACTION_DEAL_ADD)
le terminal ne met pas à jour les informations de position.
prostotrader, Dimitri vous dit correctement que les fermetures partielles (et complètes) ne sont pas asynchrones dans votre code, mais synchrones... ce qui signifie que le programme attend une réponse du serveur...
Il est probable que la transaction OnTradeTransaction soit déclenchée plus rapidement que la position elle-même ne change.
Alors ici :
vous pourriez essayer de boucler la vérification de la position. Peut-être que cela aidera....
C'est quelque chose comme ça :
Sans connaître l'algorithme exact(ce dont vous avez besoin de la part du programme), il est difficile d'évaluer la justesse de son implémentation...
Passé complètement en mode asynchrone
Mais rien n'a changé
C'était évident, mais "pour la pureté" de l'expérience...
Bûches pleines au sous-sol
1. >Sans connaître l'algorithme exact (ce que vous attendez du programme), il est difficile d'évaluer s'il est implémenté correctement...
Je pensais qu'il n'était pas difficile de comprendre ce que fait le programme, mais si ce n'est pas clair, alors...
Un Expert Advisor ouvre une position sur le marché FORTS avec un volume de 2 contrats ; si la position est ouverte, elle est partiellement fermée avec un volume de 1 contrat,
alors la position sera complètement fermée. Répétez cette procédure jusqu'à ce que le compteur tr_cnt<50
2. Vous pouvez " exécuter " PositionSelect() un million de fois, cela ne changera rien, car
l'événementTRADE_TRANSACTION_DEAL_ADD ne sera pas reçu avant que vous ne soyez dans la boucle, et donc, le terminal ne mettra pas à jour
informations sur le poste
...
Je l'ai dit plus haut - ne vous laissez pas emporter par les ordres : regardez les transactions. Voici un code court qui montre QUAND le volume de la position change et de quel type de transaction il s'agit :
Et voici les empreintes, à la fermeture partielle :
Vous pouvez clairement voir que dès qu'un événement avec le type de transactionTRADE_TRANSACTION_DEAL_ADD est passé, ça y est, les données de position dans le terminal sont mises à jour.