订单的执行

自动驾驶汽车的人工智能需要控制实体车辆。为此,它向车辆发送不同类型的信号,比如 加速、刹车、左转或右转。交易机器人需要在交易平台上下订单。本节介绍了不同类型的 订单,比如市场订单和止损单。 最基本的订单类型是市场订单。该订单允许以当前市场价格(买入时的卖出价和卖出时的 买入价)购买或出售金融工具。下面的例子基于 20 倍杠杆的账户和相对较小的订单规模。 因此,流动性问题并没有产生影响。当通过 Oanda v20 API 执行订单时,该 API 返回了一 个详细的订单对象。首先,发出买入市场订单。 In [15]: order = api.create_order('EUR_USD', units=25000, suppress=True, ret=True) ➊ pprint(order) ➊ {'accountBalance': '98553.3172', 'accountID': '101-004-13834683-001', 'batchID': '1625', 'commission': '0.0', 'financing': '0.0', 'fullPrice': {'asks': [{'liquidity': '10000000', 'price': 1.18345}], 'bids': [{'liquidity': '10000000', 'price': 1.18331}], 'closeoutAsk': 1.18345, 'closeoutBid': 1.18331, 'type': 'PRICE'}, 'fullVWAP': 1.18345, 'gainQuoteHomeConversionFactor': '0.840811914585', 'guaranteedExecutionFee': '0.0', 'halfSpreadCost': '1.4788', 'id': '1626', 'instrument': 'EUR_USD', 'lossQuoteHomeConversionFactor': '0.849262285586', 'orderID': '1625', 'pl': '0.0', 'price': 1.18345, 'reason': 'MARKET_ORDER', 'requestID': '78757241547812154', 'time': '2020-08-13T12:07:19.434407966Z', 'tradeOpened': {'guaranteedExecutionFee': '0.0', 'halfSpreadCost': '1.4788', 'initialMarginRequired': '832.5', 'price': 1.18345, 'tradeID': '1626', 'units': '25000.0'}, 'type': 'ORDER_FILL', 'units': '25000.0', 'userID': 13834683} In [16]: def print_details(order): ➋ details = (order['time'][:-7], order['instrument'], order['units'], order['price'], order['pl']) return details 290 | 第 12 章 In [17]: print_details(order) ➋ Out[17]: ('2020-08-13T12:07:19.434', 'EUR_USD', '25000.0', 1.18345, '0.0') In [18]: time.sleep(1) ➊ 发出买入市场订单并打印订单对象详细信息。 ➋ 选择并显示订单的 time、instrument、units、price 和 pl 明细。 然后,该头寸通过相同规模的卖出市场订单平仓。鉴于第一笔交易的损益(P&L)在计入 交易成本之前为零,第二笔交易的损益一般为非零。 In [19]: order = api.create_order('EUR_USD', units=-25000, suppress=True, ret=True) ➊ pprint(order) ➊ {'accountBalance': '98549.283', 'accountID': '101-004-13834683-001', 'batchID': '1627', 'commission': '0.0', 'financing': '0.0', 'fullPrice': {'asks': [{'liquidity': '9975000', 'price': 1.18339}], 'bids': [{'liquidity': '10000000', 'price': 1.18326}], 'closeoutAsk': 1.18339, 'closeoutBid': 1.18326, 'type': 'PRICE'}, 'fullVWAP': 1.18326, 'gainQuoteHomeConversionFactor': '0.840850994445', 'guaranteedExecutionFee': '0.0', 'halfSpreadCost': '1.3732', 'id': '1628', 'instrument': 'EUR_USD', 'lossQuoteHomeConversionFactor': '0.849301758209', 'orderID': '1627', 'pl': '-4.0342', 'price': 1.18326, 'reason': 'MARKET_ORDER', 'requestID': '78757241552009237', 'time': '2020-08-13T12:07:20.586564454Z', 'tradesClosed': [{'financing': '0.0', 'guaranteedExecutionFee': '0.0', 'halfSpreadCost': '1.3732', 'price': 1.18326, 'realizedPL': '-4.0342', 'tradeID': '1626', 'units': '-25000.0'}], 'type': 'ORDER_FILL', 'units': '-25000.0', 'userID': 13834683} In [20]: print_details(order) ➋ Out[20]: ('2020-08-13T12:07:20.586', 'EUR_USD', '-25000.0', 1.18326, '-4.0342') In [21]: time.sleep(1) ➊ 发出卖出市场订单并打印订单对象详细信息。 图灵社区会员 cxc_3612(17665373813) 专享 尊重版权执行与部署 | 291 ➋ 选择并显示订单的 time、instrument、units、price 和 pl 明细。 限价订单 本章仅将市场订单作为基础订单的一种类型。在市场订单中,购买或出售金 融工具的价格是在订单发出时的当前价格。相比之下,限价订单作为基础订 单的另一种主要类型,允许以最低价格或最高价格下订单。只有达到最低 / 最高价格时,订单才会执行。在此之前,没有任何交易发生。 接下来,考虑一个相同交易组合的例子,但这次使用止损单。止损单被作为单独的(限 制)订单来处理。下面的 Python 代码设置了订单并显示了止损单对象的详细信息。 In [22]: order = api.create_order('EUR_USD', units=25000, sl_distance=0.005, ➊ suppress=True, ret=True) In [23]: print_details(order) Out[23]: ('2020-08-13T12:07:21.740', 'EUR_USD', '25000.0', 1.18343, '0.0') In [24]: sl_order = api.get_transaction(tid=int(order['id']) + 1) ➋ In [25]: sl_order ➋ Out[25]: {'id': '1631', 'time': '2020-08-13T12:07:21.740825489Z', 'userID': 13834683, 'accountID': '101-004-13834683-001', 'batchID': '1629', 'requestID': '78757241556206373', 'type': 'STOP_LOSS_ORDER', 'tradeID': '1630', 'price': 1.17843, 'distance': '0.005', 'timeInForce': 'GTC', 'triggerCondition': 'DEFAULT', 'reason': 'ON_FILL'} In [26]: (sl_order['time'], sl_order['type'], order['price'], sl_order['price'], sl_order['distance']) ➌ Out[26]: ('2020-08-13T12:07:21.740825489Z', 'STOP_LOSS_ORDER', 1.18343, 1.17843, '0.005') In [27]: time.sleep(1) In [28]: order = api.create_order('EUR_USD', units=-25000, suppress=True, ret=True) In [29]: print_details(order) Out[29]: ('2020-08-13T12:07:23.059', 'EUR_USD', '-25000.0', 1.18329, '-2.9725') ➊ 止损距离以货币单位定义。292 | 第 12 章 ➋ 选择并显示止损单对象数据。 ➌ 选择并显示两个订单对象的一些相关细节。 跟踪止损单以同样的方式处理。唯一的区别是跟踪止损单没有固定的价格。 In [30]: order = api.create_order('EUR_USD', units=25000, tsl_distance=0.005, ➊ suppress=True, ret=True) In [31]: print_details(order) Out[31]: ('2020-08-13T12:07:23.204', 'EUR_USD', '25000.0', 1.18341, '0.0') In [32]: tsl_order = api.get_transaction(tid=int(order['id']) + 1) ➋ In [33]: tsl_order ➋ Out[33]: {'id': '1637', 'time': '2020-08-13T12:07:23.204457044Z', 'userID': 13834683, 'accountID': '101-004-13834683-001', 'batchID': '1635', 'requestID': '78757241564598562', 'type': 'TRAILING_STOP_LOSS_ORDER', 'tradeID': '1636', 'distance': '0.005', 'timeInForce': 'GTC', 'triggerCondition': 'DEFAULT', 'reason': 'ON_FILL'} In [34]: (tsl_order['time'][:-7], tsl_order['type'], order['price'], tsl_order['distance']) ➌ Out[34]: ('2020-08-13T12:07:23.204', 'TRAILING_STOP_LOSS_ORDER', 1.18341, '0.005') In [35]: time.sleep(1) In [36]: order = api.create_order('EUR_USD', units=-25000, suppress=True, ret=True) In [37]: print_details(order) Out[37]: ('2020-08-13T12:07:24.551', 'EUR_USD', '-25000.0', 1.1833, '-2.3355') In [38]: time.sleep(1) ➊ 跟踪止损距离以货币单位定义。 ➋ 选择并显示跟踪止损单对象数据。 ➌ 选择并显示两个订单对象的一些相关细节。 最后,这是一个止盈单。这个订单需要一个固定的止盈目标价格。因此,下面的代码使用 前一个订单中的执行价格来相对定义止盈价格。除了这个小小的差别之外,处理方式和以 前一样。 In [39]: tp_price = round(order['price'] + 0.01, 4) tp_price Out[39]: 1.1933 执行与部署 | 293 In [40]: order = api.create_order('EUR_USD', units=25000, tp_price=tp_price, ➊ suppress=True, ret=True) In [41]: print_details(order) Out[41]: ('2020-08-13T12:07:25.712', 'EUR_USD', '25000.0', 1.18344, '0.0') In [42]: tp_order = api.get_transaction(tid=int(order['id']) + 1) ➋ In [43]: tp_order ➋ Out[43]: {'id': '1643', 'time': '2020-08-13T12:07:25.712531725Z', 'userID': 13834683, 'accountID': '101-004-13834683-001', 'batchID': '1641', 'requestID': '78757241572993078', 'type': 'TAKE_PROFIT_ORDER', 'tradeID': '1642', 'price': 1.1933, 'timeInForce': 'GTC', 'triggerCondition': 'DEFAULT', 'reason': 'ON_FILL'} In [44]: (tp_order['time'][:-7], tp_order['type'], order['price'], tp_order['price']) ➌ Out[44]: ('2020-08-13T12:07:25.712', 'TAKE_PROFIT_ORDER', 1.18344, 1.1933) In [45]: time.sleep(1) In [46]: order = api.create_order('EUR_USD', units=-25000, suppress=True, ret=True) In [47]: print_details(order) Out[47]: ('2020-08-13T12:07:27.020', 'EUR_USD', '-25000.0', 1.18332, '-2.5478') ➊ 止盈目标价格是相对于之前的执行价格定义的。 ➋ 选择并显示止盈单对象数据。 ➌ 选择并显示两个订单对象的一些相关细节。 到目前为止,代码只处理了单个订单的交易细节。然而,对多笔历史交易进行说明也是 很有意义的。为此,下面的方法调用提供了本节中所有主要订单的概览数据,包括损益 数据。 In [48]: api.print_transactions(tid=int(order['id']) - 22) 1626 | 2020-08-13T12:07:19.434407966Z | EUR_USD | 25000.0 | 0.0 1628 | 2020-08-13T12:07:20.586564454Z | EUR_USD | -25000.0 | -4.0342 1630 | 2020-08-13T12:07:21.740825489Z | EUR_USD | 25000.0 | 0.0 1633 | 2020-08-13T12:07:23.059178023Z | EUR_USD | -25000.0 | -2.9725 1636 | 2020-08-13T12:07:23.204457044Z | EUR_USD | 25000.0 | 0.0 1639 | 2020-08-13T12:07:24.551026466Z | EUR_USD | -25000.0 | -2.3355 1642 | 2020-08-13T12:07:25.712531725Z | EUR_USD | 25000.0 | 0.0 1645 | 2020-08-13T12:07:27.020414342Z | EUR_USD | -25000.0 | -2.5478 图灵社区会员 cxc_3612(17665373813) 专享 尊重版权294 | 第 12 章 这里调用了另外一个函数来打印账户明细快照。这个账户为用于技术测试的 Oanda 演示 账户。 In [49]: api.get_account_summary() Out[49]: {'id': '101-004-13834683-001', 'alias': 'Primary', 'currency': 'EUR', 'balance': '98541.4272', 'createdByUserID': 13834683, 'createdTime': '2020-03-19T06:08:14.363139403Z', 'guaranteedStopLossOrderMode': 'DISABLED', 'pl': '-1248.5543', 'resettablePL': '-1248.5543', 'resettablePLTime': '0', 'financing': '-210.0185', 'commission': '0.0', 'guaranteedExecutionFees': '0.0', 'marginRate': '0.0333', 'openTradeCount': 1, 'openPositionCount': 1, 'pendingOrderCount': 0, 'hedgingEnabled': False, 'unrealizedPL': '941.9536', 'NAV': '99483.3808', 'marginUsed': '380.83', 'marginAvailable': '99107.2283', 'positionValue': '3808.3', 'marginCloseoutUnrealizedPL': '947.9546', 'marginCloseoutNAV': '99489.3818', 'marginCloseoutMarginUsed': '380.83', 'marginCloseoutPercent': '0.00191', 'marginCloseoutPositionValue': '3808.3', 'withdrawalLimit': '98541.4272', 'marginCallMarginUsed': '380.83', 'marginCallPercent': '0.00383', 'lastTransactionID': '1646'} 这就结束了对使用 Oanda 执行订单的基本知识的讨论。现在将所有元素整合在一起就能支 持交易机器人的部署了。本章余下内容将在 Oanda 数据上训练一款交易机器人,并以自动 化的方式部署它。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值