Проверка и отправка торгового приказа

При необходимости вы можете осуществлять торговые операции непосредственно из скрипта Python. Пара функций — order_check и order_send — позволяет предварительно проверить и затем выполнить торговую операцию.

У обеих функций единственным параметром является структура запроса TradeRequest (на Python её можно проинициализировать как словарь, см. пример). Поля структуры полностью совпадают с MqlTradeRequest.

OrderCheckResult order_check(request)

Функция order_check проверяет правильность заполнения полей торгового запроса и достаточность средств для совершения требуемой торговой операции.

Результат функции возвращается в виде структуры OrderCheckResult. Она повторяет структуру MqlTradeCheckResult, но дополнительно содержит поле request с копией исходного запроса.

Функция order_check является аналогом OrderCheck.

Пример (MQL5/Scripts/MQL5Book/python/ordercheck.py):

import MetaTrader5 as mt5
   
# установим подключение к терминалу MetaTrader 5
...   
# получим валюту счета для информации
account_currency=mt5.account_info().currency
print("Account сurrency:", account_currency)
   
# получим необходимые свойства символа сделки
symbol = "USDJPY"
symbol_info = mt5.symbol_info(symbol)
if symbol_info is None:
   print(symbol, "not found, can not call order_check()")
   mt5.shutdown()
   quit()
   
point = mt5.symbol_info(symbol).point
# если символ недоступен в Обзоре рынка, добавим его
if not symbol_info.visible:
   print(symbol, "is not visible, trying to switch on")
   if not mt5.symbol_select(symbol, True):
      print("symbol_select({}) failed, exit", symbol)
      mt5.shutdown()
      quit()
   
# подготовим структуру запроса как словарь
request = \
{
   "action": mt5.TRADE_ACTION_DEAL,
   "symbol": symbol,
   "volume"1.0,
   "type": mt5.ORDER_TYPE_BUY,
   "price": mt5.symbol_info_tick(symbol).ask,
   "sl": mt5.symbol_info_tick(symbol).ask - 100 * point,
   "tp": mt5.symbol_info_tick(symbol).ask + 100 * point,
   "deviation"10,
   "magic"234000,
   "comment""python script",
   "type_time": mt5.ORDER_TIME_GTC,
   "type_filling": mt5.ORDER_FILLING_RETURN,
}
   
# выполним проверку и выведем результат как есть 
result = mt5.order_check(request)
print(result)                       # [?этого в логе хелпа нет?]
   
# преобразуем результат в словарь и выведем поэлементно
result_dict = result._asdict()
for field in result_dict.keys():
   print("   {}={}".format(field, result_dict[field]))
   # если это структура торгового запроса, то выведем её тоже поэлементно
   if field == "request":
      traderequest_dict = result_dict[field]._asdict()
      for tradereq_filed in traderequest_dict:
         print("       traderequest: {}={}".format(tradereq_filed,
         traderequest_dict[tradereq_filed]))
   
# завершим подключение к терминалу
mt5.shutdown()

Результат:

Account сurrency: USD

