Skip to main content

交易

這篇教學將示範如何於盤中進行一個完整的買賣交易流程。

買入股票

假設今天股市開盤後,我們決定立刻以 28.00 元購買兩張玉山金,並透過自訂欄位註記自訂內容方便後續統整帳務,我們可以撰寫以下程式並執行:

from configparser import ConfigParser
from fugle_trade.sdk import SDK
from fugle_trade.order import OrderObject
from fugle_trade.constant import (APCode, Trade, PriceFlag, BSFlag, Action)

config = ConfigParser()
config.read('./config.ini')
sdk = SDK(config)
sdk.login()
# 為求說明簡潔,以上讀取設定及登入的程式碼,在下文範例程式碼中將略過不寫

order = OrderObject(
buy_sell = Action.Buy,
price = 28.00,
stock_no = "2884",
quantity = 2,
ap_code = APCode.Common,
user_def = "strategy_test"
)
sdk.place_order(order)
info

不同 ap_code 對應的 quantity 之單位及範圍不同,請參考 Reference 說明

確認委託及成交狀態

我們可以每隔一段時間,查詢委託的狀態:

orderResults = sdk.get_order_results()
print(orderResults)

根據回傳的結果,我們可以判斷該筆委託有沒有成交、成交了多少數量,以及自訂欄位內容:

[
{
...
"avg_price": 0.0, // 成交均價 (number)
"buy_sell": "B", // 買賣別 (Action enum)
"mat_qty": 0, // 已成交數量(張) (number)
"od_price": 28.00, // 委託價格 (number)
"ord_date": "20220310", // 原始委託日期 (string)
"ord_time": "094932438", // 原始委託時間 (string)
"stock_no": "2884", // 股票代號 (string)
"user_def": "strategy_test", //自訂欄位(string)
...
},
...
]
info

委託明細會回傳當日所有委託的狀態,您可以使用序號或是其他方式辨別不同的委託單。更詳細的回傳值欄位說明請參考 SDK Reference

修改委託價格

因為委託一直沒有成交,我們決定修改委託的價格,改成用 29.95 元的價格買入:

orderResults = sdk.get_order_results()
sdk.modify_price(orderResults[0], 29.95)

幾分鐘後我們再查詢一次委託狀態,發現成交了:

orderResults = sdk.get_order_results()
print(orderResults)
[
{
...
"avg_price": 29.90, // 成交均價 (number)
"buy_sell": "B", // 買賣別 (Action enum)
"mat_qty": 2, // 已成交數量(張) (number)
"od_price": 29.95, // 委託價格 (number)
"ord_date": "20220310", // 原始委託日期 (string)
"ord_time": "094932438", // 原始委託時間 (string)
"stock_no": "2884", // 股票代號 (string)
...
},
...
]

賣出股票

最後我們決定在收盤前賣出其中一張玉山金:

order = OrderObject(
buy_sell = Action.Sell,
price = 31.10,
stock_no = "2884",
quantity = 1,
ap_code = APCode.Common,
trade = Trade.DayTradingSell # 當沖賣出
)
sdk.place_order(order)
caution

若要於盤中進行當沖交易,您必須具備當沖權限,請參考此處說明

您可以到實例應用參考更多結合策略的範例程式碼。