Questions des débutants MQL5 MT5 MetaTrader 5 - page 815

 
pivomoe:
Je n'arrive pas à savoir si c'est normal que...

Il y a beaucoup de choses qui sont difficiles à comprendre ici. En particulier, en ce qui concerne la séquence des transactions, j'ai constaté qu'il y avait des incohérences dans un certain nombre de cas.
Par exemple, lors de l'ouverture d'une position, un ordre au marché est formellement ouvert en premier, qui se transforme ensuite en position. Cependant, au cours de cette série de transactions à la mitraillette, il arrive qu'une position ait déjà été ouverte, mais que l'ordre n'ait pas encore été clôturé. Il s'agit clairement du même événement, mais les transactions sont organisées de manière fragmentaire, émises de manière séquentielle, et avec cette approche, il est en principe impossible de refléter correctement la transformation d'un ordre de marché en position.

À mon avis, il est préférable d'organiser le contrôle de vos transactions : mémorisez vos ordres de transactions et contrôlez la composition des ordres et des positions par le simple fait de leur présence dans les listes correspondantes.
 

En parlant d'oiseaux.

Saviez-vous que les ordres au marché sont émis dans ces transactions avec un prix nul ?
Par exemple, une personne veut ouvrir une position d'achat à 1.2000, Sl=1.1000, Tr=1.3000.
Lorsque cette transaction est exécutée, la première chose qui apparaît est l'ordre au marché avec les données suivantes :
Sl= 1.1000, Tr=1.3000, c'est-à-dire avec les chiffres sélectionnés et Price=0 (égal à zéro). Juste une sorte d'ordre de marché avec un prix nul :) Et pense ce que tu veux.

 
pivomoe:

Pour plus de commodité. Une petite fonction est appelée depuis MqlTradeTransaction. L'élément requis y est trouvé par la recherche d'éléments de la classe. Et pour cet élément, on appelle une des fonctions de la classe qui fait quelque chose d'utile.


Veuillez décrire plus en détail ce que vous voulez obtenir exactement ? Pourquoi appelez-vous quelque chose depuis OnTradeTransaction ?

D'abord juste en paroles, ensuite on corrigera dans le bon sens.

 
User_mt5:
La fonction Abc() de l'utilisateur est exécutée, et elle met en œuvre un algorithme long (en termes de temps).
Au cours de l'exécution de cette fonction, certains événements ont lieu, par exemple - Trade, Timer, etc.
Est-il possible de savoir que ces événements se sont produits sans terminer l'exécution de la fonction Abc() ?

Non. Pendant qu'une fonction est en train de compter, toutes les autres sont sautées.

Elle est similaire à lafonctionSleep()- c'est-à-dire que si votre fonction compte pendant un temps très long, son comportement est similaire à Sleep - tous les autres événements seront ignorés.

 
User_mt5:

...


Absolument tout est transparent dans OnTradeTransaction.

Premièrement,la structure MqlTradeTransaction est remplie différemment selon le type de transaction (ENUM_TRADE_TRANSACTION_TYPE).

lire ici :Structure d'une transaction commerciale (MqlTradeTransaction)

Deuxièmement : Pour visualiser les résultats, nous pouvons extraire ce bloc de code de l'exempleOrderSendAsync

