Comment travailler correctement dans MT5 avec OrderSend ? - page 5

 
Andrey Khatimlianskii:

J'ai vu la photo. Tout est clair pour la bourse (avec un ordre limite).

Pour les ordres de change et de marché, vous ne comprenez pas. Tout est clair.

C'est la même chose avec un ordre au marché (sur la Bourse).

Ajouté par

Si nous envoyons un ordre au marché, alors lorsque nous recevons le ticket, nous allons dans l'historique avec celui-ci et

nous allons à l'histoire et voyons ce qui lui est arrivé. Vous pouvez également consulter le site OnTradeTransaction.

TRADE_TRANSACTION_HISTORY_ADD
 
Andrey Khatimlianskii:

Qu'en est-il de "si OrderSend a retourné le ticket, il est exécuté" ?

Devons-nous courir vers l'histoire après tout, ou attendre les événements ? Eh bien, c'est le but de ce fil de discussion ! !!

Correct. Qu'est-ce que je n'ai pas dit dans le "box office" ?

J'ai même posté un EA (pour la Bourse) à titre d'exemple.

 
Andrey Khatimlianskii:

Oui, tout compte fait, ce n'est pas très pertinent). Mais merci pour votre contribution.

Il s'agit du fait que l'envoi d'ordre "synchrone" se termine avant que l'EA ne voie son impact sur le compte (aucune transaction dans l'historique et aucun changement de position).

Et pour fonctionner correctement, nous devons trouver des béquilles sous forme d'attente d'un événement (une fonction très pratique ! mais pas dans ce cas) ou de recherche dans l'historique (également avec attente).

En effet, il y a un problème pour le FOREX (j'ai utilisé le même conseiller expert sur le FOREX).

2016.10.14 02:18:20.229 Trades  '3941932': buy limit 1.00 GBPUSD at 1.22374
2016.10.14 02:18:20.276 Trades  '3941932': accepted buy limit 1.00 GBPUSD at 1.22374
2016.10.14 02:18:20.292 Trades  '3941932': order #102956267 buy limit 1.00 / 1.00 GBPUSD at market done in 62.769 ms
2016.10.14 02:18:20.292 Trades  '3941932': failed cancel order #102956267 buy limit 1.00 GBPUSD at 1.22374 [Invalid request]
2016.10.14 02:18:20.292 Trades  '3941932': cancel order #102956267 buy limit 1.00 GBPUSD at 1.22374
2016.10.14 02:18:20.354 Trades  '3941932': accepted cancel order #102956267 buy limit 1.00 GBPUSD at 1.22374
2016.10.14 02:18:20.354 Trades  '3941932': cancel #102956267 buy limit 1.00 GBPUSD at market done in 66.823 ms

2016.10.14 02:18:20.229 TestOrders (GBPUSD,H1)  OnChartEvent Send Order Sync mode
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  SendOrderSyncMode Order sent in sync mode
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  RemoveOrderSyncMode Order not sent (remove) in sync mode.
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_ADD
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Order update state = ORDER_STATE_PLACED
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Order plased done. Ticket = 102956267
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  RemoveOrderAsyncMode Order sent (remove) in async mode
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_DELETE
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_HISTORY_ADD
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Order remove done. Ticket = 102956267
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Order get ticket done. Ticket = 102956267
 

Mais en mode asynchrone (FOREX), il fonctionne bien.

2016.10.14 02:31:26.145 Trades  '3941932': sell limit 1.00 GBPUSD at 1.22604
2016.10.14 02:31:26.206 Trades  '3941932': accepted sell limit 1.00 GBPUSD at 1.22604
2016.10.14 02:31:26.208 Trades  '3941932': order #102958649 sell limit 1.00 / 1.00 GBPUSD at market done in 63.027 ms
2016.10.14 02:31:26.208 Trades  '3941932': cancel order #102958649 sell limit 1.00 GBPUSD at 1.22604
2016.10.14 02:31:26.271 Trades  '3941932': accepted cancel order #102958649 sell limit 1.00 GBPUSD at 1.22604
2016.10.14 02:31:26.273 Trades  '3941932': cancel #102958649 sell limit 1.00 GBPUSD at market done in 64.700 ms

2016.10.14 02:31:26.145 TestOrders (GBPUSD,H1)  OnChartEvent Send Order Acync mode
2016.10.14 02:31:26.145 TestOrders (GBPUSD,H1)  SendOrderAsyncMode Order sent in async mode
2016.10.14 02:31:26.207 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_ADD
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Order get ticket done. Ticket = 102958649
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Order update state = ORDER_STATE_PLACED
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Order plased done. Ticket = 102958649
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  RemoveOrderAsyncMode Order sent (remove) in async mode
2016.10.14 02:31:26.272 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.14 02:31:26.272 TestOrders (GBPUSD,H1)  OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.14 02:31:26.272 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_DELETE
2016.10.14 02:31:26.273 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.14 02:31:26.273 TestOrders (GBPUSD,H1)  OnTradeTransaction Order get ticket done. Ticket = 102958649
2016.10.14 02:31:26.273 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_HISTORY_ADD
2016.10.14 02:31:26.273 TestOrders (GBPUSD,H1)  OnTradeTransaction Order remove done. Ticket = 102958649
 
Andrey Khatimlianskii:
Bien sûr, tout le monde recevra le message. Mais ils ne sauront pas que quelqu'un n'a pas reçu le même message un peu plus tôt et n'a pas déclenché un nouvel envoi de commande.

Nouvelle idée.

Écrire un synchroniseur EA. Une fois l'envoi de l'ordre effectué, les données sont envoyées à cet EA et attendent qu'il réponde.

Bien que la différence avec la variante de glissement soit les mêmes œufs. En somme, votre variante est optimale, malheureusement.

 
prostotrader:

Idem pour un ordre au marché (sur la Bourse)

Ajouté

Si un ordre de marché est envoyé, dès que nous recevons le ticket, nous nous rendons avec lui dans l'historique et

voir ce qui lui est arrivé.

Théoriquement, il est possible que CTrade::ResultDeal() renvoie zéro et CTrade::ResultOrder() renvoie 0 ? par exemple, avec TRADE_RETCODE_TIMEOUT.
 
prostotrader:

OrderSend() est une fonction absolument synchrone - si un ticket est reçu, tout est exécuté.

Voici un exemple

Ajouté, et voici les logs

https://www.mql5.com/ru/forum/38456/page85#comment_2888263

Merci pour le lien. Mais la question était un peu différente. Il ne s'agissait pas d'une question, mais d'un argument en faveur de la vérification du statut de l'ordre sur place, sans attendre le déclenchement de l'événement OnTrade().
 
Oleg Shenker:
Je vous remercie pour le lien. Mais ma question était un peu différente. Il ne s'agissait pas d'une question mais d'un argument en faveur de la vérification de l'état de l'ordre sur place, sans attendre le traitement de l'événement OnTrade().

Vous n'avez pas dû regarder le code de l'exemple.

if(SendOrderSyncMode())
           {
            if(order_ticket>0)
              {
               if(OrderSelect(order_ticket))
                 {
                  RemoveOrderSyncMode(order_ticket);
                 }
               else
                 {
                  Print(__FUNCTION__," Order not select! Ticket = ",order_ticket);
                 }
              }
           }

La suppression de l'ordre en mode synchrone (OrderSend()) aurait dû avoir lieu après la réponse de l'utilisateur.

Lafonction SendOrserSyncMode, mais cela ne s'est pas produit.

2016.10.14 02:18:20.292 Trades'3941932': échec de l'annulation de l'ordre #102956267 buy limit 1.00 GBPUSD à 1.22374 [Requête invalide].

C'est là que réside l'erreur. Selon la documentation, si nous avons reçu un ticket, l'ordre a été placé dans le système de négociation,

Mais ce n'est pas le cas (dans le FOREX), et la suppression s'est produite dans le corps de la fonctionRemoveOrderAsyncMode, à savoir

après avoir reçu un message dans OnTradeTransaction

Ajouté

Pour répondre à la question du premier venu, après avoir envoyé une commande à l'aide de la fonction OrderSend(),

l'ordre peut être traité après réception de l'événement dans OntradeTransaction (OnTrade).

Il semble que les développeurs vont corriger le problème.

Ajouté

Maintenant, j'ai regardé sur FORTS - ce problème s'y trouve également.

2016.10.17 18:45:19.074 Trades  '1007932': buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.081 Trades  '1007932': accepted buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.081 Trades  '1007932': buy limit 1.00 GAZR-12.16 at 12847 placed for execution
2016.10.17 18:45:19.091 Trades  '1007932': order #52178167 buy limit 1.00 / 1.00 GAZR-12.16 at 12847 done in 17.440 ms
2016.10.17 18:45:19.091 Trades  '1007932': failed cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847.00000 [Invalid request]
2016.10.17 18:45:19.091 Trades  '1007932': cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.098 Trades  '1007932': accepted cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.099 Trades  '1007932': cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847 placed for execution in 7.215 ms

2016.10.17 18:45:19.074 TestOrders (GAZR-12.16,M1)      OnChartEvent Send Order Sync mode
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      SendOrderSyncMode Order sent in sync mode
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      RemoveOrderSyncMode Order not sent (remove) in sync mode.
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_ADD
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order update state = ORDER_STATE_REQUEST_ADD
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order update state = ORDER_STATE_PLACED
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order plased done. Ticket = 52178167
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      RemoveOrderAsyncMode Order sent (remove) in async mode
2016.10.17 18:45:19.098 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.098 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order get ticket done. Ticket = 52178167
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_DELETE
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_HISTORY_ADD
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order remove done. Ticket = 52178167
 
prostotrader:

Pour répondre à la question du top-trader, après avoir envoyé un ordre en utilisant la fonction OrderSend(),

vous pouvez agir sur l'ordre après avoir reçu l'événement dans OntradeTransaction (OnTrade).

Dans le cas de deux EAs sur le même symbole ?
 
fxsaber:
Dans le cas de deux EAs sur le même symbole ?

Oui, deux EAs sur le même symbole.

struct MqlTradeRequest
  {
   ENUM_TRADE_REQUEST_ACTIONS    action;           // Тип выполняемого действия
   ulong                         magic;            // Штамп эксперта (идентификатор magic number)
   ulong                         order;            // Тикет ордера
   string                        symbol;           // Имя торгового инструмента
   double                        volume;           // Запрашиваемый объем сделки в лотах
   double                        price;            // Цена  
   double                        stoplimit;        // Уровень StopLimit ордера
   double                        sl;               // Уровень Stop Loss ордера
   double                        tp;               // Уровень Take Profit ордера
   ulong                         deviation;        // Максимально приемлемое отклонение от запрашиваемой цены
   ENUM_ORDER_TYPE               type;             // Тип ордера
   ENUM_ORDER_TYPE_FILLING       type_filling;     // Тип ордера по исполнению
   ENUM_ORDER_TYPE_TIME          type_time;        // Тип ордера по времени действия
   datetime                      expiration;       // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED)
   string                        comment;          // Комментарий к ордеру
   ulong                         position;         // Тикет позиции
   ulong                         position_by;      // Тикет встречной позиции
  };

Éliminer les "mauvaises" positions, ordres et transactions.

Raison: