Day 14 - 委托单建立、修改及取消

本篇重点

  • 委托单建立
  • 委托单修改
  • 委托单取消

本篇的委托单的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)]))

<<:  Day15 CSS二

>>:  DAY17 - 第五个小范例 : 图片加浮水印

自订 Vaadin 组件 / Grid 扩充功能 -- day07

重复使用程序码 Vaadin 自订 Component 各位发现了吗?在写完CRUD後,打开Crea...

Day 27:DB也是假的 建立Mock SQLDelight

Keyword: SQLDelight Mock Test 直到27日,完成KMM的测试功能放在 K...

[从0到1] C#小乳牛 练成基础程序逻辑 Day 21 - Array 常数const

拉钩上吊 一百年不许变 | 中括号[] | const下好离手 ...

尺寸单位 px、em、rem

前言 在现实生活中,常见的尺寸单位有公分(cm)、公尺(m)、奈米(nm), 而在网页画面中自己的尺...

[第10天]理财达人Mx. Ada-Scanners作业

前言 本文说明如何进行Scanners查询特定日期盘中或是盘後交易相关资料(当日涨(跌)幅排行、当日...