//+------------------------------------------------------------------+ 
//| TradeTransaction function                                        | 
//+------------------------------------------------------------------+ 
void OnTradeTransaction(const MqlTradeTransaction &trans, 
                        const MqlTradeRequest &request, 
                        const MqlTradeResult &result) 
  { 
//--- получим тип транзакции в виде значения перечисления  
   ENUM_TRADE_TRANSACTION_TYPE type=(ENUM_TRADE_TRANSACTION_TYPE)trans.type; 
//--- если транзакция является результатом обработки запроса, выведем только её название 
   if(type==TRADE_TRANSACTION_REQUEST) 
     { 
      Print(EnumToString(type)); 
      //--- выведем строковое описание обработанного запроса 
      Print("------------RequestDescription\r\n",RequestDescription(request)); 
      //--- выведем описание результата запроса 
      Print("------------ResultDescription\r\n",TradeResultDescription(result)); 
      //--- запомним тикет ордера для его удаления на следующей обработке в OnTick() 
      if(result.order!=0) 
        { 
         //--- удалим этот ордер по его тикету при следующем вызове OnTick() 
         order_ticket=result.order; 
         Print(" Тикет отложенного ордера ",order_ticket,"\r\n"); 
        } 
     } 
   else // для транзакций другого типа выведем полное описание 
//--- выведем описание полученной транзакции в Журнал 
      Print("------------TransactionDescription\r\n",TransactionDescription(trans));
 
//---      
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание транзакции                         | 
//+------------------------------------------------------------------+ 
string TransactionDescription(const MqlTradeTransaction &trans) 
  { 
//---  
   string desc=EnumToString(trans.type)+"\r\n"; 
   desc+="Symbol: "+trans.symbol+"\r\n"; 
   desc+="Deal ticket: "+(string)trans.deal+"\r\n"; 
   desc+="Deal type: "+EnumToString(trans.deal_type)+"\r\n"; 
   desc+="Order ticket: "+(string)trans.order+"\r\n"; 
   desc+="Order type: "+EnumToString(trans.order_type)+"\r\n"; 
   desc+="Order state: "+EnumToString(trans.order_state)+"\r\n"; 
   desc+="Order time type: "+EnumToString(trans.time_type)+"\r\n"; 
   desc+="Order expiration: "+TimeToString(trans.time_expiration)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",trans.price)+"\r\n"; 
   desc+="Price trigger: "+StringFormat("%G",trans.price_trigger)+"\r\n"; 
   desc+="Stop Loss: "+StringFormat("%G",trans.price_sl)+"\r\n"; 
   desc+="Take Profit: "+StringFormat("%G",trans.price_tp)+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",trans.volume)+"\r\n"; 
   desc+="Position: "+(string)trans.position+"\r\n"; 
   desc+="Position by: "+(string)trans.position_by+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание торгового запроса                  | 
//+------------------------------------------------------------------+ 
string RequestDescription(const MqlTradeRequest &request) 
  { 
//--- 
   string desc=EnumToString(request.action)+"\r\n"; 
   desc+="Symbol: "+request.symbol+"\r\n"; 
   desc+="Magic Number: "+StringFormat("%d",request.magic)+"\r\n"; 
   desc+="Order ticket: "+(string)request.order+"\r\n"; 
   desc+="Order type: "+EnumToString(request.type)+"\r\n"; 
   desc+="Order filling: "+EnumToString(request.type_filling)+"\r\n"; 
   desc+="Order time type: "+EnumToString(request.type_time)+"\r\n"; 
   desc+="Order expiration: "+TimeToString(request.expiration)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",request.price)+"\r\n"; 
   desc+="Deviation points: "+StringFormat("%G",request.deviation)+"\r\n"; 
   desc+="Stop Loss: "+StringFormat("%G",request.sl)+"\r\n"; 
   desc+="Take Profit: "+StringFormat("%G",request.tp)+"\r\n"; 
   desc+="Stop Limit: "+StringFormat("%G",request.stoplimit)+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",request.volume)+"\r\n"; 
   desc+="Comment: "+request.comment+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание результата обработки запроса       | 
//+------------------------------------------------------------------+ 
string TradeResultDescription(const MqlTradeResult &result) 
  { 
//--- 
   string desc="Retcode "+(string)result.retcode+"\r\n"; 
   desc+="Request ID: "+StringFormat("%d",result.request_id)+"\r\n"; 
   desc+="Order ticket: "+(string)result.order+"\r\n"; 
   desc+="Deal ticket: "+(string)result.deal+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",result.volume)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",result.price)+"\r\n"; 
   desc+="Ask: "+StringFormat("%G",result.ask)+"\r\n"; 
   desc+="Bid: "+StringFormat("%G",result.bid)+"\r\n"; 
   desc+="Comment: "+result.comment+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  }

et le coller dans un conseiller expert qui peut être attaché à un graphique. Vous pouvez ensuite ouvrir/fermer manuellement des positions et consulter l'impression des résultats dans l'onglet Experts.

 
Vladimir Karputov:

Non. Pendant qu'une fonction est en train de compter, toutes les autres sont sautées.

Elle est analogue à lafonctionSleep()- c'est-à-dire que si votre fonction compte pendant un temps très long, son comportement est anflogique à Sleep - tous les événements de repos seront ignorés.

Merci, c'est malheureux.
Et comment utiliser efficacement la ressource PC alors ? Encore du code en boucle et une interrogation périodique des paramètres ?

 
Vladimir Karputov:

Absolument tout est transparent dans OnTradeTransaction.

Merci pour la réponse, c'est à peu près ce que j'ai fait. Plus de questions que d'idées jusqu'à présent...

 
Vladimir Karputov:

Veuillez décrire plus en détail ce que vous voulez obtenir exactement ? Pourquoi appelez-vous quelque chose depuis OnTradeTransaction ?

D'abord juste en paroles, ensuite on corrigera dans le bon sens.

J'ai compris que le problème ne vient pas de OnTradeTransaction. Regardez le désordre que j'ai ici :

Voici le code.

 CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
 if( !PositionInfoVedygii.Select("SBRF-12.17")   )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");

 Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());

Et voici le résultat de son exécution

2017.09.22 10:30:12 Impossible de sélectionner la position par le symbole SBRF-12.17
2017.09.22 10:30:12 Volume 0.0 Volume 0. 0

J'ai échangé les lignes 2 et 3, c'est à dire que le code est maintenant

CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if( !PositionInfoVedygii.Select("SBRF-12.17")   )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");
 if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
 
 Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());

