Python 算法交易秘籍(一)(4)https://developer.aliyun.com/article/1523093
放置一个简单的 DELIVERY 订单
此示例演示了如何通过经纪人在交易所下达 DELIVERY
订单。DELIVERY
订单将传递到用户的 Demat 账户,并存在直到用户明确平仓为止。在交易会话结束时由交货订单创建的仓位将转移到下一个交易会话。它们不会由经纪人明确平仓。尝试完这个示例后,通过登录经纪人的网站检查你的经纪账户;你会发现已经有一个订单被下达了。你可以将订单 ID 与此示例中最后显示的代码片段返回的订单 ID 进行匹配。
准备工作
确保在你的 Python 命名空间中可用 broker_connection
对象。请参考本章第一个示例来学习如何设置此对象。
操作方法…
我们执行以下步骤来完成此示例:
- 导入必要的模块:
>>> from pyalgotrading.constants import *
- 获取特定交易符号和交易所的金融工具:
>>> instrument = broker_connection.get_instrument(segment='NSE', tradingsymbol='AXISBANK')
- 下达一个简单的
DELIVERY
订单 - 一个SELL
、REGULAR
、DELIVERY
、MARKET
订单:
>>> order_id = broker_connection.place_order( instrument=instrument, order_transaction_type= \ BrokerOrderTransactionTypeConstants.SELL, order_type=BrokerOrderTypeConstants.REGULAR, order_code=BrokerOrderCodeConstants.DELIVERY, order_variety= \ BrokerOrderVarietyConstants.MARKET, quantity=1) >>> order_id
我们将得到以下输出:
191212001268956
工作原理…
在 第 1 步 中,你从 pyalgotrading
导入常量。在 第 2 步 中,你使用 broker_connection
的 get_instrument()
方法,通过 segment = 'NSE'
和 tradingsymbol = 'AXISBANK'
获取金融工具。在 第 3 步 中,你使用 broker_connection
的 place_order()
方法下达 DELIVERY
订单。此方法接受以下参数:
instrument
:必须下订单的金融工具。应该是Instrument
类的实例。你在这里传递instrument
。order_transaction_type
:订单交易类型。应该是BrokerOrderTransactionTypeConstants
类型的枚举。你在这里传递BrokerOrderTransactionTypeConstants.SELL
。order_type
:订单类型。应该是BrokerOrderTypeConstants
类型的枚举。你在这里传递BrokerOrderTypeConstants.REGULAR
。order_code
:订单代码。应该是BrokerOrderCodeConstants
类型的枚举。你在这里传递BrokerOrderCodeConstants.DELIVERY
。order_variety
:订单类型。应该是BrokerOrderVarietyConstants
类型的枚举。你在这里传递BrokerOrderVarietyConstants.MARKET
。quantity:
要为给定金融工具交易的股票数量。应该是正整数。我们在这里传递1
。
如果订单下达成功,该方法会返回一个订单 ID,你随时可以使用它查询订单的状态。
关于不同类型参数的详细解释将在 第六章 在交易所上下达交易订单 中介绍。此示例旨在让你了解如何下达 DELIVERY
订单,这是各种可能订单中的一种。
下达一个简单的 INTRADAY 订单
此配方演示如何通过经纪人 API 下达 INTRADAY
订单。INTRADAY
订单不会传送到用户的 Demat 账户。由日内订单创建的头寸具有一天的生命周期。这些头寸在交易会话结束时由经纪人明确平仓,并不转入下一个交易会话。尝试完此配方后,通过登录经纪人网站查看您的经纪账户;您会发现已经有了一个订单。您可以将订单 ID 与此配方中显示的最后一个代码片段返回的订单 ID 进行匹配。
准备工作
确保 broker_connection
对象在您的 Python 命名空间中可用。请参考本章的第一个配方,了解如何设置此对象。
如何操作…
我们执行以下步骤来完成此配方:
- 导入必要的模块:
>>> from pyalgotrading.constants import *
- 获取特定交易符号和交易所的工具:
>>> instrument = broker_connection.get_instrument(segment='NSE', tradingsymbol='HDFCBANK')
- 获取工具的最近成交价:
>>> ltp = broker_connection.get_ltp(instrument)
- 下达一个简单的
INTRADAY
订单 —— 一个SELL
,BRACKET
,INTRADAY
,LIMIT
订单:
>>> order_id = broker_connection.place_order( instrument=instrument, order_transaction_type= \ BrokerOrderTransactionTypeConstants.SELL, order_type=BrokerOrderTypeConstants.BRACKET, order_code=BrokerOrderCodeConstants.INTRADAY, order_variety=BrokerOrderVarietyConstants.LIMIT, quantity=1, price=ltp+1, stoploss=2, target=2) >>> order_id
我们将获得以下输出:
191212001269042
如果在执行此代码时出现以下错误,则意味着经纪人由于市场波动性较高而阻止了 Bracket 订单:
InputException: 由于市场预期波动率较高,Bracket 订单暂时被阻止。
当经纪人开始允许 Bracket 订单时,您应该稍后尝试此配方。您可以不时地在经纪人网站上查看更新,了解何时允许 Bracket 订单。
工作原理…
在 步骤 1 中,您从 pyalgotrading
导入常量。在 步骤 2 中,您使用 broker_connection
的 get_instrument()
方法通过 segment = 'NSE'
和 tradingsymbol = 'HDFCBANK'
获取金融工具。在 步骤 3 中,您获取该工具的 LTP。(LTP 将在 第三章 的 金融工具的最近成交价 配方中详细解释。)在 步骤 4 中,您使用 broker_connection
的 place_order()
方法下达 BRACKET
订单。place_order()
方法接受的参数描述如下:
instrument
:必须下达订单的金融工具。应为Instrument
类的实例。在这里传递instrument
。order_transaction_type
:订单交易类型。应为BrokerOrderTransactionTypeConstants
类型的枚举。在这里传递BrokerOrderTransactionTypeConstants.SELL
。order_type
:订单类型。应为BrokerOrderTypeConstants
类型的枚举。在这里传递BrokerOrderTypeConstants.BRACKET
。order_code
:订单代码。应为BrokerOrderCodeConstants
类型的枚举。在这里传递BrokerOrderCodeConstants.INTRADAY
。order_variety
:订单种类。应为BrokerOrderVarietyConstants
类型的枚举。在这里传递BrokerOrderVarietyConstants.LIMIT
。quantity
:给定工具要交易的股票数量。应该是正整数。这里你传递了1
。price
:应该下订单的限价。这里你传递了ltp+1
,表示高于ltp
值的 1 个单位价格。stoploss
:与初始订单价格的价格差,应在该价格处放置止损订单。应该是正整数或浮点数值。这里你传递了2
。target
:与初始订单价格的价格差,应在该价格处放置目标订单。应该是正整数或浮点数值。这里你传递了2
。
如果下单成功,该方法将返回一个订单 ID,您随时可以在以后的任何时间使用它来查询订单的状态。
不同类型参数的详细解释将在第六章,在交易所下订单 中介绍。本示例旨在让您了解如何下达 INTRADAY
订单,这是各种可能订单类型之一。
查询保证金和资金
在下单之前,重要的是要确保您的经纪账户中有足够的保证金和资金可用以成功下单。资金不足会导致经纪拒绝任何下单,这意味着其他人将永远不会在交易所下单。本示例向您展示了如何随时查找您的经纪账户中可用的保证金和资金。
准备就绪
确保 broker_connection
对象在您的 Python 命名空间中可用。请参考本章的第一个示例来学习如何设置它。
如何操作…
我们执行以下步骤完成此示例:
- 显示股票保证金:
>>> equity_margins = broker_connection.get_margins('equity') >>> equity_margins
我们将得到以下输出(您的输出可能有所不同):
{'enabled': True, 'net': 1623.67, 'available': {'adhoc_margin': 0, 'cash': 1623.67, 'opening_balance': 1623.67, 'live_balance': 1623.67, 'collateral': 0, 'intraday_payin': 0}, 'utilised': {'debits': 0, 'exposure': 0, 'm2m_realised': 0, 'm2m_unrealised': 0, 'option_premium': 0, 'payout': 0, 'span': 0, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 0}}
- 显示股票资金:
>>> equity_funds = broker_connection.get_funds('equity') >>> equity_funds
我们将得到以下输出(您的输出可能有所不同):
1623.67
- 显示商品保证金:
>>> commodity_margins = get_margins(commodity') >>> commodity_margins
我们将得到以下输出(您的输出可能有所不同):
{'enabled': True, 'net': 16215.26, 'available': {'adhoc_margin': 0, 'cash': 16215.26, 'opening_balance': 16215.26, 'live_balance': 16215.26, 'collateral': 0, 'intraday_payin': 0}, 'utilised': {'debits': 0, 'exposure': 0, 'm2m_realised': 0, 'm2m_unrealised': 0, 'option_premium': 0, 'payout': 0, 'span': 0, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 0}}
- 显示商品资金:
>>> commodity_funds = broker_connection.get_funds('commodity') >>> commodity_funds
我们将得到以下输出(您的输出可能有所不同):
0
工作原理…
broker_connection
对象提供了用于获取经纪账户可用保证金和资金的方法:
get_margins()
get_funds()
经纪公司 Zerodha 分别跟踪 equity
和 commodity
产品的保证金和资金。如果您使用的是 pyalgotrading
支持的其他经纪公司,则可能会将资金和保证金分别跟踪 equity
和 commodity
。
步骤 1 展示了如何使用broker_connection
对象的get_margins()
方法查询equity
产品的保证金,参数为equity
。步骤 2 展示了如何使用broker_connection
对象的get_funds()
方法查询equity
产品的资金,参数为equity
字符串。
步骤 3 和 4 展示了如何查询以commodity
字符串为参数的commodity
产品的保证金和资金情况。
计算收取的佣金
每次成功完成的订单,经纪人可能会收取一定的费用,这通常是买卖工具价格的一小部分。虽然金额看似不大,但重要的是要跟踪佣金,因为它最终可能会吃掉你一天结束时的可观利润的一大部分。
收取的佣金因经纪人而异,也因交易段而异。针对这个方案,我们将考虑佣金为 0.01%。
如何做…
我们执行以下步骤完成这个方案:
- 计算每笔交易收取的佣金:
>>> entry_price = 1245 >>> brokerage = (0.01 * 1245)/100 >>> print(f'Brokerage charged per trade: {brokerage:.4f}')
我们将获得以下输出:
Brokerage charged per trade: 0.1245
- 计算 10 笔交易的总佣金:
>>> total_brokerage = 10 * (0.01 * 1245) / 100 >>> print(f'Total Brokerage charged for 10 trades: \ {total_brokerage:.4f}')
我们将获得以下输出:
Total Brokerage charged for 10 trades: 1.2450
工作原理…
在 第 1 步 中,我们从交易买入或卖出的价格entry_price
开始。对于这个方案,我们使用了1245
。接下来,我们计算价格的 0.01%,即0.1245
。然后,我们计算 10 笔这样的交易的总佣金,结果为10 * 0.1245 = 1.245
。
每个订单,佣金都会收取两次。第一次是当订单进入持仓时,而第二次是当订单退出持仓时。要获取所收取的佣金的确切细节,请参考您的经纪人提供的费用清单。
计算收取的政府税费
对于每个成功完成的订单,政府可能会收取一定的费用,这是买卖工具价格的一小部分。虽然金额看似不大,但重要的是要跟踪政府税费,因为它最终可能会吃掉你一天结束时的可观利润的一大部分。
政府的收费取决于交易所的位置,并且从一个交易段到另一个交易段都有所不同。针对这个方案,我们将考虑政府税费的费率为 0.1%。
如何做…
我们执行以下步骤完成这个方案:
- 计算每笔交易收取的政府税费:
>>> entry_price = 1245 >>> brokerage = (0.1 * 1245)/100 >>> print(f'Government taxes charged per trade: {brokerage:.4f}')
我们将获得以下输出:
Government taxes charged per trade: 1.2450
- 计算 10 笔交易收取的总政府税费:
>>> total_brokerage = 10 * (0.1 * 1245) / 100 >>> print(f'Total Government taxes charged for 10 trades: \ {total_brokerage:.4f}')
我们将获得以下输出:
Total Government taxes charged for 10 trades: 12.4500
工作原理…
在 第 1 步 中,我们从交易买入或卖出的价格entry_price
开始。对于这个方案,我们使用了1245
。接下来,我们计算价格的 0.1%,即1.245
。然后,我们计算 10 笔这样的交易的总佣金,结果为10 * 1.245 = 12.245
。
对于每个订单,政府税费会收取两次。第一次是当订单进入持仓时,而第二次是当订单退出持仓时。要获取所收取的政府税费的确切细节,请参考交易所提供的政府税费清单。