我們已經熟悉了廚房環境(開發環境)、各式各樣的廚具(API),以及可以料理的食譜(商品與策略),現在就要把我們的菜餚上桌(下單)囉~在這之前,先看看上菜的路徑。
參考網站:Future and Option
本日程式碼使用:d29_order.py
需要兩個物件,一個是必要的商品檔,也就是要購買的商品標的,另一個是要購買的資訊。前者的話,就以期貨來說,就是api.Contracts.Futures.TXF.TXF202110
這樣,也就是我們在訂閱或是看snapshot的contract。而購買資訊則是新的東西,他會長成這樣:
order = t.api.Order(
action=sj.constant.Action.Buy,
price=15000,
quantity=2,
price_type=sj.constant.StockPriceType.LMT,
order_type=sj.constant.FuturesOrderType.ROD,
octype=sj.constant.FuturesOCType.Auto,
account=t.api.futopt_account,
)
一般來說,參數都不需要動,我們只要修改價格(price
)與數量(quantity
),而其他欄位的意義為:
Buy
和Sell
LMT
(限價)、MKT
(市價)、MKP
(範圍市價)ROD
、IOC
、FOK
Auto
(自動)、NewPosition
(新倉)、Cover
(平倉)、 DayTrade
(當沖)接著是下單的功能:api.place_order(contract, order)
,裡面的參數為商品檔,以及訂單價格數量與其他內容。執行後會顯示這樣:
Trade(contract=Future(code='TXFJ1', symbol='TXF202110', name='臺股期貨10', category='TXF', delivery_month='202110', underlying_kind='I', unit=1, limit_up=18060.0, limit_down=14778.0, reference=16419.0, update_date='2021/10/13'), order=Order(action=<Action.Buy: 'Buy'>, price=10, quantity=2, id='203635d6', seqno='980239', ordno='kY00t', account=Account(account_type=<AccountType.Future: 'F'>, person_id='PAPIUSER07', broker_id='F002000', account_id='1107458', signed=True), price_type=<StockPriceType.LMT: 'LMT'>, order_type=<FuturesOrderType.ROD: 'ROD'>), status=OrderStatus(id='203635d6', status=<Status.PendingSubmit: 'PendingSubmit'>, status_code=' ', order_datetime=datetime.datetime(2021, 10, 13, 23, 6, 38), deals=[]))
說明這個商品的資訊,已就下單的內容,其中status
是結果,我們的結果是status=<Status.PendingSubmit: 'PendingSubmit'>
,還在PendingSubmit: 傳送中
,
各種狀態為:
這樣就下單出去囉~
繼續延用之前的trader
class,這邊直接呼叫.api
來執行下單作業。
t = trader()
t.login()
# 選擇權下單
contract = t.api.Contracts.Options.TXO.TXO202110016300C
order = t.api.Order(
action=sj.constant.Action.Buy,
price=10,
quantity=2,
price_type=sj.constant.StockPriceType.LMT,
order_type=sj.constant.FuturesOrderType.ROD,
octype=sj.constant.FuturesOCType.Auto,
account=t.api.futopt_account,
)
trade = t.api.place_order(contract, order)
trade
其中的order
物件不需要調整,直接沿用期貨的部分,只是price
和quantity
可以做調整,如果要當賣方action
也要變動。最後直接呼叫place_order()
。
就可以看到選擇權的call下單內容:
OrderState.FOrder {'operation': {'op_type': 'New', 'op_code': '00', 'op_msg': ''}, 'order': {'id': 'f9ebac69', 'seqno': '980238', 'ordno': 'kY00s', 'account': {'account_type': 'F', 'person_id': '', 'broker_id': 'F002000', 'account_id': '1107458', 'signed': True}, 'action': 'Buy', 'price': 10.0, 'quantity': 2, 'order_type': 'ROD', 'market_type': 'Night', 'oc_type': 'New', 'subaccount': ''}, 'status': {'id': 'f9ebac69', 'exchange_ts': 1634137593, 'modified_price': 0.0, 'cancel_quantity': 0, 'order_quantity': 2}, 'contract': {'security_type': 'OPT', 'code': 'TXO', 'exchange': 'TIM', 'delivery_month': '202110', 'delivery_date': '', 'strike_price': 16300.0, 'option_right': 'OptionCall'}}
好玩的是,萬一價格下錯,超出規則,他會這樣顯示:
OrderState.FOrder {'operation': {'op_type': 'New', 'op_code': '9921', 'op_msg': '超過該商品漲跌停價'}...(以下省略)
下單其實有點複雜,不過簡單的話只需要動三個參數,也就是買賣別、數量、價格,再加上商品就可以下單。我們之前已經取得商品的價格,也說明組合單的買賣別,接著就直接輕鬆地帶入價格和買賣方向進去,這樣就可以下單囉~~是不是還滿簡單的呢!
另外,測試環境居然Mac也能下單,還滿方便的,不過正式區應該就需要docker了...