本篇的委托单的Contract会以股票做范例。期货跟选择权,下单方式跟股票相同,只要参考前一篇建立对应的Order内容即可。
若以虚拟环境及帐号,可正常建立委托单及其它操作,也可以看到成交资讯
但重新登入後,之前的trade都会被清除
api.place_order参数说明:
api.place_order(
contract: Contract,
order: Order,
timeout: int = 5000
)
在建立委托单之前,要先取得Contract物件及建立Order物件,完整范例如下:
from dotenv import load_dotenv
import os
import shioaji as sj
from shioaji.constant import Action, StockPriceType, TFTOrderType, TFTStockOrderLot #汇入下单常用常数
load_dotenv('D:\\python\\shioaji\\.env') #读取.env中的环境变数
api = sj.Shioaji()
api.login(
person_id=os.getenv('YOUR_PERSON_ID'),
passwd=os.getenv('YOUR_PASSWORD')
)
#启用电子凭证
result = api.activate_ca(
ca_path=os.getenv('YOUR_CA_PATH'),
ca_passwd=os.getenv('YOUR_CA_PASS'),
person_id=os.getenv('YOUR_PERSON_ID'),
)
contract = api.Contracts.Stocks['2890'] #取得Contract物件
order = api.Order( #建立order内容
price=13.8,
quantity=1,
action=Action.Buy,
price_type=StockPriceType.LMT,
order_type=TFTOrderType.ROD,
order_lot=TFTStockOrderLot.Common,
account=api.stock_account
)
trade = api.place_order(contract, order) #执行place_order并传入contract及order建立委托单
print(trade) #将委托单内容输出至console
若成功建立委托单,会回传Trade物件,输出至console後就会出现下列资讯:
contract=Stock(exchange=<Exchange.TSE: 'TSE'>, code='2890', symbol='TSE2890', name='永丰金', category='17', unit=1000, limit_up=15.2, limit_down=12.5, reference=13.85, update_date='2021/09/24', day_trade=<DayTrade.Yes: 'Yes'>)
order=Order(action=<Action.Buy: 'Buy'>, price=13.8, quantity=1, id='ca6171d5', seqno='092803', ordno='00000', account=Account(account_type=<AccountType.Stock: 'S'>, person_id='PAPIUSER06', broker_id='9A95', account_id='0506701', signed=True), price_type=<StockPriceType.LMT: 'LMT'>, order_type=<FuturesOrderType.ROD: 'ROD'>)
status=OrderStatus(id='ca6171d5', status=<Status.PendingSubmit: 'PendingSubmit'>, status_code='0', order_datetime=datetime.datetime(2021, 9, 26, 17, 54, 14), deals=[])
可以看到Trade物件的内容分为contract、order及status;contract及order的内容,就是刚才建立并传入的内容,status就是这张委托单的状态。
status有以下7种:
状态 | 说明 |
---|---|
PendingSubmit | 传送中 |
PreSubmitted | 预约单 |
Submitted | 传送成功 |
Failed | 传送失败 |
Cancelled | 已取消 |
Filled | 全部成交 |
Filling | 部分成交 |
委托单建立後,会看到status是PendingSubmit,请先执行一次api.update_status(api.stock_account)更新股票帐户的状态,若委托成功,就可以看到trade中的status已变为Submitted。
若要修改委托单内容,可使用api.update_order()进行修改
api.update_order(
trade: Trade, #传入原本的委托单
price: typing.Union[StrictInt, float] = None, #变更後的委托价格
qty: int = None, #qty指的是所要取消的委托数量
timeout: int = 5000
)
范例如下:
api.update_status(api.stock_account) #执行update_status更新股票帐户的状态
api.update_order(trade=trade, price=12, qty=2) #传入所要修改的委托单,将委托价格更改为12,且委托数量取消2
api.update_status(api.stock_account) #再次执行update_status更新股票帐户的状态
print(trade.status.status.value) #将委托单的状态值输出至console
若修改成功,trade.status.status.value中的值就会变成'Submitted',并且在status中,可以看到多了cancel_quantity取消数量及modified_price修改价格两个属性值。
若要取消委托单,可使用api.cancel_order()进行取消
api.cancel_order(
trade: shioaji.order.Trade,
timeout: int = 5000
)
范例如下:
api.update_status(api.stock_account) #执行update_status更新股票帐户的状态
api.cancel_order(trade) #传入所要取消的委托单
api.update_status(api.stock_account) #再次执行update_status更新股票帐户的状态
print(trade.status.status.value) #将委托单的状态值输出至console
若成功取消,trade.status.status.value中的值就会变成'Cancelled'
从Trade的status中,可以看此张委托单是否已成交,若委托单已成交,status中的值会是Filling部份成交或Filled全部成交,deal_quantity则为成交的数量,而deals中会显示成交的价格、数量和时间。
Trade(contract=Stock(exchange=<Exchange.TSE: 'TSE'>, code='2890', symbol='TSE2890', name='永丰金', category='17', unit=1000, limit_up=15.3, limit_down=12.6, reference=13.95, update_date='2021/09/27', day_trade=<DayTrade.Yes: 'Yes'>), order=Order(action=<Action.Buy: 'Buy'>, price=13.8, quantity=1, id='0ab3dd4a', seqno='092823', ordno='WA027', account=Account(account_type=<AccountType.Stock: 'S'>, person_id='PAPIUSER06', broker_id='9A95', account_id='0506701', signed=True), price_type=<StockPriceType.LMT: 'LMT'>, order_type=<FuturesOrderType.ROD: 'ROD'>), status=OrderStatus(id='0ab3dd4a', status=<Status.Filled: 'Filled'>, status_code='00', order_datetime=datetime.datetime(2021, 9, 27, 10, 56, 37), modified_price=14.0, deal_quantity=1, deals=[Deal(seq='000928', price=14.0, quantity=1, ts=1632712382)]))
重复使用程序码 Vaadin 自订 Component 各位发现了吗?在写完CRUD後,打开Crea...
Keyword: SQLDelight Mock Test 直到27日,完成KMM的测试功能放在 K...
拉钩上吊 一百年不许变 | 中括号[] | const下好离手 ...
前言 在现实生活中,常见的尺寸单位有公分(cm)、公尺(m)、奈米(nm), 而在网页画面中自己的尺...
前言 本文说明如何进行Scanners查询特定日期盘中或是盘後交易相关资料(当日涨(跌)幅排行、当日...