Comment travailler correctement dans MT5 avec OrderSend ? - page 10

 
prostotrader:

Utilisez-le.

C'est un bon exemple. Mais j'ai une question. Que faire si la fonction OnTradeTransaction() ne renvoie pas les données lors du traitement de l'ordre ? Eh bien, ils peuvent être perdus d'une manière ou d'une autre. Le serveur l'a envoyé mais le terminal ne l'a pas reçu. Dans quelle mesure est-il garanti que je recevrai le nombre requis d'appels de la fonction OnTradeTransaction() pour 100 % des ordres envoyés et que tous les rapports de transaction parviendront au terminal (je m'intéresse principalement à transaction.type = TRADE_TRANSACTION_REQUEST).

Parce que si je n'obtiens pas cette réponse (à cause d'une rupture de connexion, par exemple), je n'effacerai pas le drapeau et tout restera debout.

 
fxsaber:

Je n'ai pas vérifié, mais peut-être qu'après l'envoi de l'ordre, tous les EAs reçoivent l'événement correspondant pour OnTradeTransaction.

Ensuite, tout est résolu sans béquilles et pour plusieurs EA sur le même symbole.

Je l'ai vérifié ! C'est comme ça !
 
Oleg Shenker:

C'est un bon exemple. Mais il y a une question qui me taraude. Que faire si OnTradeTransaction() ne renvoie pas les données de traitement de l'ordre ? Eh bien, ils peuvent être perdus d'une manière ou d'une autre. Le serveur l'a envoyé mais le terminal ne l'a pas reçu. Dans quelle mesure est-il garanti que je recevrai le nombre requis d'appels de la fonction OnTradeTransaction() pour 100 % des ordres envoyés et que tous les rapports de transaction parviendront au terminal (je m'intéresse principalement à transaction.type = TRADE_TRANSACTION_REQUEST).

Parce que si je n'obtiens pas cette réponse (à cause d'une rupture de connexion, par exemple), je ne supprimerai pas le drapeau et tout restera en place.

Il m'est arrivé plusieurs fois que l'événement OnTradeTransaction ne se produise pas,

J'ai donc écrit une fonction qui vérifie l'état des commandes en utilisant un timer avec une période de 0,5 secondes.

Cette mise en œuvre complique le code général du conseiller expert, mais il n'y a pas de garantie à 100 % lorsque l'on travaille sur Internet,

que tout va fonctionner comme sur des roulettes.

Ajouté par

J'ai eu l'idée de vérifier ici

https://www.mql5.com/ru/blogs/post/557544

Отслеживание ордера, после команды OrderSendAsync
Отслеживание ордера, после команды OrderSendAsync
  • 2015.04.29
  • Mikhail Filimonov
  • www.mql5.com
Отслеживание ордера, после команды OrderSendAsyncМихаил | 23 апреля, 2015В статье рассказывается принцип отслеживания ордера после команды OrderSendAsync, если нет события TradeTransaction...
 
prostotrader:

Il m'est arrivé plusieurs fois que l'événement OnTradeTransaction ne se produise pas,

Par conséquent, j'ai écrit une fonction qui vérifie l'état des commandes à l'aide d'une minuterie avec une période de 0,5 seconde.

Cette mise en œuvre complique le code général du conseiller expert, mais il n'y a pas de garantie à 100 % lorsque l'on travaille sur Internet,

que tout va fonctionner comme sur des roulettes.

Ajouté par

J'ai eu l'idée de vérifier ici

https://www.mql5.com/ru/blogs/post/557544

J'ai l'impression que ce type essaie d'enfoncer une porte ouverte en créant des codes magiques spéciaux pour chaque transaction. Il existe un order_id par lequel une commande peut être identifiée de manière unique.

Ou est-ce que je rate le coche ?

 
Oleg Shenker:

J'ai l'impression que le gars enfonce une porte ouverte en créant des codes magiques spéciaux pour chaque métier. Il existe un order_id qui peut être utilisé pour identifier de manière unique la commande.

Ou est-ce que je ne comprends pas ?

Oui, il y a un order_id, mais malheureusement, il arrive que les événements n'arrivent pas à OnTradeTransaction.

