下單系統
分析完元富證券的下單系統 Python API 之後,我們就可以基於自己的需求,開發一個下單系統。
在大多數的情境下,我們只會單獨操作一個證券帳戶,所以我們目前的實作是基於單一帳號的情境。
warning
我們不推薦任何股票,所有關於證券戶內的股票資訊都會以馬賽克處理。
登入帳號
你可以直接把帳號密碼寫在類別的輸入中,也可以參考我們的寫法:使用一個 yaml 檔案來儲存帳號資訊。
參數檔案中,必須有帳號密碼和帳號號碼,這樣才能順利登入元富證券的帳號。
from autotraderx import load_yaml
from autotraderx.masterlink import Trader
# Load account infos
cfg = load_yaml(DIR / "account.yaml")
# Login account
account = Trader(
user=cfg["user"],
password=cfg["password"],
account_number=str(cfg["account_number"]),
is_sim=False,
is_force=True,
is_event=False,
)
account.login()
# Do something
account.stop()
查詢庫存
登入帳號,呼叫 get_inventory
函數,就可以查詢目前的庫存狀況。
查詢結果會直接顯示在命令列中,我們可以看到目前的庫存狀況,如果要取得資訊做進一步地使用,可以直接使用回傳值。
data = account.get_inventory()
其中,data
的輸出格式為一個字典,內容像是:
{
'2002': {
'股票': '中鋼',
'融券庫存(張)': '0',
'融資庫存(張)': '0',
'集保庫存(張)': '1',
'零股庫存(股)': '0'
},
'2330': {
'股票': '台積電',
'融券庫存(張)': '0',
'融資庫存(張)': '0',
'集保庫存(張)': '1',
'零股庫存(股)': '0'
},
# ...以下省略
}
如果不需要顯示在命令列,可以在初始化 Trader
時,設定 verbose
參數為 False
。
account = Trader(
verbose=False
)
查詢委託資訊
登入帳號,呼叫 get_order_report
函數,就可以查詢目前的所有委託資訊。
查詢結果會直接顯示在命令列中,我們可以看到目前的所有委託資訊,如果要取得資訊做進一步地使用,可以直接使用回傳值。
data = account.get_order_report()
其中,data
的輸出格式為 List[Dict],內容像是:
[
{
'委託價': '13.95',
'委託方式(價格)': '限價單',
'委託方式(效期)': '當日有效',
'委託時間': '08:31:32.032000',
'委託書號': 'i0040',
'委託量': '4000',
'成交價': '',
'成交時間': '',
'成交量': '',
'狀態': '',
'股票': '馬賽克',
'股票代號': '馬賽克',
'訊息': '',
'買賣別': 'Sell',
'類型': '委託訂單'
},
# ...以下省略
]
查詢成交資訊
登入帳號,呼叫 get_trade_report
函數,就可以查詢目前的所有成交資訊。
查詢結果會直接顯示在命令列中,我們可以看到目前的所有成交資訊,如果要取得資訊做進一步地使用,可以直接使用回傳值。
data = account.get_trade_report()
其中,data
的輸出格式為 List[Dict],內容像是:
[
{
'委託價': '13.95',
'委託方式(價格)': '限價單',
'委託方式(效期)': '當日有效',
'委託時間': '08:31:32.032000',
'委託書號': 'i0040',
'委託量': '4000',
'成交價': '',
'成交時間': '09:00:11.609000',
'成交量': '4000',
'狀態': '111)全部成交',
'股票': '馬賽克',
'股票代號': '馬賽克',
'訊息': '',
'買賣別': 'Sell',
'類型': '委託訂單'
},
# ...以下省略
]
下單定義型別
在下單的過程中,元富證券定義了幾個常數,我們需要先了解這些常數的意義。
OrderType
# 委託方式(效期)
class OrderType(str, Enum):
# 當日有效
ROD = "R"
# 立即成交,否則取消
IOC = "I"
# 立即全部成交,否則取消
FOK = "F"
PriceType
# 委託方式(價格)
class PriceType(str, Enum):
# 限價單
LMT = "L"
# 市價單
MKT = "M"