Les erreurs typiques et la façon de les traiter dans l'environnement de négociation - page 9

 
Algotrader18:

Bonjour !

J'ai une question similaire pour tout le monde et surtout pour fxsaber.
Cela semble être une question primitive, mais je n'arrive pas à trouver la réponse à cette question.
On m'a dit ici https://www.mql5.com/ru/forum/6343/page939 "Essayez de le chercher. fxsaber travaille sur ce problème depuis un moment maintenant. Ce qui a marché, je ne sais pas, ça ne m'intéresse pas." J'ai donc décidé de vous demander.

La question est la suivante. J'ai ouvert une position et je veux imprimer le contenu de MqlTradeResult:

retcode, order et volume sont imprimés, mais deal et price sont toujours des zéros.
S'il vous plaît, conseillez-moi ce que je fais mal et comment obtenir l'accès (au moins, l'imprimer d'abord) au contenu de la structure de résultat ?

Que pensez-vous de ça ?

//+------------------------------------------------------------------+
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//---
   request.action   = TRADE_ACTION_DEAL;    // type of trade operation
   request.symbol   = Pair1;                // symbol
   request.volume   = lots;                 // volume of lot
   request.type     = oper;                 // order type
   request.price    = priceOpen;            // price for opening
   request.deviation= Slippage;             // allowed deviation from the price
   request.magic    = magic;   
//---
   if(OrderSend(request,result))
     {
      Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
      Print ("deal = " +IntegerToString (result.deal) + "; ");
      Print ("order = " +IntegerToString (result.order) + "; "); 
      Print ("volume = " +DoubleToString (result.volume) + "; ");  
      Print ("price = " +DoubleToString (result.price) + "; ");
     }
   else
     {
      // Здесь действия при ошибке открытия
     }
//+------------------------------------------------------------------+
 
Algotrader18:

J'ouvre une position et je veux imprimer le contenu de MqlTradeResult comme ceci :

retcode, order et volume sont imprimés mais deal et price sont toujours des zéros.
Veuillez m'indiquer ce que je fais mal et comment accéder (au moins l'imprimer en premier) au contenu de la structure de résultat?

Les zéros sont écrits dans le résultat.

 
Artyom Trishkin:

Que pensez-vous de ça ?

Merci, mais le résultat est le même...
 
fxsaber:

Les zéros et sont prescrits dans le résultat.

Alors ce n'est pas clair du tout - je pensais que je faisais quelque chose de mal, et s'il y a des zéros, à quoi sert le résultat ?
Je vois un ordre ouvert, j'obtiens result.retcode 10009 et result.price = 0 ?
Pouvez-vous expliquer la signification du terme "résultat" s'il ne contient pas de résultat ?
 
Algotrader18:
Veuillez expliquer quel est l'intérêt du résultat s'il ne contient pas le résultat ?

Il s'agit d'une fonctionnalité de MT5 où le résultat est uniquement un ordre (ticket et pas de prix) mais pas une transaction. Vous avez plusieurs possibilités

  1. Découvrez par vous-même comment les choses fonctionnent.
  2. Utilisez des développements de niveau supérieur déjà préparés (le niveau inférieur est caché) où presque tous les pièges sont contournés.
 
fxsaber:

Il s'agit d'une fonctionnalité de MT5 où le résultat est uniquement un ordre (ticket et pas de prix) mais pas une transaction. Vous avez plusieurs possibilités

  1. Découvrez par vous-même comment les choses fonctionnent.
  2. Utilisez des développements de niveau supérieur déjà préparés (le niveau inférieur est caché) où presque tous les pièges sont contournés.
Merci.

Dans MQL4, il n'y avait pas de structure de résultats et nous recevions un ticket et sélectionnions l'ordre approprié et demandions les données nécessaires. MQL5 possède la structure de résultat qui contient de nombreuses données nécessaires, et il serait illogique de ne pas l'utiliser.

1. Avant de poser une question sur le forum, j'ai essayé de "comprendre par moi-même comment tout fonctionne" et ce que je vois - dans la structure des résultats :

struct MqlTradeResult
  {
   uint     retcode;          // Operation return code
   ulong    deal;             // Deal ticket, if it is performed
   ulong    order;            // Order ticket, if it is placed
   double   volume;           // Deal volume, confirmed by broker
   double   price;            // Deal price, confirmed by broker
   double   bid;              // Current Bid price
   double   ask;              // Current Ask price
   string   comment;          // Broker comment to operation (by default it is filled by description of trade server return code)
   uint     request_id;       // Request ID set by the terminal during the dispatch
   uint     retcode_external; // Return code of an external trading system
  };