J'obtiens un résultat comme celui-ci.

2017.09.22 10:30:12 Impossible de sélectionner la position par le symbole SBRF-12.17
2017.09.22 10:30:12 SBRF-3.18 Volume 1.0 SBRF-3.18 Volume 1.0

Dans les deux cas, aucun avertissement n'est généré par le compilateur. Vous trouverez ci-joint le code de 80 lignes du conseiller expert et les paramètres de test. Courtier BCS. La version 1730.

Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
  • www.metatrader5.com
На данной вкладке отображается журнал компиляции программ, содержащий сообщения об использованных при компиляции файлах, а также ошибки и предупреждения, возникшие в этом процессе. — описание события. Иконки, расположенные слева от описания свидетельствуют о типе события. означает ошибку, — предупреждение, а — информационное сообщение; Если...
Dossiers :
temp.mq5  7 kb
1.png  11 kb
 
pivomoe:

Je me suis rendu compte que le problème ne vient pas de OnTradeTransaction. Regardez le désordre que j'ai mis en place :

Voici le code.

Et voici le résultat de son exécution

2017.09.22 10:30:12 Impossible de sélectionner la position par le symbole SBRF-12.17
2017.09.22 10:30:12 Volume 0.0 Volume 0. 0

J'ai échangé les lignes 2 et 3, c'est-à-dire que le code est maintenant

J'obtiens un résultat comme celui-ci.

2017.09.22 10:30:12 Impossible de sélectionner la position par le symbole SBRF-12.17
2017.09.22 10:30:12 SBRF-3.18 Volume 1.0 SBRF-3.18 Volume 1.0

Dans les deux cas, aucun avertissement n'est généré par le compilateur. Vous trouverez ci-joint le code de 80 lignes du conseiller expert et les paramètres de test. Courtier BCS. La version 1730.

Je vous répondrai ce week-end. Désolé.

 

L'erreur semble provenir du fait que l'on essaie d'obtenir des informations sur plus d'une position, sur une ligne(Print).

Seules les informations concernant une position (sélectionnée ) sont disponibles à tout moment :

- Dans le second cas, tout est correct, car le dernier Select renvoie true, ce que vous n'avez pas vérifié.

- Et dans le premier cas : le dernier Select renvoie false, ce que vous n'avez pas non plus vérifié, et le résultat est imprévisible.

..... évidemment Select==false réinitialise les informations du Select==true précédent