(Je l'ai eu plusieurs fois personnellement).

Et ensuite, où mettre le numéro de commande ?

Ajouté par

Ici, il y a eu un retard de réponse du serveur aujourd'hui

2016.12.28 14:04:56.442  (MXI-3.17,M1)  CheckOrders: Задержка ответа сервера. Ожидание продолжается...
2016.12.28 14:04:56.443  (GOLD-3.17,M1) CheckOrders: Задержка ответа сервера. Ожидание продолжается...
 
prostotrader:

Oui, il y a un order_id, mais malheureusement, il arrive que les événements n'arrivent pas dans OnTradeTransaction.

(Je l'ai eu plusieurs fois personnellement).

Où placer l'identifiant de commande ?

Ajouté par

Ici, aujourd'hui il y avait un retard de réponse du serveur

2016.12.28 14:04:56.442  (MXI-3.17,M1)  CheckOrders: Задержка ответа сервера. Ожидание продолжается...
2016.12.28 14:04:56.443  (GOLD-3.17,M1) CheckOrders: Задержка ответа сервера. Ожидание продолжается...

J'ai eu un "baffle" différent l'autre jour.

2016.12.23 15:04:02.865 TriArbTrader_8-4 (EURGBP,H1)    1111 DealSell           3 orders are sent.
2016.12.23 15:04:02.924 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURUSD Retcode = 10009. Slippage = 1631.
2016.12.23 15:04:02.924 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURUSD Position is closed in 59699 mksec.
2016.12.23 15:04:02.924 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURUSD Retcode = 10009. Slippage = 1631.
2016.12.23 15:04:02.924 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURUSD Position is closed in 59712 mksec.
2016.12.23 15:04:02.992 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction GBPUSD Retcode = 10009. Slippage = 1379.
2016.12.23 15:04:02.992 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction GBPUSD Position is closed in 127691 mksec.
2016.12.23 15:04:02.992 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction All reposts are checked. Direction = 0
2016.12.23 15:04:02.993 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction Unexpected transaction request.
2016.12.23 15:04:02.993 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURGBP Retcode = 10009. Slippage = -40993.
2016.12.23 15:04:02.993 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction EURGBP Position is closed in 1339448077 mksec.
2016.12.23 15:04:02.993 TriArbTrader_8-4 (EURGBP,H1)    1111 OnTradeTransaction All reposts are checked. Direction = -1

Trois ordres ont été envoyés, et il y a une trace claire de ça dans le journal. Ensuite, la fonction OnTradeTransactions() TRADE_TRANSACTION_TYPE a été appelée quatre fois.

Le code de la fonction commence par des contrôles :

void OnTradeTransaction(const MqlTradeTransaction& transaction,
                        const MqlTradeRequest&     request,
                        const MqlTradeResult&      results)
   {
    if(transaction.type == TRADE_TRANSACTION_REQUEST && request.action == TRADE_ACTION_DEAL)
      {
       if(request.magic == ExpertMagic)
         {

C'est-à-dire que seul TRADE_TRANSACTION_REQUIEST avec son propre tampon d'expert peut entrer à l'intérieur, là où se trouvent les imprimeurs...

Le service d'assistance a d'abord commencé à me persuader que j'avais deux EA identiques (de toute évidence sur le même graphique, à en juger par le journal). Et puis ils ont dit : "vous êtes un imbécile, réparez les erreurs dans le code".

En bref, selon eux, cela ne peut pas être. Mais le journal montre clairement que l'événement s'est produit quatre fois.

 
prostotrader:

Oui, il y a un order_id, mais malheureusement, il arrive que les événements n'arrivent pas dans OnTradeTransaction.

(Je l'ai eu plusieurs fois personnellement).

Où placer l'identifiant de commande ?

Ajouté par

Ici, aujourd'hui, j'ai eu un retard de réponse du serveur.

2016.12.28 14:04:56.442  (MXI-3.17,M1)  CheckOrders: Задержка ответа сервера. Ожидание продолжается...
2016.12.28 14:04:56.443  (GOLD-3.17,M1) CheckOrders: Задержка ответа сервера. Ожидание продолжается...

Mais quoi qu'il en soit, je ne comprends toujours pas pourquoi nous ne pouvons pas rechercher un ordre par ticker ? Il est très facile de vérifier lesquels des ordres que nous avons envoyés ne sont pas arrivés à TradeTransaction. Et ensuite, regardez le statut de la commande avec ce ticket dans l'historique.

Cependant, l'historique des commandes ne montre que les commandes dont le statut est REMPLI.

 
Oleg Shenker:

Et on ne comprend toujours pas pourquoi la commande ne peut pas être recherchée par ticker ? Après tout, il est facile de vérifier quel ordre n'est pas arrivé à TradeTransaction. Et ensuite, regardez le statut de la commande avec ce ticker dans l'historique.

Cependant, lorsque j'ai essayé personnellement, dans l'historique des commandes, il n'y avait que des commandes dont le statut était REMPLI.

Oui, car l'ordre peut ne pas figurer dans l'historique(ordre en attente, etc.).

Ajouté

Et vous avez le mauvais code

 
prostotrader:

Oui, car l'ordre peut ne pas figurer dans l'historique(ordre en attente, etc.).

Ajouté par

Et vous avez le mauvais code

Qu'est-ce qui ne va pas ? Combien d'erreurs pouvez-vous faire en deux lignes de code.

 
Oleg Shenker:

Qu'est-ce qui ne va pas ici ? Combien d'erreurs peuvent être faites en deux lignes de code.

Pas deux, un seul :)

if(transaction.type == TRADE_TRANSACTION_REQUEST && request.action == TRADE_ACTION_DEAL)

TRADE_TRANSACTION_REQUEST est nécessaire lorsque vous utilisez OrderSendAsymc pour obtenir le ticket de commande.