OrderCheckResult(retcode=0, balance=10000.17, equity=10000.17, profit=0.0, margin=1000.0,...

   retcode=0

   balance=10000.17

   equity=10000.17

   profit=0.0

   margin=1000.0

   margin_free=9000.17

   margin_level=1000.017

   comment=Done

   request=TradeRequest(action=1, magic=234000, order=0, symbol='USDJPY', volume=1.0, price=144.128,...

       traderequest: action=1

       traderequest: magic=234000

       traderequest: order=0

       traderequest: symbol=USDJPY

       traderequest: volume=1.0

       traderequest: price=144.128

       traderequest: stoplimit=0.0

       traderequest: sl=144.028

       traderequest: tp=144.228

       traderequest: deviation=10

       traderequest: type=0

       traderequest: type_filling=2

       traderequest: type_time=0

       traderequest: expiration=0

       traderequest: comment=python script

       traderequest: position=0

       traderequest: position_by=0

OrderSendResult order_send(request)

Функция order_send отправляет из терминала на торговый сервер запрос на совершение торговой операции.

Результат функции возвращается в виде структуры OrderSendResult. Она повторяет структуру MqlTradeResult, но дополнительно содержит поле request с копией исходного запроса.

Функция является аналогом OrderSend.

Пример (MQL5/Scripts/MQL5Book/python/ordersend.py):

import time 
import MetaTrader5 as mt5 
   
# установим подключение к терминалу MetaTrader 5
...   
# назначим свойства рабочего символа
symbol = "USDJPY"
symbol_info = mt5.symbol_info(symbol)
if symbol_info is None:
   print(symbol, "not found, can not trade")
   mt5.shutdown()
   quit()
   
# если символ недоступен в Обзоре рынка, добавим его
if not symbol_info.visible:
   print(symbol, "is not visible, trying to switch on")
   if not mt5.symbol_select(symbol, True):
      print("symbol_select({}) failed, exit", 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, 
}
   
# отправим торговый запрос на открытие позиции
result = mt5.order_send(request)
# проверим результат выполнения 
print("1. order_send(): by {} {} lots at {}".format(symbol, lot, price));
if result.retcode != mt5.TRADE_RETCODE_DONE:
   print("2. order_send failed, retcode={}".format(result.retcode))
   # запросим результат в виде словаря и выведем поэлементно 
   result_dict = result._asdict()
   for field in result_dict.keys():
      print("   {}={}".format(field, result_dict[field]))
      # если это структура торгового запроса, то выведем её тоже поэлементно 
      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() and quit")
   mt5.shutdown()
   quit()
   
print("2. order_send done, ", result)
print("   opened position with POSITION_TICKET={}".format(result.order))
print("   sleep 2 seconds before closing position #{}".format(result.order))
time.sleep(2)
# создадим запрос на закрытие
position_id = result.order
price = mt5.symbol_info_tick(symbol).bid
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, 

# отправим торговый запрос на закрытие позиции
result = mt5.order_send(request)
# проверим результат выполнения 
print("3. close position #{}: sell {} {} lots at {}".format(position_id,
symbol, lot, price));
if result.retcode != mt5.TRADE_RETCODE_DONE:
   print("4. order_send failed, retcode={}".format(result.retcode))
   print("   result", result)
else
   print("4. position #{} closed, {}".format(position_id, result))
   # запросим результат в виде словаря и выведем поэлементно
   result_dict = result._asdict()
   for field in result_dict.keys():
      print("   {}={}".format(field, result_dict[field])) 
      # если это структура торгового запроса, то выведем её тоже поэлементно 
      if field == "request"
         traderequest_dict = result_dict[field]._asdict()
         for tradereq_filed in traderequest_dict:
            print("       traderequest: {}={}".format(tradereq_filed,
            traderequest_dict[tradereq_filed]))
   
# завершим подключение к терминалу
mt5.shutdown()

Результат:

1. order_send(): by USDJPY 0.1 lots at 144.132

2. order_send done,  OrderSendResult(retcode=10009, deal=1445796125, order=1468026008, volume=0.1, price=144.132,...

   opened position with POSITION_TICKET=1468026008

   sleep 2 seconds before closing position #1468026008

3. close position #1468026008: sell USDJPY 0.1 lots at 144.124

4. position #1468026008 closed, OrderSendResult(retcode=10009, deal=1445796155, order=1468026041, volume=0.1, price=144.124,...

   retcode=10009

   deal=1445796155

   order=1468026041

   volume=0.1

   price=144.124

   bid=144.124

   ask=144.132

   comment=Request executed

   request_id=2

   retcode_external=0

   request=TradeRequest(action=1, magic=234000, order=0, symbol='USDJPY', volume=0.1, price=144.124, stoplimit=0.0,...

       traderequest: action=1

       traderequest: magic=234000

       traderequest: order=0

       traderequest: symbol=USDJPY

       traderequest: volume=0.1

       traderequest: price=144.124

       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=1468026008

       traderequest: position_by=0