order_send

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

order_send(
   request      // структура запроса
   );

Параметры

request

[in]  Структура типа MqlTradeRequest, которая описывает требуемое торговое действие. Обязательный неименованный параметр. Пример заполнения запроса и состав перечислений смотрите ниже.

Возвращаемое значение

Результат выполнения в виде структуры MqlTradeResult. Поле request в ответе содержит структуру торгового запроса, переданного в order_send().В случае ошибки возвращает None, информацию об ошибке можно получить с помощью last_error().

Структура торгового запроса MqlTradeRequest

Поле

Описание

action

Тип торговой операции. Значение может быть одним из значений перечисления TRADE_REQUEST_ACTIONS

magic

Идентификатор эксперта. Позволяет организовать аналитическую обработку торговых ордеров. Каждый эксперт может выставлять свой собственный уникальный идентификатор при отправке торгового запроса

order

Тикет ордера. Требуется для модификации отложенных ордеров

symbol

Имя торгового инструмента, по которому выставляется ордер. Не требуется при операциях модификации ордеров и закрытии позиций

volume

Запрашиваемый объем сделки в лотах. Реальное значение объема при открытии сделки будет зависеть от типа ордера по исполнению.

price

Цена, при достижении которой ордер должен быть исполнен. Для рыночных ордеров по инструментам с типом исполнения "Market Execution" (SYMBOL_TRADE_EXECUTION_MARKET), имеющих тип TRADE_ACTION_DEAL, указание цены не требуется

stoplimit

Цена, по которой будет выставлен отложенный Limit-ордер при достижении ценой значения price (это условие является обязательным). До этого момента отложенный ордер в торговую систему не выводится

sl

Цена, по которой сработает Stop Loss ордер при движении цены в неблагоприятном направлении

tp

Цена, по которой сработает Take Profit ордер при движении цены в благоприятном направлении

deviation

Максимально приемлемое отклонение от запрашиваемой цены, задаваемое в пунктах

type

Тип ордера. Значение может быть одним из значений перечисления ORDER_TYPE

type_filling

Тип ордера по исполнению. Значение может быть одним из значений ORDER_TYPE_FILLING

type_time

Тип ордера по истечению. Значение может быть одним из значений ORDER_TYPE_TIME

expiration

Срок истечения отложенного ордера (для ордеров типа TIME_SPECIFIED)

comment

Комментарий к ордеру

position

Тикет позиции. Следует заполнять при изменении и закрытии позиции для ее однозначной идентификации. Как правило, соответствует тикету ордера, в результате которого позиция была открыта.

position_by

Тикет встречной позиции. Используется при закрытии позиции встречной — открытой по тому же инструменту, но в противоположном направлении.

Примечание

Торговый запрос проходит несколько стадий проверок на торговом сервере. В первую очередь проверяется корректность заполнения всех необходимых полей запроса request, и при отсутствии ошибок сервер принимает ордер для дальнейшей обработки. Полную информацию по исполнению торговых операций смотрите в описании функции OrderSend.

Пример:

import time
import MetaTrader5 as mt5
 
# выведем данные о пакете MetaTrader5
print("MetaTrader5 package author: "mt5.__author__)
print("MetaTrader5 package version: "mt5.__version__)
 
# установим подключение к терминалу MetaTrader 5
if not mt5.initialize():
    print("initialize() failed, error code =",mt5.last_error())
    quit()
 
# подготовим структуру запроса для покупки
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()
 
# если символ недоступен в MarketWatch, добавим его
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 {} with deviation={} points".format(symbol,lot,price,deviation));
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
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,
}
# отправим торговый запрос
result=mt5.order_send(request)
# проверим результат выполнения
print("3. close position #{}: sell {} {} lots at {} with deviation={} points".format(position_id,symbol,lot,price,deviation));
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]))
 
# завершим подключение к терминалу MetaTrader 5
mt5.shutdown()
 
Результат
MetaTrader5 package author:  MetaQuotes Software Corp.
MetaTrader5 package version:  5.0.29
1. order_send(): by USDJPY 0.1 lots at 108.023 with deviation=20 points
2. order_send done,  OrderSendResult(retcode=10009, deal=535084512, order=557416535, volume=0.1, price=108.023, ...
   opened position with POSITION_TICKET=557416535
   sleep 2 seconds before closing position #557416535
3. close position #557416535: sell USDJPY 0.1 lots at 108.018 with deviation=20 points
4. position #557416535 closed, 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

Смотри также

order_check, OrderSend,Типы торговых операций, Структура торгового запроса, Структура результатов проверки торгового запроса, Структура результата торгового запроса