présent double prix ; // Prix de la transaction, confirmé par le courtier.

Dans l'exemple de code du développeur

//--- send the request
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());     // if unable to send the request, output the error code
//--- information about the operation
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
sort result.deal, c'est-à-dire qu'il est supposé avoir un sens et qu'il n'est pas toujours représenté par zéro dans la structure du résultat. D'autres exemples pourraient être donnés qui indiquent que result.price ainsi que result.deal peuvent être obtenus à partir de MqlTradeResul, ce que j'ai essayé de faire.


Je n'ai vu nulle part l'information suivante : "Il s'agit d'une fonctionnalité de MT5, lorsque le résultat est uniquement un ordre (ticket et pas de prix), mais pas une transaction". Pouvez-vous me dire sur quelles informations vous vous êtes basé pour arriver à cette conclusion ?

2. Si vous connaissez des "développements de niveau supérieur déjà prêts (le niveau inférieur est caché)", qui permettent d'obtenir les paramètres d'une position immédiatement après son ouverture (le code 10009 apparaît), sans sélection préalable par ticket, veuillez me donner un exemple ou me donner un lien vers celui-ci.

 
Algotrader18:
Merci.

Dans MQL4, il n'y avait pas de structure de résultats et nous devions sélectionner l'ordre approprié et demander les données nécessaires. MQL5 possède la structure de résultat avec de nombreuses données nécessaires et il serait illogique de ne pas l'utiliser.

1. Avant de poser une question dans le forum, j'ai essayé de "comprendre par moi-même comment tout fonctionne" et ce que j'ai vu, c'est que le résultat de la structure :


Il y a un double prix ; // Prix de la transaction, confirmé par le courtier.

Dans l'exemple de code du développeur

sort result.deal, c'est-à-dire qu'il est supposé avoir un sens et qu'il n'est pas toujours représenté par zéro dans la structure du résultat. Il existe d'autres exemples qui indiquent que result.price ainsi que result.deal peuvent être obtenus à partir de MqlTradeResul, ce que j'ai essayé de faire.


Je n'ai vu nulle part d'information indiquant que "c'est une fonctionnalité de MT5 où le résultat est seulement un ordre (ticket et pas de prix) mais pas une transaction". Pouvez-vous me dire sur quelles informations vous vous êtes basé pour arriver à cette conclusion ?

2. Si vous connaissez des "développements de niveau supérieur prêts à l'emploi (le niveau inférieur est caché)", qui permettent d'obtenir les paramètres d'une position immédiatement après son ouverture (le code 10009 apparaît), sans sélection préalable par ticket, veuillez en donner un exemple ou donner un lien vers celui-ci.

Une demande de transaction donne lieu soit à un rejet, soit à un ordre au marché. Il ne s'agit pas d'une transaction, ni d'une position générée par une transaction.

  1. Un ordre de transaction pour ouvrir une position est envoyé au serveur (order = ordre)
  2. Si la commande est acceptée, le résultat de l'acceptation de la commande et de son placement dans la file d'attente est renvoyé.
  3. Si l'ordre a été exécuté, la transaction - le résultat de l'exécution de l'ordre - apparaît.
  4. La transaction se traduira soit par une nouvelle position, soit par une augmentation/diminution de la taille de la position existante, soit par la fermeture de la position, soit par un roulement. Ou une nouvelle position (dans un compte de couverture).
 
Artyom Trishkin:

Une demande de transaction donne lieu soit à un rejet, soit à un ordre au marché. Il ne s'agit pas d'une transaction, ni d'une position générée par une transaction.

  1. Un ordre de transaction pour ouvrir une position est envoyé au serveur (order = ordre)
  2. Si la commande est acceptée, le résultat de l'acceptation de la commande et de son placement dans la file d'attente est renvoyé.
  3. Si l'ordre a été exécuté, une transaction apparaîtra comme résultat de l'exécution de l'ordre.
  4. Le résultat d'une transaction sera soit une nouvelle position, soit une augmentation/diminution de la taille d'une position existante, soit la fermeture d'une position, soit un rollover. Ou une nouvelle position (dans le cas d'un compte de couverture)
Merci - dites-moi s'il vous plaît :
- Après quelle étape pensez-vous que la structure de résultat de la demande de transaction (MqlTradeResult) apparaisse, parmi celles que vous avez énumérées ?

