| Crates.io | rshioaji |
| lib.rs | rshioaji |
| version | 0.4.9 |
| created_at | 2025-06-15 09:06:46.981431+00 |
| updated_at | 2025-07-06 06:30:24.507618+00 |
| description | Rust wrapper for Taiwan Shioaji API with native event callbacks - A high-performance trading library |
| homepage | https://github.com/stevelo/rshioaji |
| repository | https://github.com/stevelo/rshioaji |
| max_upload_size | |
| id | 1713097 |
| size | 500,449 |
一個用 Rust 封裝台灣永豐金證券 shioaji API 的高效能交易程式庫,支援多平台部署。
✅ 已成功發佈至 crates.io
開發者: Steve Lo
聯絡方式: info@sd.idv.tw
專案性質: 概念驗證 (Proof of Concept) 專案
在您的 Cargo.toml 中添加:
[dependencies]
# 基本版本
rshioaji = "0.4.9"
# 啟用高效能功能 (推薦)
rshioaji = { version = "0.4.9", features = ["speed"] }
# 啟用所有功能 + 事件回調
rshioaji = { version = "0.4.9", features = ["speed"] }
| 功能 | 描述 | 用途 |
|---|---|---|
speed |
🚀 高效能時間處理 | 等效於 Python shioaji[speed],提升日期時間處理效能 |
sentry |
🔍 Sentry 錯誤追蹤 | 支援 Sentry 錯誤監控和追蹤功能 |
本版本實現了完整的交易系統功能,與原始 shioaji 套件功能完全對等:
update_order(), cancel_order(), list_trades()list_accounts() - 列出所有可用帳戶list_positions() - 查詢持倉資訊Unit 枚舉,擴展 from_string 方法| 回調類型 | 介面 | 描述 |
|---|---|---|
| 市場資料回調 | TickCallback |
處理股票和期權的 tick 資料事件 |
| 買賣價差回調 | BidAskCallback |
處理委買委賣價差變化事件 |
| 報價回調 | QuoteCallback |
處理即時報價和綜合報價事件 |
| 訂單回調 | OrderCallback |
處理訂單狀態變更和成交事件 |
| 系統回調 | SystemCallback |
處理系統事件和連線狀態變化 |
get_system_contract 方法create_system_contract → get_system_contractapi.Contracts.Stocks["2330"] 模式一致login() 方法// ❌ 錯誤用法:未登入就嘗試存取合約
let client = Shioaji::new(false, HashMap::new())?;
client.place_order(contract, order).await?; // 會失敗並提示需要登入
// ✅ 正確用法:先登入再存取合約
let client = Shioaji::new(false, HashMap::new())?;
client.init().await?;
client.login(&api_key, &secret_key, true, 30, None, false, 30000).await?;
client.place_order(contract, order).await?; // 成功,取得真實 Python 合約實例
# 基本編譯
cargo build
# 啟用高效能功能
cargo build --features speed
# 生產環境編譯 (推薦)
cargo build --release --features speed
macosx_arm)manylinux_x86_64)pip install shioaji# 創建新的 Rust 專案
cargo new my-trading-app
cd my-trading-app
# 編輯 Cargo.toml 添加依賴
[dependencies]
rshioaji = { version = "0.4.9", features = ["speed"] }
tokio = { version = "1.0", features = ["full"] }
use rshioaji::{Shioaji, Exchange, Action, OrderType, Order, StockPriceType};
use std::collections::HashMap;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 初始化環境
dotenvy::dotenv().ok();
env_logger::init();
// 創建客戶端
let client = Shioaji::new(false, HashMap::new())?; // false = 真實模式
client.init().await?;
// 🔑 重要:必須先登入才能存取合約
// get_system_contract 方法會檢查登入狀態
let api_key = std::env::var("SHIOAJI_API_KEY")?;
let secret_key = std::env::var("SHIOAJI_SECRET_KEY")?;
let accounts = client.login(
&api_key,
&secret_key,
true, // fetch_contract: 下載合約資料
30, // contracts_timeout
None, // contracts_cb
false, // subscribe_trade
30000 // receive_window
).await?;
println!("✅ 登入成功!帳戶數量: {}", accounts.len());
// ✅ 登入後可以安全存取合約
// get_system_contract 會從 api.Contracts.Stocks["2330"] 取得真實 Python 實例
let stock = client.create_stock("2330", Exchange::TSE);
let order = Order::new(Action::Buy, 500.0, 1000, OrderType::ROD, StockPriceType::LMT);
match client.place_order(stock.contract, order).await {
Ok(trade) => println!("下單成功!交易 ID: {}", trade.order_id),
Err(e) => println!("下單失敗:{}", e),
}
// 登出
client.logout().await?;
Ok(())
}
// ❌ 錯誤:未登入就嘗試下單
let client = Shioaji::new(false, HashMap::new())?;
client.place_order(contract, order).await?;
// Error: "Must login first before accessing contracts. Please call login() method."
// ✅ 正確:先登入再操作
let client = Shioaji::new(false, HashMap::new())?;
client.init().await?;
client.login(&api_key, &secret_key, true, 30, None, false, 30000).await?;
client.place_order(contract, order).await?; // 成功
use rshioaji::{
Shioaji, TickCallback, BidAskCallback, QuoteCallback, OrderCallback, SystemCallback,
TickSTKv1, TickFOPv1, BidAskSTKv1, BidAskFOPv1, QuoteSTKv1, OrderState, Exchange
};
use std::sync::Arc;
// 實作事件處理器
#[derive(Debug)]
struct MyEventHandler {
name: String,
}
impl TickCallback for MyEventHandler {
fn on_tick_stk_v1(&self, exchange: Exchange, tick: TickSTKv1) {
println!("📈 [{}] 股票 Tick: {} @ {:?} - 價格: {}",
self.name, tick.code, exchange, tick.close);
}
fn on_tick_fop_v1(&self, exchange: Exchange, tick: TickFOPv1) {
println!("📊 [{}] 期權 Tick: {} @ {:?} - 價格: {}",
self.name, tick.code, exchange, tick.close);
}
}
impl OrderCallback for MyEventHandler {
fn on_order(&self, order_state: OrderState, data: serde_json::Value) {
println!("📋 [{}] 訂單更新: {:?}", self.name, order_state);
}
}
impl SystemCallback for MyEventHandler {
fn on_event(&self, event_type: i32, code: i32, message: String, details: String) {
println!("🔔 [{}] 系統事件: {}", self.name, message);
}
fn on_session_down(&self) {
println!("⚠️ [{}] 連線中斷!", self.name);
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Shioaji::new(true, HashMap::new())?;
client.init().await?;
// 建立事件處理器
let handler = Arc::new(MyEventHandler { name: "主處理器".to_string() });
// 註冊各種回調
client.register_tick_callback(handler.clone()).await;
client.register_order_callback(handler.clone()).await;
client.register_system_callback(handler.clone()).await;
// 設定回調系統
client.setup_callbacks().await?;
println!("✅ 事件回調系統已啟動");
Ok(())
}
git clone https://github.com/stevelo/rshioaji
cd rshioaji
cargo build --release
# 啟用 speed 功能,等效於 shioaji[speed]
cargo build --release --features speed
Speed 功能優勢:
創建 .env 檔案或設定環境變數:
# .env 檔案範例
SHIOAJI_API_KEY=您的實際API金鑰
SHIOAJI_SECRET_KEY=您的實際密鑰
SHIOAJI_SIMULATION=false
RUST_LOG=info
SHIOAJI_API_KEY 或 API_KEY - API 金鑰SHIOAJI_SECRET_KEY 或 SECRET_KEY - 密鑰SHIOAJI_SIMULATION 或 SIMULATION - 模擬模式 (true/false)pip install shioajiLOG_LEVEL - 日誌等級 (DEBUG/INFO/WARNING/ERROR/CRITICAL)SJ_LOG_PATH - 日誌檔案路徑 (設為 "console" 只輸出到控制台)RUST_LOG - Rust 日誌等級 (debug/info/warn/error)SENTRY_URI - Sentry DSN URLLOG_SENTRY - 是否啟用 Sentry (True/False)SENTRY_LOG_LEVEL - Sentry 日誌等級 (DEBUG/INFO/WARNING/ERROR/CRITICAL)LEGACY_TEST - 遺留測試模式 (0=停用, 1=啟用)# 基本執行
cargo run
# 啟用高效能功能
cargo run --features speed
# 生產環境執行
cargo run --release --features speed
use rshioaji::{Shioaji, Config, Exchange, Action, OrderType, StockPriceType, Order};
use std::collections::HashMap;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 載入配置
let config = Config::from_env()?;
let client = Shioaji::new(config.simulation, HashMap::new())?;
client.init().await?;
// 登入
let accounts = client.login(&config.api_key, &config.secret_key, true).await?;
// 創建股票合約
let stock = client.create_stock("2330", Exchange::TSE);
// 創建買單
let order = Order::new(
Action::Buy,
100.0, // 價格
1000, // 數量
OrderType::ROD,
StockPriceType::LMT,
);
// 下單 (注意:這會實際下單,請謹慎使用)
let trade = client.place_order(stock.contract, order).await?;
println!("委託成功:{:?}", trade);
Ok(())
}
# 編譯 CLI 工具
cargo build --bin rshioaji-cli --release
# 查看幫助
./target/release/rshioaji-cli --help
# 查詢股票資料
./target/release/rshioaji-cli --stock 2330
# 啟用除錯模式
./target/release/rshioaji-cli --debug --stock 2330
# Linux x86_64 平台(推薦生產環境 - 162MB)
./docker-build.sh linux
# Python 3.13 原生支援版本(200MB)
docker build -t rshioaji:python312 -f Dockerfile.python .
# Alpine Linux(超輕量版本 - 50MB)
./docker-build.sh alpine
# macOS ARM64 平台(開發環境 - 100MB)
./docker-build.sh macos
# 手動建置
docker build -t rshioaji:latest . # 輕量版 162MB (Python 3.11)
docker build -t rshioaji:python313 -f Dockerfile.python . # Python 3.13 200MB
docker build -t rshioaji:alpine -f Dockerfile.alpine . # 超輕量 50MB
docker build -t rshioaji:macos -f Dockerfile.macos . # macOS ARM64
# 使用 .env 檔案執行(推薦 - Python 3.13)
docker run --rm -v $(pwd)/.env:/app/.env:ro rshioaji:python313 --stock 2330
# 使用 .env 檔案執行(Python 3.11 輕量版)
docker run --rm -v $(pwd)/.env:/app/.env:ro rshioaji:latest --stock 2330
# 使用環境變數執行(Python 3.13)
docker run --rm \
-e SHIOAJI_API_KEY=your_key \
-e SHIOAJI_SECRET_KEY=your_secret \
-e SHIOAJI_SIMULATION=false \
rshioaji:python313 --stock 2330 --debug
# Alpine 超輕量版本
docker run --rm -v $(pwd)/.env:/app/.env:ro rshioaji:alpine --stock 2330
# 互動模式(Python 3.13)
docker run --rm -it -v $(pwd)/.env:/app/.env:ro rshioaji:python313 bash
# 背景執行(Python 3.12)
docker run -d --name rshioaji-trader \
-v $(pwd)/.env:/app/.env:ro \
rshioaji:python313 --stock 2330 --debug
創建 docker-compose.yml(Python 3.13 版本):
version: '3.8'
services:
rshioaji:
build:
context: .
dockerfile: Dockerfile.python # 使用 Python 3.13
env_file:
- .env
command: ["--stock", "2330", "--debug"]
restart: unless-stopped
volumes:
- ./logs:/app/logs
或使用預建映像:
version: '3.8'
services:
rshioaji:
image: rshioaji:python313
env_file:
- .env
command: ["--stock", "2330", "--debug"]
restart: unless-stopped
volumes:
- ./logs:/app/logs
執行:
docker-compose up -d
docker-compose logs -f rshioaji
| 版本 | 大小 | 用途 | Python 支援 |
|---|---|---|---|
| rshioaji:python313 | 200MB | Python 3.13 推薦 | ✅ 原生 3.13 支援 |
| rshioaji:latest | 180MB | Python 3.13 輕量版 | ✅ 完整支援 |
| rshioaji:alpine | 70MB | 資源受限環境 | ⚠️ 基本支援 |
| rshioaji:macos | 120MB | 開發環境 | ✅ 完整支援 |
rshioaji 提供完整的環境變數管理功能,對應 Python shioaji 的 utils.py 模組。
創建 .env 檔案:
# 基本 API 設定
SHIOAJI_API_KEY=your_actual_api_key
SHIOAJI_SECRET_KEY=your_actual_secret_key
SHIOAJI_SIMULATION=true
# 日誌設定
LOG_LEVEL=INFO
SJ_LOG_PATH=shioaji.log
# Sentry 錯誤追蹤 (選用)
SENTRY_URI=https://your-dsn@sentry.io/project-id
LOG_SENTRY=True
SENTRY_LOG_LEVEL=ERROR
# 測試設定
LEGACY_TEST=0
use rshioaji::{EnvironmentConfig, init_logging};
// 載入環境變數配置
let env_config = EnvironmentConfig::from_env();
// 驗證配置
if let Err(e) = env_config.validate() {
eprintln!("環境變數配置錯誤: {}", e);
return Ok(());
}
// 初始化日誌系統
init_logging(&env_config)?;
log::info!("環境配置: {}", env_config.summary());
日誌格式與 Python 版本保持一致:
[L YYYY-MM-DD HH:MM:SS.fff UTC filename:line:function] message
[I 2024-01-15 08:30:45.123 UTC main.rs:25:main] 🚀 rshioaji 環境初始化完成
[I 2024-01-15 08:30:45.124 UTC main.rs:26:main] 📊 日誌等級: INFO
[I 2024-01-15 08:30:45.125 UTC main.rs:27:main] 🛡️ Sentry 錯誤追蹤: 啟用
# 編譯時加入 sentry 功能
cargo build --features sentry
# 執行時啟用 Sentry
LOG_SENTRY=True SENTRY_URI=your_sentry_dsn cargo run --features sentry
use rshioaji::{Shioaji, Config};
use std::collections::HashMap;
// 方法 1: 從環境變數載入 (推薦)
let config = Config::from_env()?;
let client = Shioaji::new(config.simulation, HashMap::new())?;
// 方法 2: 手動配置
let client = Shioaji::new(true, HashMap::new())?; // true = 模擬模式
use rshioaji::{Exchange, QuoteType};
// 創建合約
let stock = client.create_stock("2330", Exchange::TSE);
// 訂閱即時報價
client.subscribe(stock.contract.clone(), QuoteType::Tick).await?;
// 取得歷史 K 線
let kbars = client.kbars(stock.contract, "2024-01-01", "2024-01-31").await?;
use rshioaji::{Action, OrderType, StockPriceType, Order};
// 創建委託單
let order = Order::new(
Action::Buy, // 買賣別
100.0, // 價格
1000, // 數量
OrderType::ROD, // 委託類型
StockPriceType::LMT, // 價格類型
);
// 送出委託
let trade = client.place_order(stock.contract, order).await?;
rshioaji/
├── src/ # Rust 原始碼
│ ├── lib.rs # 程式庫入口
│ ├── main.rs # 可執行檔入口
│ ├── client.rs # 主要客戶端實作
│ ├── bindings.rs # Python FFI 綁定
│ ├── platform.rs # 平台檢測邏輯
│ ├── error.rs # 錯誤處理
│ └── types/ # 型別定義
├── examples/ # 範例程式
├── tests/ # 測試檔案
├── Dockerfile # Docker 配置
├── .dockerignore # Docker 忽略檔案
└── docker-build.sh # Docker 建置腳本
rshioaji 會自動檢測執行平台並確認系統 shioaji 安裝:
use rshioaji::platform::Platform;
let platform = Platform::detect();
println!("檢測到平台: {:?}", platform);
// 驗證系統 shioaji 安裝
platform.validate_system_shioaji()?;
# 安裝 Python shioaji 套件
pip install shioaji
# 驗證安裝
python3 -c "import shioaji; print('✅ 系統 shioaji 安裝成功')"
v0.2.0+ 使用純系統 shioaji 整合,無需設定環境變數:
# 直接執行,自動檢測系統 shioaji
./target/release/rshioaji-cli
# 或使用 cargo
cargo run --release --features speed
export RUST_LOG=debug
cargo run --example simple_test
# 確認系統 shioaji 安裝
python3 -c "import shioaji; s=shioaji.Shioaji(); print('✅ 系統 shioaji 正常')"
# 檢查 Python 環境
which python3
python3 --version
A: 請確認系統已安裝 shioaji:pip install shioaji,並確認可以正常導入。
A: 確認使用正確的 Dockerfile(Linux 用 Dockerfile,macOS 用 Dockerfile.macos)。
A: 確認系統 Python 環境正確且已安裝 shioaji:pip install shioaji。
A: 檢查系統 Python 環境,確認 shioaji 正確安裝:python3 -c "import shioaji"。
此專案採用 MIT 和 Apache 2.0 雙重授權。
歡迎提交 Issue 和 Pull Request!
如有任何問題或建議,請聯絡:
# 啟用高效能模式 (推薦生產環境)
cargo build --release --features speed
# 基本編譯 (純系統整合)
cargo build --release
// 使用 speed 功能時,自動啟用:
// - 高效能日期時間處理 (等效於 ciso8601)
// - 優化的 base58 編碼 (等效於 based58)
// - 其他 Rust 原生高效能實作
// 無需額外程式碼,編譯時自動優化
rshioaji 已成功發佈至 crates.io 並通過完整測試:
# 創建測試專案
cargo new test-rshioaji && cd test-rshioaji
# 添加依賴
echo 'rshioaji = { version = "0.4.9", features = ["speed"] }' >> Cargo.toml
# 編譯測試
cargo build
[dependencies]
rshioaji = "0.4.9" # 最新版本 (支援事件回調)
⚠️ 重要聲明: