order_send

Envoie une requête au serveur de trading pour effectuer une opération de trading depuis le terminal. La fonction est similaire à OrderSend.

order_send(
   request      // structure de la requête
   );

Paramètres

request

[in] Structure de type MqlTradeRequest décrivant une action de trading désirée. Paramètre non nommé requis. Un exemple de remplissage d'une requête et le contenu de l'énumération sont décrits ci-dessous.

Valeur de Retour

Résultat d'exécution sous la forme d'une structure MqlTradeResult. Le champ request dans la réponse contient la structure de la requête de trading passée à order_send ().

La structure MqlTradeRequest de la requête de trading

Champ

Description

action

Type de l'opération de trading. La valeur peut être l'une des valeurs de l'énumération TRADE_REQUEST_ACTIONS

magic

Identifiant de l'EA. Permet d'organiser le traitement analytique des ordres de trading. Chaque EA peut définir un identifiant unique lors de l'envoi d'une demande de trading

order

Ticket de l'ordre. Requis pour modifier les ordres en attente

symbol

Le nom de l'instrument de trading pour lequel l'ordre est passé. Non requis lors de la modification des ordres et la fermeture des positions

volume

Volume demandé d'une transaction en lots. Un volume réel lors d'une transaction dépend du type d'exécution de l'ordre.

price

Prix auquel un ordre doit être exécuté. Le prix n'est pas fixé en cas d'ordres au marché pour des instruments de type "Exécution au Marché" (SYMBOL_TRADE_EXECUTION_MARKET) de type TRADE_ACTION_DEAL

stoplimit

Un prix auquel un ordre à cours limité est fixé lorsque le prix atteint la valeur 'prix' (cette condition est obligatoire). L'ordre en attente n'est transmis au système de trading qu'à ce moment

sl

Un prix auquel un ordre Stop Loss est activé lorsque le prix évolue dans une direction défavorable

tp

Un prix auquel un ordre Take Profit est activé lorsque le prix évolue dans une direction favorable

deviation

Déviation maximale acceptable par rapport au prix demandé, spécifié en points

type

Type de l'ordre. La valeur peut être l'une des valeurs de l'énumération ORDER_TYPE

type_filling

Type de remplissage de l'ordre. La valeur peut être l'une des valeurs de ORDER_TYPE_FILLING

type_time

Type d'ordre par expiration. La valeur peut être l'une des valeurs de ORDER_TYPE_TIME

expiration

Délai d'expiration de l'ordre en attente (pour les ordres de type TIME_SPECIFIED)

comment

Commentaire d'un ordre

position

Ticket de la position. Remplissez-le lorsque vous changez et fermez une position pour une identification claire. Habituellement, c'est le même que le ticket de l'ordre qui a ouvert la position.

position_by

Ticket de la position opposée. Il est utilisé lors de la fermeture d'une position par une position opposée (ouverte sur le même symbole mais dans la direction opposée).

Note

Une requête de trading passe plusieurs étapes de vérification sur le serveur de trading. Tout d'abord, la validité de tous les champs request nécessaires est vérifiée. S'il n'y a pas d'erreur, le serveur accepte l'ordre pour un traitement ultérieur. Voir la description de la fonction OrderSend pour plus de détails sur l'exécution des opérations de trading.

Exemple :

import time
import MetaTrader5 as mt5
 
# affiche les données sur le package MetaTrader 5
print("Auteur du package MetaTrader5 : "mt5.__author__)
print("Version du package MetaTrader5 : "mt5.__version__)
 
# établit une connexion avec le terminal MetaTrader 5
if not mt5.initialize():
 print("initialize () a échoué, code d'erreur =",mt5.last_error())
    quit()
 
# prépare la structure de la requête d'achat
symbol = "USDJPY"
symbol_info = mt5.symbol_info(symbol)
if symbol_info is None:
    print(symbol, "non trouvé, ne peut pas appeler order_check()")
    mt5.shutdown()
    quit()
 
# si le symbole n'est pas disponible dans le MarketWatch, il est ajouté
if not symbol_info.visible:
    print(symbol, "n'est pas visible, tentative de l'afficher")
    if not mt5.symbol_select(symbol,True):
        print("symbol_select({}}) a échoué, sortie",symbol)
        mt5.shutdown()
        quit()
 
lot = 0.1
point = mt5.symbol_info(symbol).point
price = mt5.symbol_info_tick(symbol).ask
deviation = 20
request = {
    "action"mt5.TRADE_ACTION_DEAL,
    "symbol"symbol,
    "volume"lot,
    "type"mt5.ORDER_TYPE_BUY,
    "price"price,
    "sl"price - 100 * point,
    "tp"price + 100 * point,
    "deviation"deviation,
    "magic"234000,
    "comment""python script open",
    "type_time"mt5.ORDER_TIME_GTC,
    "type_filling"mt5.ORDER_FILLING_RETURN,
}
 
# envoie une demande de trading
result = mt5.order_send(request)
# vérifie le résultat de l'exécution
print("1. order_send(): buy {} {} lots à {} avec une déviation={} points".format(symbol,lot,price,deviation));
if result.retcode != mt5.TRADE_RETCODE_DONE:
    print("2. order_send a échoué, retcode={}".format(result.retcode))
   # demande le résultat sous forme de dictionnaire et l'affiche élément par élément
    result_dict=result._asdict()
    for field in result_dict.keys():
        print("   {}={}".format(field,result_dict[field]))
 # s'il s'agit de la structure d'une requête de trading, elle est affichée également élément par élément
        if field=="request":
            traderequest_dict=result_dict[field]._asdict()
            for tradereq_filed in traderequest_dict:
                print("       traderequest: {}={}".format(tradereq_filed,traderequest_dict[tradereq_filed]))
    print("shutdown() et sortie")
    mt5.shutdown()
    quit()
 
print("2. order_send terminé, "result)
print("   position ouverte avec POSITION_TICKET={}".format(result.order))
print("   sleep de 2 secondes avant de fermer la position #{}".format(result.order))
time.sleep(2)
# crée une demande de fermeture
position_id=result.order
price=mt5.symbol_info_tick(symbol).bid
deviation=20
request={
    "action"mt5.TRADE_ACTION_DEAL,
    "symbol"symbol,
    "volume"lot,
    "type"mt5.ORDER_TYPE_SELL,
    "position"position_id,
    "price"price,
    "deviation"deviation,
    "magic"234000,
    "comment""python script close",
    "type_time"mt5.ORDER_TIME_GTC,
    "type_filling"mt5.ORDER_FILLING_RETURN,
}
# envoie une demande de trading
result=mt5.order_send(request)
# vérifie le résultat de l'exécution
print("3. ferme la position #{} : sell {} {} lots à {} avec la déviation={} points".format(position_id,symbol,lot,price,deviation));
if result.retcode != mt5.TRADE_RETCODE_DONE:
    print("4. order_send a échoué, retcode={}".format(result.retcode))
    print("   résultat",result)
else:
    print("4. position #{} fermée, {}".format(position_id,result))
   # demande le résultat sous forme de dictionnaire et l'affiche élément par élément
    result_dict=result._asdict()
    for field in result_dict.keys():
        print("   {}={}".format(field,result_dict[field]))
 # s'il s'agit de la structure d'une requête de trading, elle est affichée également élément par élément
        if field=="request":
            traderequest_dict=result_dict[field]._asdict()
            for tradereq_filed in traderequest_dict:
                print("       traderequest: {}={}".format(tradereq_filed,traderequest_dict[tradereq_filed]))
 
# ferme la connexion au terminal MetaTrader 5
mt5.shutdown()
 
Résultat
Auteur du package MetaTrader5 :  MetaQuotes Software Corp.
Version du package MetaTrader5 :  5.0.29
1. order_send(): buy USDJPY 0.1 lots à 108.023 avec une déviation=20 points
2. order_send terminé,  OrderSendResult(retcode=10009, deal=535084512, order=557416535, volume=0.1, price=108.023, ...
  position ouverte avec POSITION_TICKET=557416535
  sleep de 2 secondes avant de fermer la position #557416535
3. ferme la position #557416535 : sell USDJPY 0.1 lots à 108.018 avec la déviation=20 points
4. position #557416535 fermée, OrderSendResult(retcode=10009, deal=535084631, order=557416654, volume=0.1, price=...
   retcode=10009
   deal=535084631
   order=557416654
   volume=0.1
   price=108.015
   bid=108.015
   ask=108.02
   comment=Request executed
   request_id=55
   retcode_external=0
   request=TradeRequest(action=1, magic=234000, order=0, symbol='USDJPY', volume=0.1, price=108.018, stoplimit=0.0, ...
       traderequest: action=1
       traderequest: magic=234000
       traderequest: order=0
       traderequest: symbol=USDJPY
       traderequest: volume=0.1
       traderequest: price=108.018
       traderequest: stoplimit=0.0
       traderequest: sl=0.0
       traderequest: tp=0.0
       traderequest: deviation=20
       traderequest: type=1
       traderequest: type_filling=2
       traderequest: type_time=0
       traderequest: expiration=0
       traderequest: comment=python script close
       traderequest: position=557416535
       traderequest: position_by=0

Voir aussi

order_check, OrderSend,Types d'opération de trading, Structure de requête de trading, Structure des résultats de la vérification d'une requête de trading, Structure de résultat d'une requête de trading