- Selon la description du MQL5 :
" Structure du résultat de la demande de transaction (MqlTradeResult)
En réponse à une demande de transaction, le serveur commercial renvoie des données contenant le résultat du traitement de la demande de transaction sous la forme d'une structure prédéfinie spéciale MqlTradeResult". et "10009 TRADE_RETCODE_DONE Ordre exécuté".

C'est-à-dire que le code de retour 10009 du serveur de commerce signifie que la demande d'envoi d'ordre a été exécutée avec succès. Si je demande des données à partir de MqlTradeResult, après avoir reçu le code 10009, comment puis-je expliquer que result.price = 0 ?
 
Algotrader18:
Merci :
- Après quelle étape, parmi celles que vous avez listées, la structure du résultat de la demande de transaction (MqlTradeResult) apparaît-elle ?

- Selon la description du MQL5 :
" Structure du résultat de la demande de transaction (MqlTradeResult)
En réponse à une demande de transaction, le serveur commercial renvoie des données contenant le résultat du traitement de la demande de transaction sous la forme d'une structure prédéfinie spéciale MqlTradeResult". et "10009 TRADE_RETCODE_DONE Ordre exécuté".

Par conséquent, le code de retour du serveur de commerce 10009 signifie que la requête OrderSend a été exécutée avec succès, c'est-à-dire que si je demande des données à partir de MqlTradeResult, après avoir reçu le code 10009, comment puis-je expliquer que result.price = 0 ?

10009 TRADE_RETCODE_DONE - vous l'avez décrit vous-même - l'ordre a été exécuté. Il s'agit simplement du fait que la commande a été mise en file d'attente avec succès sur le serveur pour être exécutée.

En outre, si cet ordre est exécuté (après tout, il peut être rejeté par le serveur), alors il y a une transaction - c'est le résultat de la transaction avec le prix d'ouverture.

Lire la suite

OnTradeTransaction

Il est appelé dans les Expert Advisors lorsqu'un événement TradeTransaction se produit. Cette fonction est destinée à traiter les résultats de l'exécution de la demande de transaction.

voidOnTradeTransaction( )
const MqlTradeTransaction&trans,// structure d'une transaction commerciale
const MqlTradeRequest&request,// structure de la requête
const MqlTradeResult& result// structure de la réponse
) ;

Документация по MQL5: Обработка событий / OnTradeTransaction
Документация по MQL5: Обработка событий / OnTradeTransaction
  • www.mql5.com
При обрабокте транзакций типа TRADE_TRANSACTION_REQUEST для получения дополнительной информации необходимо анализировать второй и третий параметры функции OnTradeTransaction() – Отправка торгового запроса на покупку приводит к цепи торговых транзакций, которые совершаются на торговом счете: 1) запрос  принимается на обработку, 2) далее для...
 
Algotrader18:

Je n'ai vu nulle part l'information suivante : "Il s'agit d'une fonctionnalité de MT5 où le résultat est seulement un ordre (ticket et pas de prix) mais pas une transaction". Veuillez me dire sur la base de quelles informations vous êtes parvenu à cette conclusion.

Expérience personnelle.

2. Si vous connaissez des "développements de niveau supérieur déjà prêts (le niveau inférieur est caché)", qui permettent d'obtenir les paramètres d'une position immédiatement après son ouverture (le code 10009 apparaît), sans sélection préalable par ticket, veuillez en donner un exemple ou donner un lien vers celui-ci.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void Variant1()
{
  if (OrderSelect(OrderSend(_Symbol, OP_BUY, 0.1, Ask, 100, 0, 0), SELECT_BY_TICKET))
    OrderPrint();
}

void Variant2()
{
  OrderSend(_Symbol, OP_SELL, 0.1, Bid, 100, 0, 0);
  MqlTradeResult result = MT4ORDERS::LastTradeResult;
  
  Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
  Print ("deal = " +IntegerToString (result.deal) + "; ");
  Print ("order = " +IntegerToString (result.order) + "; "); 
  Print ("volume = " +DoubleToString (result.volume) + "; ");  
  Print ("price = " +DoubleToString (result.price) + "; ");
}

void OnStart()
{
  Variant1();
  Variant2();
}
#2212868739 2018.11.02 21:09:33 buy 0.10 EURUSD 1.13895 0.00000 0.00000 1.13892 -0.18 0.00 -0.26 0
retcode = 10009; 
deal = 2210317244; 
order = 2212868740; 
volume = 0.10000000; 
price = 1.13892000; 


Il existe une autre option, mais elle est "avancée".

Raison: