order_send

Envía desde el terminal al servidor comercial una solicitud de ejecución de una operación comercial. La función es un análogo de OrderSend.

order_send(
   request      // estructura de la solicitud
   );

Parámetros

request

[in]  Estructura del tipo MqlTradeRequest que describe la acción comercial necesaria. Parámetro no nombrado obligatorio. Más abajo, podrá ver un ejemplo con el rellenado de una solicitud y la composición de una enumeración.

Valor retornado

El resultado de la ejecución se da en forma de estructura MqlTradeResult. El campo request en la respuesta contiene la estructura de la solicitud comercial transmitida a order_send().

Estructura de la solicitud comercial MqlTradeRequest

Campo

Descripción

action

Tipo de operación comercial. El valor puede ser uno de los valores de la enumeración TRADE_REQUEST_ACTIONS

magic

Identificador del experto. Permite organizar el procesamiento analítico de órdenes comerciales. Cada experto puede colocar su propio identificador único al enviar una solicitud comercial

order

Ticket de la orden. Es necesario para modificar las órdenes pendientes.

symbol

Nombre del instrumento comercial del que se coloca la orden. No es necesario en las operaciones de modificación de órdenes y el cierre de posiciones

volume

Volumen de la transacción solicitado en lotes. El valor real del volumen al darse la apertura dependerá del tipo de orden según la ejecución.

price

Precio al alcanzar el cual la orden debe ser ejecutada. Para las órdenes de mercado de instrumentos con el tipo de ejecución "Market Execution" (SYMBOL_TRADE_EXECUTION_MARKET) que tengan el tipo TRADE_ACTION_DEAL no se requerirá indicar el precio

stoplimit

Precio al que se colocará una orden límite pendiente cuando el precio alcance el valor price (esta condición es obligatoria). Hasta ese momento, la orden pendiente no se mostrará en el sistema comercial

sl

Precio al que se activa una orden Stop Loss cuando el precio se mueve en una dirección no rentable

tp

Precio al que se activa una orden Take Profit cuando el precio se mueve en una dirección rentable

deviation

Desviación máxima permitida respecto al precio solicitado, establecida en puntos

type

Tipo de orden. El valor puede ser uno de los valores de la enumeración ORDER_TYPE

type_filling

Tipo de orden según su ejecución. El valor puede ser uno de los valores ORDER_TYPE_FILLING

type_time

Tipo de orden según su expiración. El valor puede ser uno de los valores ORDER_TYPE_TIME

expiration

Plazo de expiración de la orden pendiente (para las órdenes del tipo TIME_SPECIFIED)

comment

Comentarios a la orden

position

Ticket de la posición. Se debe rellenar al cambiar y cerrar una posición, para posibilitar su identificación unívoca. Normalmente, se corresponde con el ticket de la orden que ha dado lugar a la apertura de la posición.

position_by

Ticket de la posición opuesta. Se usa al cerrar una posición mediante otra opuesta, abierta para el mismo instrumento, pero en dirección contraria.

Observación

La solicitud comercial pasar por varios estadios de comprobación en el servidor comercial. En primer lugar, se comprueba que los campos de la solicitud request se hayan rellenado correctamente, y si no hay errores, el servidor aceptará la orden para su posterior procesamiento. Podrá ver información detallada sobre la ejecución de operaciones comerciales en la descripción de la función OrderSend.

Ejemplo:

import time
import MetaTrader5 as mt5
 
# mostramos los datos sobre el paquete MetaTrader5
print("MetaTrader5 package author: "mt5.__author__)
print("MetaTrader5 package version: "mt5.__version__)
 
# establecemos la conexión con el terminal MetaTrader 5
if not mt5.initialize():
    print("initialize() failed, error code =",mt5.last_error())
    quit()
 
# preparamos la estructura de la solicitud de compra
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()
 
# si el símbolo no está disponible en MarketWatch, lo añadimos
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,
}
 
# enviamos la solicitud comercial
result = mt5.order_send(request)
# comprobamos el resultado de la ejecución
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))
   # solicitamos el resultado en forma de diccionario y lo mostramos elemento por elemento
    result_dict=result._asdict()
    for field in result_dict.keys():
        print("   {}={}".format(field,result_dict[field]))
        # si se trata de la estructura de una solicitud comercial, también la mostramos elemento por elemento
        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)
# creamos una solicitud de cierre
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,
}
# enviamos la solicitud comercial
result=mt5.order_send(request)
# comprobamos el resultado de la ejecución
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))
   # solicitamos el resultado en forma de diccionario y lo mostramos elemento por elemento
    result_dict=result._asdict()
    for field in result_dict.keys():
        print("   {}={}".format(field,result_dict[field]))
        # si se trata de la estructura de una solicitud comercial, también la mostramos elemento por elemento
        if field=="request":
            traderequest_dict=result_dict[field]._asdict()
            for tradereq_filed in traderequest_dict:
                print("       traderequest: {}={}".format(tradereq_filed,traderequest_dict[tradereq_filed]))
 
# finalizamos la conexión con el terminal MetaTrader 5
mt5.shutdown()
 
Resultado
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

Ver también

order_check, OrderSend,Tipos de operaciones comerciales, Estructura de la solicitud comercial, Estructura de los resultados de la comprobación de la solicitud comercial, Estructura del resultado de la solicitud comercial