Discussion de l'article "Ordres, positions et transactions dans MetaTrader 5" - page 4

 

Si la fonction OrderSend a retourné true et que result.order a un ticket d'ordre (result.order!=0), est-ce que cela garantit que l'ordre est accepté par le courtier et qu'il est dans l'onglet trading ou à ce stade la demande est acceptée seulement par le serveur du courtier mais pas par la bourse ?

Et la deuxième question, peut-il y avoir une situation où OrderSend renvoie true et result.order==0 ?

 
Aleksey Gunin:

Pouvez-vous me dire si la fonction OrderSend retourne true et si result.order a un ticket d'ordre (result.order!=0), cela garantit-il que l'ordre est accepté par le courtier et qu'il est dans l'onglet trading ou à ce stade la demande est acceptée seulement par le serveur du courtier mais pas par la bourse ?

C'est garanti.

Et la deuxième question, peut-il y avoir une situation où OrderSend renvoie true et result.order==0 ?

Non.

 
fxsaber:

Garanties.

Non.

L'autre jour, ils ont ajouté une clarification pour la fonction OrderSend, voir l'aide en ligne.

 
Rashid Umarov:

L'autre jour, une clarification a été apportée à la fonction OrderSend(voir l'aide en ligne).

Cela s'applique-t-il aux ordres de marché ?

Chaque ordre accepté est stocké sur le serveur de négociation en attendant d'être traité jusqu'à ce que l'une des conditions de son exécution se produise :

  • l'expiration,
  • l'apparition d'une contre-demande,
  • déclenchement de l'ordre à la réception du prix d'exécution,
  • réception d'une demande d'annulation de l'ordre.
Il n'est pas spécifié que le terminal lui-même appelle toujours OrderCheck avant OrderSendAsync, et OrderSend est un complément à OrderSendAsync.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Erreurs typiques et moyens de les éliminer lorsque l'on travaille dans l'environnement de négociation

fxsaber, 2018.02.20 12:23 pm.

Schéma conditionnel de la mise en œuvre de l'OrderSend standard (sans timeout).
static MqlTradeResult LastResult = {0};

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult &Result )
{ 
  LastResult = Result;
}

// Algorithme conditionnel pour la mise en œuvre de la norme OrderSend
bool OrderSend( const MqlTradeRequest &Request, MqlTradeResult &Result )
{  
  bool Res = OrderSendAsync(Request, Result);
  
  if (Res)
  {
    while (LastResult.request_id != Result.request_id)
      OnTradeTransaction(); // appel schématique
          
    Result = LastResult;    
    Res = (Result.retcode == TRADE_RETCODE_PLACED) ||
          (Result.retcode == TRADE_RETCODE_DONE) ||
          (Result.retcode == TRADE_RETCODE_DONE_PARTIAL);

    LastResult.request_id = 0;
  }
    
  return(Res);
}


À partir de ce schéma, nous pouvons clairement voir que lors du placement d'un ordre de marché via OrderSendAsync sur le même MetaQuotes-Demo, il est impossible de garantir attraper l'événement de placement de l'ordre correspondant jusqu'à ce que l'ordre soit exécuté ou rejeté. En effet, MT5 ne dispose pas de mécanismes simples pour évaluer les résultats intermédiaires de son OrderSendAsync.


OrderSend est exécuté jusqu'à ce que Result.request_id soit égal à la même valeur de OrderSendAsync dans OnTradeTransaction. Ou jusqu'à ce qu'il soit interrompu par un délai d'attente. Par conséquent, le résultat de OrderSend dépend uniquement du type de message dans OnTradeTransaction avec le request_id correspondant.

Il serait utile de connaître la formation du request_id lui-même. Si je comprends bien, il s'agit d'un compteur d'ordres envoyés au serveur commercial à partir du moment où le terminal/compte est lancé/connecté. Le terminal lui-même analyse les messages entrants du serveur commercial et attribue le request_id requis à un seul (ce qui est douteux), ou réinitialise le request_id à un certain message (ce qui est le plus probable). Ce comportement a permis, il y a quelque temps, de faire correspondre l'historique des offres à la sortie d'OrderSend. Mais comme un seul message dans OnTradeTransaction est visible avec le bon request_id, la situation désagréable en mode asynchrone décrite dans la citation ci-dessus se produit.

 

Bonjour, j'ai trouvé des incohérences pour MqlTradeResult.deal et MqlTradeResult.order

1) Description (Manuel de référence MQL5)


2) Négociation en temps réel

Je place des ordres de marché (TRADE_ACTION_DEAL). Je sors les valeurs de MqlTradeResult à l'aide de la fonction Print :


et la transaction apparaît dans le journal :

J'ai essayé de "m'endormir" avec la fonction Sleep pendant quelques secondes et d'éditer à nouveau les données (alors que la transaction est déjà exactement faite et que la position est ouverte), le numéro de la transaction n'est pas apparu.


3) Testeur de stratégie

Tous les champs sont remplis ici :



Qu'est-ce qui provoque de telles différences ?

 
Konstantin Kulikov:

Bonjour, j'ai trouvé des incohérences pour MqlTradeResult.deal et MqlTradeResult.order.




https://www.mql5.com/fr/docs/trading/ordersend

