注意:
- 操作功能前請先登入。
- 詳細物件定義請參考 API Reference/ftrade。
1. 訂閱回報接收
在執行交易前,請先訂閱回報事件以接收系統通知:
系統會在事件觸發時分別傳入 FOrderReply 與 FMatchReply 物件。
def on_reply(orderreply: FOrderReply):
print(f"收到委託回報: {orderreply.orderno} 狀態: {orderreply.orderstatus}")
print(orderreply)
# FOrderReply 物件結構範例:
# ------------------------------------------------
# brokerid='F008000', # 分公司
# investoracno='1234567', # 帳號
# orderno='C0068', # 委託書號
# ordertime='141414995', # 委託時間
# exchange='CME', # 交易所
# symbol='MNQ', # 商品代碼
# bs='S', # 買賣別
# price=0.0, # 委託價格
# orderqty=1, # 委託數量
# matchqty=1, # 成交數量
# orderstatus='完全成交', # 委託狀態
# statuscode='0004', # 委託狀態碼
# seq='A8OJJ0002 ', # 下單序號
# ... (其他詳細欄位請參閱 API 文件)
def on_match(matchreply: FMatchReply):
print(f"收到成交回報: {matchreply.orderno} 成交價: {matchreply.matchprice}")
print(matchreply)
# FMatchReply 物件結構範例:
# ------------------------------------------------
# brokerid='F008000', # 分公司
# investoracno='1234567', # 帳號
# matchtime='143855956', # 成交時間
# orderno='C0075', # 委託書號
# exchange='CME', # 交易所
# symbol='AD', # 商品代碼
# bs='S', # 買賣別
# matchprice=6473.5, # 成交價格
# matchqty=1, # 成交口數
# matchseq='AF4B0...', # 成交序號
# ... (其他詳細欄位請參閱 API 文件)
# 註冊 Callback
unitrade.ftrade.on_reply = on_reply
unitrade.ftrade.on_match = on_match
print('訂閱完畢')
2. 下單 (New Order)
使用 order 方法進行下單。需先建立 FOrderObject 物件並填入相關參數。
# 宣告下單物件
order = FOrderObject()
order.actno = actno # 帳號
order.subactno = "" # 子帳 (無則留空)
order.note = "ordertest" # 備註
order.exchange = "CME" # 交易所
order.symbol = "AD" # 商品代碼
order.maturitymonthyear = "202409" # 年月
order.putorcall = "F" # F:期貨, C:Call, P:Put
order.bs = "B" # B:買進, S:賣出
order.ordertype = "M" # L:限價, M:市價, 3:停損市價, 4:停損限價
order.price = 0 # 委託價格 (市價填0)
order.stopprice = 0 # 停損價格
order.orderqty = 1 # 委託數量
order.ordercondition = "R" # I:IOC, R:ROD, F:FOK
order.opencloseflag = "0" # 0:新倉, 1:平倉, 空白:自動
order.dtrade = "N" # Y:當沖, N:非當沖
# 執行下單
orderresponse = unitrade.ftrade.order(order)
print(f"是否成功: {orderresponse.issend}, 下單序號: {orderresponse.seq}, 錯誤訊息: {orderresponse.errormsg}")
# 回傳 FOrderResponse 範例:
# ------------------------------------------------
# FOrderResponse(
# issend=True, # 是否送出
# seq='AGmb80002', # 下單序號
# errorcode='', # 錯誤代碼
# errormsg='', # 錯誤訊息
# note='ordertest' # 傳入的備註
# )
3. 委託變更 (改單)
委託變更包含「刪單」、「減量」與「改價」。統一使用 replace_order 方法,並透過 FReplaceObject 的 replacetype 屬性來區分操作類型。
刪單 (Cancel)
將 replacetype 設定為 "4"。
replace = FReplaceObject()
replace.replacetype = "4" # 4:取消
replace.actno = "1234567" # 帳號
replace.orderno = "A0001" # 原委託書號
replaceresponse = unitrade.ftrade.replace_order(replace)
print(f"刪單結果: {replaceresponse.issend}, 訊息: {replaceresponse.errormsg}")
減量 (Decrease Quantity)
將 replacetype 設定為 "5",並指定修改後的數量。
replace = FReplaceObject()
replace.replacetype = "5" # 5:減量
replace.actno = "1234567" # 帳號
replace.orderno = "A0001" # 原委託書號
replace.orderqty = 1 # 欲減掉的數量 (或是減量後的剩餘數量,請依實際API定義為主)
replaceresponse = unitrade.ftrade.replace_order(replace)
print(f"減量結果: {replaceresponse.issend}, 訊息: {replaceresponse.errormsg}")
改價 (Modify Price)
將 replacetype 設定為 "m"。需重新指定價格別、條件與新價格。
replace = FReplaceObject()
replace.replacetype = "m" # m:改價
replace.actno = "1234567" # 帳號
replace.orderno = "A0001" # 原委託書號
replace.ordertype = "L" # L:限價, M:市價
replace.ordercondition = "R" # I:IOC, R:ROD, F:FOK
replace.price = 22300 # 新委託價格
replaceresponse = unitrade.ftrade.replace_order(replace)
print(f"改價結果: {replaceresponse.issend}, 訊息: {replaceresponse.errormsg}")
4. 查詢功能
委回查詢 (Query Reply)
透過 query_reply 查詢委託紀錄。
# 參數依序為: 帳號, 筆數, 網路流水序號起, 網路流水序號迄, 委託時間起, 委託時間迄
query_reply_response = unitrade.ftrade.query_reply(actno, 500, "", "", "", "")
# 回傳結果 FQueryReplyResponse 範例
if query_reply_response.ok:
for data in query_reply_response.data:
print(f"委託書號: {data.orderno}, 商品: {data.symbol}, 狀態: {data.orderstatus}")
# data 為 FOrderReply 物件,結構同 on_reply
成回查詢 (Query Match)
透過 query_match 查詢成交紀錄。
# 參數依序為: 帳號, 筆數, 網路流水序號起, 網路流水序號迄, 成交時間起, 成交時間迄
query_match_response = unitrade.ftrade.query_match(actno, 500, "", "", "", "")
# 回傳結果 FQueryMatchResponse 範例
if query_match_response.ok:
for data in query_match_response.data:
print(f"成交書號: {data.orderno}, 商品: {data.symbol}, 成交價: {data.matchprice}")
# data 為 FMatchReply 物件,結構同 on_match
```