Shioaji api 永豐金

Shiaoji SinoPac 永豐金證券 Python API

By Jason Chuang 2025-02-19

Git Source Code

Requirements

Install required packages

pip install  -r requirements.txt

Modify .env file

cp .env.template .env

欲開通正式環境API下單權限,客戶須於模擬環境完成登入及下單測試.


api = sj.Shioaji(simulation=True) # 模擬模式登入
accounts = api.login(
    api_key=os.getenv('API_KEY'),
    secret_key=os.getenv('SECRET_KEY')  
)
accounts    



等正式開通後,會出現signed=True

Response Code: 0 | Event Code: 0 | Info: host '203.66.91.161:80', hostname '203.66.91.161:80' 
IP 203.66.91.161:80 (host 1 of 1) (host connection attempt 1 of 1) (total connection attempt 1 of 1) | 
Event: Session up[FutureAccount(person_id='F123456789', broker_id='F002000', account_id='1234567', signed=True, username='莊OO'), 
StockAccount(person_id='F123456789', broker_id='9A95', account_id='1234568', signed=True, username='莊OO')]

要正式下單時記得CA憑證(通過模擬測試後從網頁下載的)路徑要用斜線(/)

CA_PATH="C:/ekey/1234/Sinopac.pfx"

登入及查詢帳號餘額


api = sj.Shioaji(simulation=False) 
accounts = api.login(
    api_key=os.getenv('API_KEY'),
    secret_key=os.getenv('SECRET_KEY')  
)
tmp=api.account_balance()
print(tmp)

查詢0050報價


api = sj.Shioaji(simulation=False) 
accounts = api.login(
    api_key=os.getenv('API_KEY'),
    secret_key=os.getenv('SECRET_KEY')  
)
tmp = api.quote.subscribe(
    api.Contracts.Stocks["0050"], 
    quote_type = sj.constant.QuoteType.Tick,
    version = sj.constant.QuoteVersion.v1
)
print(tmp)

下單平盤價單買00878


api = sj.Shioaji(simulation=False) # 正式模式
accounts = api.login(
    api_key=os.getenv('API_KEY'),
    secret_key=os.getenv('SECRET_KEY')  
)
accounts
## Activate CA
result = api.activate_ca(
    ca_path=os.getenv('CA_CA_CERT_PATH'),
    ca_passwd=os.getenv('CA_PASSWD')
)
print(result)
# 商品檔 - 請修改此處
# 準備下單的 Contract
# 使用 00878 國泰永續高股息
contract = api.Contracts.Stocks["00878"]
print(f"Contract: {contract}")

# 建立委託下單的 Order
order = sj.order.StockOrder(
    action=Action.Buy, # 買進
    price=contract.reference, # 以平盤價買進
    quantity=1, # 下單數量
    price_type=StockPriceType.LMT, # 限價單
    order_type=OrderType.ROD, # 當日有效單
    account=api.stock_account, # 使用預設的帳戶
)
print(f"Order: {order}")

# 送出委託單
trade = api.place_order(contract=contract, order=order)
print(f"Trade: {trade}")

# 更新狀態
api.update_status()
print(f"Status: {trade.status}")

Reference

https://github.com/Sinotrade/Shioaji

Tutorial for Shioaji

永豐金證券API