Lors de l'envoi d'un ordre de marché (MqlTradeRequest.action=TRADE_ACTION_DEAL), le résultat positif de la fonction OrderSend() ne signifie pas que l'ordre a été exécuté (les transactions correspondantes ont été exécutées) : true dans ce cas signifie seulement que l'ordre a été placé avec succès dans le système de négociation en vue d'une exécution ultérieure. Le serveur commercial peut indiquer les valeurs des champs de transaction ou d'ordre dans la structure de résultat renvoyée , s'il a connaissance de ces données au moment de l'élaboration de la réponse à l'appel de la fonction OrderSend(). En général, l'événement ou les événements d'exécution des transactions correspondant à l'ordre peuvent se produire après l'envoi de la réponse à l'appel OrderSend(). Par conséquent, pour tout type de demande de transaction, lors de la réception du résultat de l'exécution de la fonction OrderSend(), il est nécessaire de vérifier tout d'abord le code de retour du serveur commercial retcode et le code de réponse du système de négociation externe retcode_external (le cas échéant), qui sont disponibles dans la structure de résultat renvoyée.


Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговый запрос проходит несколько стадий проверок на торговом сервере. В первую очередь проверяется корректность заполнения всех необходимых полей параметра , и при отсутствии ошибок сервер принимает ордер для дальнейшей обработки. При успешном принятии ордера торговым сервером функция OrderSend() возвращает значение true. Рекомендуется...
 

Merci pour cet article si instructif. @MetaQuotes

Query : Comment puis-je boucler collectivement les ordres ouverts et les positions ouvertes dans une seule boucle for() (de la même manière que nous bouclons tous les ordres dans MQL4 et vérifions ensuite si un ordre est déjà exécuté ou s'il s'agit d'un ordre en attente) ?

 
Rahul Dhangar :

Merci pour cet article si instructif. @MetaQuotes

Query : Comment puis-je boucler collectivement les ordres ouverts et les positions ouvertes dans une seule boucle for() (de la même manière que nous bouclons tous les ordres dans MQL4 et vérifions ensuite si un ordre est déjà exécuté ou s'il s'agit d'un ordre en attente) ?

Pour calculer les POSITIONS et les ORDRES EN ATTENTE, vous devez utiliser deux cycles indépendants. Un cycle énumère les POSITIONS, et le second cycle énumère les ORDRES EN ATTENTE. Exemple : Calculer les positions et les ordres en attente

How to start with MQL5
How to start with MQL5
  • 2020.12.19
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 

Je sais que vous n'êtes pas vraiment du genre à vous préoccuper de ceux qui débutent dans le langage mql5, étant donné la forte communauté que vous avez, malgré de nombreuses critiques, en voici une de plus :

La traduction et la formulation même du texte nuit à la compréhension...J'ai sué, j'ai dû aller loin pour savoir qui devait passer en premier, puisque la documentation elle-même se contredit, dans le texte :

  • Historique des commandes

    Pour obtenir des informations sur une commande à partir de l'historique, vous devez d'abord créer le cache de l'historique de la commande à l'aide de l'une des trois fonctions suivantes : HistorySelect(start, end), HistorySelectByPosition() ou HistoryOrderSelect(ticket). Si l'exécution est réussie, le cache stockera le nombre de commandes, renvoyé par la fonctionHistoryOrdersTotal(). L'accès aux propriétés de ces commandes est effectué par chacun des éléments du ticket, à l'aide de la fonction appropriée :

    1. HistoryOrderGetDouble(ticket_order, type_property)
    2. HistoryOrderGetInteger(ticket_order, type_property)
    3. HistoryOrderGetString(ticket_order, type_property)


Contrairement à : https://www.mql5.com/fr/docs/trading/historyorderstotal transcrit ci-dessous.



HistoryOrdersTotal

Renvoie le nombre d'ordres dans l'historique. Avant d'appeler HistoryOrdersTotal(), vous devez d'abord recevoir l'historique des transactions et des ordres à l'aide de la fonctionHistorySelect() ou de la fonctionHistorySelectByPosition().

int HistoryOrdersTotal() ;

Valeur de retour

Valeur de typedouble.

Remarque

Ne pas confondre les ordres de l'historique des transactions avec lesordres en attente qui apparaissent dans l'onglet "Trade" de la barre Toolbox. La liste desordres qui ont été annulés ou qui ont donné lieu à une transaction est visible dans l'onglet "Historique" de la boîte à outils du terminal client.

Voir aussi


Le premier passage se contredit lui-même, il n'a pas besoin d'aide, mais le second vient achever de compliquer les choses.... : après tout, qui vient en premier, HistoryOrdersTotal ou l'une des trois fonctions HistorySelect (start, end) HistorySelectByPosition() ou HistoryOrderSelect(ticket), ou même HistorySelectByPosition(), mentionnée dans le second texte.

C'était difficile, ça aurait pu être plus facile... mais je pense que la première chose qui me vient à l'esprit est l'une des trois HistorySelect(start, end) HistorySelectByPosition () ou HistoryOrderSelect(ticket), ou même HistorySelectByPosition(), mentionnées dans le deuxième texte...

Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
  • www.mql5.com
HistoryOrdersTotal - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 

Bonjour,
question aux développeurs : pouvez-vous me donner une information approximative sur la quantité de mémoire que prend le cache de l'historique ? environ kbytes pour une transaction et une commande.

J'ai exécuté le script dans un terminal avec un petit historique et j'ai obtenu ce résultat :

void OnStart()
  {
   Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
   if(HistorySelect(0, INT_MAX))
     {
      Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
      Print("HistoryDealsTotal  = ", HistoryDealsTotal());
      Print("HistoryOrdersTotal = ", HistoryOrdersTotal());
     }
  }

2021.05.14 14:46:41.265	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 488
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 489
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryDealsTotal  = 1928
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryOrdersTotal = 1116

Cela signifie qu'avec un historique de quelques millions de transactions et d'un million d'ordres, le cache prendra environ un gigaoctet ?

Et ainsi pour chaque programme mql ?