Skip to content

測試專案範例

首先,我們延伸前面在環境建立章節使用 uv 建立的專案 sj-trading 來新增測試流程的部分。

這部分完整專案的程式碼可以參考 sj-trading https://github.com/Sinotrade/sj-trading-demo

可以使用 git 將整個環境複製到本地就可以直接使用

下載專案

git clone https://github.com/Sinotrade/sj-trading-demo.git
cd sj-trading-demo

下面我們將一步一步的介紹如何新增測試流程。

Shioaji 版本

獲取 Shioaji 版本資訊

新增版本資訊

src/sj_trading/__init__.py 新增

def show_version() -> str:
    print(f"Shioaji Version: {sj.__version__}")
    return sj.__version__

新增版本指令到專案

pyproject.toml 新增 version 的指令

[project.scripts]
version = "sj_trading:show_version"

執行 uv run version 就可以看到 Shioaji 的版本資訊

Shioaji Version: 1.2.0

現貨下單測試

新增下單測試檔案

src/sj_trading 新增檔案 testing_flow.py

新增以下內容

import shioaji as sj
from shioaji.constant import Action, StockPriceType, OrderType
import os

def testing_stock_ordering():
    # 測試環境登入
    api = sj.Shioaji(simulation=True)
    accounts = api.login(
        api_key=os.environ["API_KEY"],
        secret_key=os.environ["SECRET_KEY"],
        ca_cert_path=os.environ["CA_CERT_PATH"],
        ca_password=os.environ["CA_PASSWORD"],
    )
    # 顯示所有可用的帳戶
    print(f"Available accounts: {accounts}")
    api.activate_ca(
        ca_path=os.environ["CA_CERT_PATH"],
        ca_passwd=os.environ["CA_PASSWORD"],
    )

    # 準備下單的 Contract
    # 使用 2890 永豐金為例
    contract = api.Contracts.Stocks["2890"]
    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}")

新增測試下單指令到專案

pyproject.toml 新增 stock_testing 的指令

[project.scripts]
stock_testing = "sj_trading.testing_flow:testing_stock_ordering"

執行 uv run stock_testing 就開始進行測試下單了

期貨下單測試

新增期貨下單測試

src/sj_trading/testing_flow.py 新增以下內容

from shioaji.constant import (
    FuturesPriceType,
    FuturesOCType,
)

def testing_futures_ordering():
    # 測試環境登入
    api = sj.Shioaji(simulation=True)
    accounts = api.login(
        api_key=os.environ["API_KEY"],
        secret_key=os.environ["SECRET_KEY"],
        ca_cert_path=os.environ["CA_CERT_PATH"],
        ca_password=os.environ["CA_PASSWORD"],
    )
    # 顯示所有可用的帳戶
    print(f"Available accounts: {accounts}")
    api.activate_ca(
        ca_path=os.environ["CA_CERT_PATH"],
        ca_passwd=os.environ["CA_PASSWORD"],
    )

    # 取得合約 使用台指期近月為例
    contract = api.Contracts.Futures["TXFR1"]
    print(f"Contract: {contract}")

    # 建立期貨委託下單的 Order
    order = sj.order.FuturesOrder(
        action=Action.Buy,  # 買進
        price=contract.reference,  # 以平盤價買進
        quantity=1,  # 下單數量
        price_type=FuturesPriceType.LMT,  # 限價單
        order_type=OrderType.ROD,  # 當日有效單
        octype=FuturesOCType.Auto,  # 自動選擇新平倉
        account=api.futopt_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}")

新增期貨下單指令到專案

pyproject.toml 新增 futures_testing 的指令

[project.scripts]
futures_testing = "sj_trading.testing_flow:testing_futures_ordering"

執行 uv run futures_testing 就開始進行測試下單了