1. 什麼是 Pionex API?
Pionex API 是一個程式化介面,讓您可以透過自己的程式碼、腳本或第三方工具來控制您的 Pionex 帳戶 — 完全不需要在 Pionex 網頁應用程式中點選任何按鈕。任何您能在使用者介面上做的事情(查看餘額、下現貨單、啟動網格機器人、開啟合約持倉、訂閱雙幣投資產品),都可以透過 API 來完成。
API 使用兩種相關的「方言」:
REST — 經典的 HTTP 請求。您提出一個問題(
GET)或推送一項變更(POST、DELETE),並收到 JSON 格式的回應。最適合用於動作:下這張單、取消那個機器人、顯示我的餘額。WebSocket — 一條長時間維持的串流連線。伺服器會即時將更新推送給您。最適合用於不斷變動的資料:即時價格、訂單簿更新,以及成交發生當下的成交回報。
大多數整合會同時使用兩者:REST 用於「立刻做某件事」,WebSocket 用於「當某件事發生時告訴我」。
如需存取 API 金鑰的建立功能,請參閱 步驟 4.1
誰適合使用 API?
對象 | 典型使用情境 |
入門交易者 | 唯讀腳本,可將您的投資組合匯入試算表、將成交紀錄寫入檔案,或在機器人結束時發送 Telegram 提醒。 |
量化 / 演算法交易者 | 自訂策略、回測、造市機器人、統計套利。 |
開發者與金融科技團隊 | 將 Pionex 交易功能嵌入另一個產品、建立報稅工具,或將餘額同步到投資組合儀表板。 |
進階使用者 | 同時操作數十個網格機器人、批次取消訂單、執行排程的定期定額(DCA)任務。 |
您不需要是資深工程師。只要您能執行 Python 或 JavaScript 腳本,就能使用 Pionex API。最困難的概念 — 請求簽名 — 下方會以淺顯易懂的方式說明,並附上可直接複製使用的範例。
一眼速查
屬性 | 數值 |
REST 基礎網址(現貨 / 機器人 / Earn) | |
REST 基礎網址(合約) | |
WebSocket 公開串流 | |
身分驗證 | 每個私有請求都需使用 HMAC-SHA256 簽名 |
必要標頭 |
|
回應格式 | JSON 信封: |
速率限制 | 每個 IP 與每個帳戶每秒 10 次請求(依權重計算);超過時回傳 HTTP 429 |
使用費用 | 免費 — 您只需支付一般交易手續費 |
2. 您可以建構什麼
API 分為四大類端點。請挑選符合您目標的類別;您也可以自由混搭使用。
2.1 Trade API — 現貨交易
最核心的基本功能。使用您已持有的資金買賣加密貨幣。
查詢您所有的餘額
列出交易對及其規則(最小下單量、手續費率、小數精度)
下限價單與市價單
取消訂單、列出未成交訂單、查詢訂單歷史
取得您近期的成交紀錄(已執行的交易)
2.2 Bot API — 自動化策略
Bot API 對所有帳戶開放 — 無需申請。只要在您的 API 金鑰上啟用 Bot Reading / Bot Trading 權限即可。
Pionex 的招牌功能。以程式化方式啟動交易機器人,並調整它們。
現貨網格機器人 — 在價格區間內反覆低買高賣
合約網格機器人 — 同樣的概念,加上槓桿
AI 策略 — 讓 Pionex 為您建議網格參數
調整運行中機器人的獲利率或價格區間
依百分比減少持倉,或完全取消機器人
2.3 Futures API — 合約交易
帶槓桿的永續合約(最大槓桿倍數依交易對而定)。
透過 API 進行合約直接交易目前無法使用。此功能仍處於內部開發階段,尚未向任何帳戶開放 — 目前沒有任何申請、候補名單或搶先體驗流程。
開啟與平倉多頭與空頭持倉
設定槓桿與保證金模式(逐倉或全倉)
切換單向與雙向(Hedge)持倉模式
查看未實現損益、標記價格、強制平倉價
取得資金費率歷史紀錄
2.4 Earn API — 被動收益(測試版)
為想要收益而非主動交易的使用者所提供的低操作門檻產品。
瀏覽雙幣投資產品
查看目前的執行價、上漲 APY、下跌 APY
訂閱產品、列出進行中的投資、查看歷史紀錄
注意:Earn 端點處於測試版階段,可能並非所有地區都可使用。
3. 開始之前
您需要準備什麼
一個狀態良好的 Pionex 帳戶,若您所在的司法管轄區有此要求,需完成完整驗證。
已啟用雙重身分驗證 — 建立 API 金鑰時必須啟用。
開發環境 — 任何能發出 HTTPS 請求的工具皆可。Python 3.9+ 或 Node.js 18+ 是最友善的選擇,因為網路上幾乎所有範例都是用其中一種語言寫成的。
基本熟悉以下事項:
JSON(您應該看過
{ "key": "value" }這種格式)環境變數,或某種能將密鑰放在程式碼之外的方式
在終端機中執行腳本
您不需要準備什麼
伺服器。您可以直接在筆記型電腦上執行。
付費方案。API 完全免費。
密碼學學位。簽名邏輯大約只有十行程式碼。
心智模型:一個請求如何運作
每個經過驗證的呼叫都遵循相同的五步模式:
您建立一個請求網址,例如
GET /api/v1/account/balances?timestamp=...您從方法、路徑、排序後的查詢參數與請求主體組合出一段「標準訊息」字串。
您使用 API 密鑰,以 HMAC-SHA256 對該字串進行雜湊,這會產生一個簽名。
您發送請求時帶上兩個額外的標頭:
PIONEX-KEY與PIONEX-SIGNATURE。Pionex 在其伺服器端執行完全相同的雜湊運算並進行比對。如果一致,您就通過驗證了。
關鍵概念:簽名能證明您知道密鑰,但密鑰本身從未透過網路傳輸。
4. 建立您的第一支 API 金鑰
步驟 1 — 開啟 API 管理頁面
網頁版:登入後點選您的個人頭像,選擇 API 管理 — 或直接開啟 https://www.pionex.com/zh-tw/my-account/api。
手機 App:App 內沒有內建的 API 選單。請透過網頁開啟 API 管理 — 在手機瀏覽器中開啟 pionex.com,或點選 此處,即可在 App 內開啟該頁面(App 內建網頁檢視)。
在 API 管理頁面中,您也可以編輯既有金鑰的權限、標籤與 IP 白名單,或刪除(撤銷)金鑰。Secret 無法重新產生或重設 — 如果遺失,請刪除該金鑰並建立新的金鑰。
步驟 2 — 建立新的 API 金鑰
點選建立 API 金鑰。系統會要求您填寫:
標籤 — 取一個具體的名稱,例如
grid-bot-laptop或read-only-portfolio。當您之後擁有多支金鑰時,您會慶幸自己這麼做。權限 — 請見下一節。
IP 白名單 (選填,但強烈建議) — 限制金鑰只能從特定 IP 位址使用。您可以輸入多個 IP,以逗號分隔。
步驟 3 — 謹慎選擇權限
權限 | 允許的操作 | 建議 |
讀取 | 查看餘額、訂單、持倉、成交紀錄 | 請永遠啟用。任何實用功能都需要此權限。 |
交易(寫入) | 下單與取消訂單、建立 / 調整 / 關閉機器人 | 僅在您的腳本確實需要交易時才啟用。 |
Bot API 權限 | Bot API 金鑰有兩個獨立的開關:
| 無需另外申請存取權限 — 在金鑰上啟用您需要的開關即可 |
步驟 4 — 立即儲存密鑰
當您點選確認後,Pionex 會顯示兩串字串:
API Key(有時稱為
apiKey或PIONEX-KEY) — 半公開資訊,類似帳號Secret — 只會顯示一次,之後不會再出現。請像對待密碼一樣保護它。如果遺失,您必須刪除該金鑰並建立一支新的金鑰。
請將兩者複製到安全的地方。建議的做法是將它們設定為您 shell 設定檔中的環境變數,例如:
export PIONEX_KEY="paste_your_api_key_here"
export PIONEX_SECRET="paste_your_secret_here"
警告:絕對不要將金鑰貼到任何會推送到公開或共用儲存庫的原始碼中。
步驟 5 — 測試連線(不需要驗證)
在簽署任何請求之前,先確認網路是否正常:
curl "https://api.pionex.com/api/v1/common/symbols?symbol=BTC_USDT"
您應該會收到一段 JSON 信封,列出 BTC_USDT 的交易規則。如果這一步失敗,請先修正您的網路或防火牆設定,再繼續往下。如果連基礎都不通,驗證方面的問題會極其難以除錯。
5. 核心概念
5.1 基礎網址
用途 | 網址 |
現貨、機器人、Earn(REST) | |
合約(REST) | |
公開 WebSocket |
留意:合約的路徑前綴是 /uapi/v1,不是 /api/v1。把兩者搞混是第一天最常見的錯誤之一。
5.2 回應信封
Pionex 的每一個 JSON 回應都有這種外層結構:
Success: { "result": true, "data": { ... }, "timestamp": 1783990000000 }Error: { "result": false, "code": "APIKEY_LOST", "message": "Apikey lost", "timestamp": ... }code 與 message 只會在發生錯誤時出現,而且錯誤碼通常是字串(例如 APIKEY_LOST、BOT_INVALID_ARGUMENT)。請注意,錯誤 — 包括身分驗證失敗 — 通常會以 HTTP 200 搭配 result: false 的形式回傳,因此請務必檢查 result,而不是只看 HTTP 狀態。
某些帳戶層級的拒絕會使用不同的結構:數值型的 code、一個 reason 字串,且沒有 result 欄位。例如:
{ "code": 40300951, "reason": "P_TRADING_BOT_OPERATION_IS_FORBIDDEN", "message": "Operation is forbidden, banned for account frozen", "data": null }如果 result 為 false,或是缺少 result 但存在 code,請將該回應視為失敗。
提示:在讀取 data 之前,一律先檢查 result。即使是 HTTP 200 的回應,在發生業務邏輯錯誤(例如「餘額不足」)時,也可能出現 result: false。
5.3 交易對命名
市場 | 格式 | 範例 |
現貨 |
|
|
永續合約 |
|
|
請一律使用底線作為分隔字元,並使用大寫字母。
5.4 時間戳記
一律使用自 epoch 起算的毫秒數 — 不是秒。這是從 Unix 工具轉過來的人經常犯的錯誤。
放在查詢字串中,絕對不要放在請求主體中,即使是
POST請求也一樣。Pionex 容許 ±20 秒的時鐘誤差,但不能更多。如果您的機器時鐘不準,簽名就會失敗,並顯示「timestamp out of recv window」。若您看到此訊息,請同步您的系統時鐘。
5.5 狀態碼
代碼 | 意義 | 該怎麼做 |
200 | 成功(仍須檢查 | 繼續處理 |
400 | 參數錯誤 | 檢查拼字、型別與必填欄位 |
401 | 未經授權 | API 金鑰或簽名錯誤 |
403 | 禁止存取 | 重新檢查金鑰權限。合約直接交易未向任何帳戶開放 — 沒有可申請的合約存取權限。 |
429 | 觸發速率限制 | 請退避。請見「速率限制」章節。 |
500 | 伺服器錯誤 | 以指數退避重試 |
6. 驗證:請求簽名如何運作
這是最讓新手感到畏懼的章節,但其實不必如此。一旦您看過一個能運作的範例,其餘就都是機械式的步驟。
6.1 標準訊息
對於每一個需要驗證的請求,您都要建立一段字串:
{METHOD}{PATH}?{SORTED_QUERY}{BODY}規則:
METHOD為大寫:GET、POST、DELETE。PATH是 URL 路徑,包含開頭的斜線,例如/api/v1/account/balances。SORTED_QUERY是查詢字串,其參數依 key 的字母順序排序並經過 URL 編碼。BODY是POST請求的 JSON 請求主體,不能有任何空白字元。在 Python 中:json.dumps(separators=(',',':'))。在 JavaScript 中,JSON.stringify(obj)會產生相同的結果。任何值為
None或undefined的參數請完全捨棄。絕對不要送出key=None。即使是
POST,timestamp參數也要放在查詢字串中,而不是請求主體中。
6.2 範例:簽署一個查詢餘額的請求
請求:
GET /api/v1/account/balances?timestamp=1701234567890
您要簽名的標準訊息:
GET/api/v1/account/balances?timestamp=1701234567890
將該字串與您的密鑰餵入 HMAC-SHA256,取十六進位摘要,並放入 PIONEX-SIGNATURE 標頭中。
6.3 Python 參考實作
import hmac import hashlib import time import os from urllib.parse import urlencode import requests API_KEY = os.environ["PIONEX_KEY"] API_SECRET = os.environ["PIONEX_SECRET"] BASE_URL = "https://api.pionex.com" def sign_get(path, params=None): params = dict(params or {}) params["timestamp"] = int(time.time() * 1000) query = urlencode(sorted(params.items())) message = f"GET{path}?{query}" signature = hmac.new( API_SECRET.encode(), message.encode(), hashlib.sha256, ).hexdigest() headers = { "PIONEX-KEY": API_KEY, "PIONEX-SIGNATURE": signature, } return f"{BASE_URL}{path}?{query}", headers url, headers = sign_get("/api/v1/account/balances") response = requests.get(url, headers=headers).json() print(response)
6.4 JavaScript / Node.js 參考實作
import crypto from "node:crypto"; const API_KEY = process.env.PIONEX_KEY; const API_SECRET = process.env.PIONEX_SECRET; const BASE_URL = "https://api.pionex.com"; function signGet(path, params = {}) { const allParams = { ...params, timestamp: Date.now() }; const query = new URLSearchParams( Object.entries(allParams).sort(([a], [b]) => a.localeCompare(b)) ).toString(); const message = `GET${path}?${query}`; const signature = crypto .createHmac("sha256", API_SECRET) .update(message) .digest("hex"); return { url: `${BASE_URL}${path}?${query}`, headers: { "PIONEX-KEY": API_KEY, "PIONEX-SIGNATURE": signature, }, }; } const { url, headers } = signGet("/api/v1/account/balances"); const r = await fetch(url, { headers }); console.log(await r.json());
6.5 簽署 POST 請求
請求主體是標準訊息的一部分。請建立一次、簽名一次,然後將完全相同的位元組作為請求主體送出。
import json def sign_post(path, body): timestamp = int(time.time() * 1000) query = urlencode([("timestamp", timestamp)]) body_str = json.dumps(body, separators=(",", ":")) # no spaces message = f"POST{path}?{query}{body_str}" signature = hmac.new( API_SECRET.encode(), message.encode(), hashlib.sha256, ).hexdigest() return ( f"{BASE_URL}{path}?{query}", { "PIONEX-KEY": API_KEY, "PIONEX-SIGNATURE": signature, "Content-Type": "application/json", }, body_str, ) url, headers, body_str = sign_post( "/api/v1/trade/order", { "symbol": "BTC_USDT", "side": "BUY", "type": "LIMIT", "quantity": "0.001", "price": "30000.00", }, ) requests.post(url, headers=headers, data=body_str).json()陷阱:如果您讓 HTTP 程式庫重新序列化請求主體(例如使用 requests.post(json=...)),它可能會自行加入空白字元,導致您的簽名不一致。請務必送出您實際簽名過的同樣位元組(使用 data=body_str)。
7. 入門教學:讀取您的帳戶
目標:印出您的餘額,以及 BTC_USDT 的交易規則。約 15 分鐘。零風險 — 使用唯讀金鑰。
步驟 1 — 取得所有交易對(不需驗證)
import requests r = requests.get( "https://api.pionex.com/api/v1/common/symbols", params={"symbol": "BTC_USDT"}, ) print(r.json()["data"]["symbols"][0])您會學到 minQuantity、minAmount、baseScale 與 makerFeeRate — 這些都是在您真正下單之前需要的數值。
步驟 2 — 簽署您的第一個呼叫:帳戶餘額
使用第 6.3 節中的 sign_get 輔助函式:
url, headers = sign_get("/api/v1/account/balances") data = requests.get(url, headers=headers).json() for b in data["data"]["balances"]: if float(b["free"]) > 0 or float(b["locked"]) > 0: print(f"{b['coin']}: free={b['free']}, locked={b['locked']}")如果您看到 401 或 result: false,請回頭檢視驗證章節。如果您看到了真實的餘額,就代表您已通過驗證。
步驟 3 — 結合:以 USDT 計算的投資組合價值
您現在已具備計算「以 USDT 計價的投資組合總價值」所需的一切:
取得餘額。
對每個非零的幣種,從公開的 ticker 端點取得目前價格。
加總
(free + locked) * price。
這是一個完整、安全、唯讀的專案 — 非常適合作為第一個週末的練習。
8. 中階:下單與管理訂單
8.1 下限價單
url, headers, body = sign_post("/api/v1/trade/order", { "symbol": "BTC_USDT", "side": "BUY", "type": "LIMIT", "quantity": "0.001", "price": "30000.00", "clientOrderId": "my-order-001" }) print(requests.post(url, headers=headers, data=body).json())提示:如果您的程式碼可能會重試,請務必設定 clientOrderId。沒有它,重試可能會產生重複的訂單,讓您最終持有兩個未平倉的部位,而不是一個。
8.2 取消訂單
DELETE /api/v1/trade/order?symbol=BTC_USDT&orderId=123456789
簽名方式與 GET 完全相同(沒有請求主體)。
8.3 列出未成交訂單
GET /api/v1/trade/openOrders?symbol=BTC_USDT
8.4 走訪歷史訂單(分頁)
GET /api/v1/trade/allOrders?symbol=BTC_USDT&limit=100&fromId={lastSeenId}持續以您看到的最後一筆訂單的 fromId 呼叫,直到回傳的筆數少於 limit 為止。
8.5 在送出前驗證訂單
從 /common/symbols 您取得了這些欄位。請在用戶端使用它們來驗證:
quantity >= minQuantityquantity <= maxQuantityquantity * price >= minAmount(「最小名目價值」規則)將
quantity取至baseScale位小數,price取至quoteScale位小數
略過這些檢查,是導致訂單被拒絕、進而產生客服工單的第二大常見原因。
8.6 行情資料端點
全部為公開端點,無需簽名:
GET /api/v1/market/klines?symbol=BTC_USDT&interval=1M&limit=100— K 線GET /api/v1/market/tickers— 所有交易對的 24 小時統計GET /api/v1/market/bookTickers— 最優買賣價GET /api/v1/market/depth?symbol=BTC_USDT&limit=10— 訂單簿GET /api/v1/market/trades?symbol=BTC_USDT&limit=50— 最近成交
提示:這些端點同樣接受永續合約交易對(例如 BTC_USDT_PERP)。不存在可用的 /uapi/v1/market/... — 合約行情資料一律透過這些 /api/v1 端點取得。
合約行情資料(同樣為公開):
GET /api/v1/market/fundingRates?symbol=BTC_USDT_PERP&limit=500— 歷史資金費率。limit預設為 1,因此請自行設定。以endTime往更早的資料翻頁。GET /api/v1/market/indexes?symbol=BTC_USDT_PERP— 目前的指數價格、標記價格與下一次資金費率。GET /api/v1/market/indexKlines與GET /api/v1/market/markKlines— 指數與標記價格 K 線。僅提供最新的 K 線:這些端點接受endTime,但會忽略它。GET /api/v1/market/openInterests— 僅提供目前快照,所有交易對在同一個回應中。它不接受任何參數,並會忽略symbol。
限制與歷史深度。K 線、指數與標記價格 K 線,以及資金費率的 limit 上限皆為 500;若超過此值,會回傳 MARKET_PARAMETER_ERROR。BTC、ETH 與 SOL 的合約日 K 線可回溯至 2023 年初。日內 K 線最多約 10,000 根,以 1 小時 K 線計大約相當於 14 個月。資金費率可回溯至 2023 年初。
9. 進階主題
9.1 現貨網格機器人
網格機器人是一個參數化策略:選擇一個價格區間與網格線數量。每格獲利由這兩項設定決定。機器人在價格下跌時累積持倉、上漲時賣出,從價格震盪中獲利。
POST /api/v1/bot/orders/spotGrid/create{ "base": "BTC", "quote": "USDT", "buOrderData": { "top": "50000", "bottom": "40000", "row": 20, "gridType": "arithmetic", "quoteTotalInvestment": "1000" }}提示:請先以 POST /api/v1/bot/orders/spotGrid/checkParams 驗證(請求主體相同)— 它會回傳最小與最大投資額、建議滑點與預估手續費,且不會動用任何資金。
資金與風險。現貨網格從不借貸,因此您的最大虧損就是您投入的金額。只有兩個呼叫會為運行中的現貨網格增加資金:investIn,以及帶有 quoteInvest 的 adjustParams。借貸只存在於槓桿網格中,而槓桿網格屬於合約網格。現貨網格的回應會包含 loanAmount、interestAmount、liquidatePrice 與 leverage;在現貨網格上,這些值固定分別為 0、0、0 與 1。
機器人開始運行後,您可以:
POST /api/v1/bot/orders/spotGrid/adjustParams— 即時變更價格區間(top/bottom)或網格數量(row)POST /api/v1/bot/orders/spotGrid/investIn— 為運行中的機器人追加資金POST /api/v1/bot/orders/spotGrid/profit— 在不停止機器人的情況下提取已累積的獲利POST /api/v1/bot/orders/spotGrid/cancel— 停止機器人。請在此呼叫上設定closeSellModel(請見下方的關閉現貨網格)GET /api/v1/bot/orders/spotGrid/aiStrategy?base=BTC"e=USDT— 取得 AI 建議的參數(注意:是base與quote,不是symbol)
關閉現貨網格。取消呼叫上的 closeSellModel 決定機器人所持有的幣種如何處理:
NOT_SELL(預設) — 將幣種與計價幣按原樣退還。TO_QUOTE— 將幣種賣出換成計價幣。TO_USDT— 將幣種賣出換成 USDT。
請在取消呼叫上設定它。透過 API 取消時,您在建立時設定的 closeSellModel 不會被採用。如果取消呼叫中未帶入此參數,則適用 NOT_SELL。訂單的 closeSellModel 欄位在機器人運行期間顯示建立時的值,取消後則顯示實際套用的值。賣出的數量會向下捨入至該幣種的精度;任何剩餘部分會以幣種形式退還。
讀取已關閉的現貨網格。取消後,GET /api/v1/bot/orders/spotGrid/order 會回報退回的內容:
unlockUsdtAmount— 關閉時退還的計價幣:quoteAmountBeforeSell加上任何已賣出幣種的所得,再扣除交易手續費。baseAmount— 未經賣出而退還的幣種。profitWithdrawn— 機器人運行期間已透過spotGrid/profit提取的獲利。它不包含在unlockUsdtAmount之中。
機器人整個生命週期的淨結果:unlockUsdtAmount + profitWithdrawn + value of returned baseAmount − quoteTotalInvestment。totalFeeInQuote 與 totalFeeInBase 不包含開始時的買入與關閉時的賣出所產生的手續費。
9.2 合約網格機器人
形式與現貨網格相同,並加上 leverage 參數:
POST /api/v1/bot/orders/futuresGrid/create
{
"base": "BTC.PERP", // note the .PERP suffix on base
"quote": "USDT",
"buOrderData": {
"top": "65000", "bottom": "60000", "row": 10,
"gridType": "arithmetic",
"trend": "long", // REQUIRED: long | short | no_trend
"leverage": 2,
"quoteInvestment": "100"
}
}
提示:請先以 POST /api/v1/bot/orders/futuresGrid/checkParams 驗證(請求主體相同 — 這裡同樣必須帶入 trend)— 它會回傳最小 / 最大投資額、預估強制平倉價、保證金分配與手續費,且不會動用任何資金。
機器人開始運行後,您可以:
POST /api/v1/bot/orders/futuresGrid/adjustParams— 使用type=adjust_params時,可變更價格區間(top/bottom)或網格數量(row);使用type=invest_in時,可追加投資POST /api/v1/bot/orders/futuresGrid/reduce— 在機器人持續運行的同時平掉部分持倉(reduceNum是整數的網格線數量,不是幣種數量)POST /api/v1/bot/orders/futuresGrid/cancel— 停止機器人;選填的closeSellModel(TO_QUOTE或TO_USDT)決定持倉如何處理GET /api/v1/bot/orders/futuresGrid/order?buOrderId=...— 取得完整訂單詳情(狀態、損益、持倉、強制平倉價)
哪個帳戶為機器人提供資金:futuresGrid/create 會取用 quoteInvestment,其來源為您的主帳戶,而不是合約帳戶或交易帳戶。請先轉入主帳戶,否則請求會因 balance insufficient 而被拒絕。
checkParams 不是保證:通過檢核只代表您的設定格式正確,並不代表 create 一定會成功。請另外確認您的主帳戶餘額足以支付 quoteInvestment。
如果 adjustParams 被拒絕,請先查看 code(見常見問題)。您可能遇到的一種原因是機器人的未實現損益為負 — 網格往往正好在虧損時才需要調整區間。您可以在持倉獲利時重試、在 Pionex App 中修改區間,或在建立時啟用移動網格(Trailing Move)。
9.3 Smart Copy 機器人
API 提供的第三種機器人類型 — 由訊號驅動的合約持倉組合:
POST /api/v1/bot/orders/smartCopy/checkParams— 建立前驗證投資額與槓桿限制POST /api/v1/bot/orders/smartCopy/create— 注意此端點使用 snake_case 欄位(bu_order_data、quote_total_investment),且需要一個至少包含一項的portfolio陣列(base、signal_type、leverage)GET /api/v1/bot/orders/smartCopy/order?buOrderId=...— 完整訂單詳情,包含各項目的持倉POST /api/v1/bot/orders/smartCopy/cancel— 請求主體使用bu_order_id
相關:POST /api/v1/bot/signal/listener 會發送自訂交易訊號來驅動這些機器人 — 它需要帳戶啟用(請寄信至 service@pionex.com),以及您 API 金鑰上的「Enable Reading」權限。GET /api/v1/bot/kol/selectCopyTradeList?shareCode=... 會列出精選的 KOL 跟單策略。
訊號監聽器是為訊號提供者而設計的。它會將訊號推送到 Pionex 訊號平台,再由該平台轉發給訂閱了該 signalType(您訊號的 UUID)的每一個 Smart Copy 機器人。
在 data 中:action 為 buy 代表開倉,為 sell 代表平倉。position_size 是以比例表示的目標持倉:"1" 代表 100%,"0" 則代表平倉。contracts 是合約數量。
9.4 合約直接交易
請注意 /uapi/v1 路徑前綴:
GET /uapi/v1/account/balances
GET /uapi/v1/account/positions
GET /uapi/v1/account/detail
GET /uapi/v1/account/leverage?symbol=BTC_USDT_PERP
GET /uapi/v1/trade/openOrders
GET /uapi/v1/trade/fills?symbol=BTC_USDT_PERP
GET /uapi/v1/trade/fundingFee?symbol=BTC_USDT_PERP
GET /uapi/v1/trade/isolatedMode?symbol=BTC_USDT_PERP
注意:上述所有 GET(讀取)端點,目前任何 API 金鑰皆可使用。寫入操作(合約下單、變更槓桿 / 保證金模式)在合約直接交易仍在開發期間受到限制。
9.5 Earn — 雙幣投資(測試版)
GET /api/v1/earn/dual/openProducts?symbol=BTC POST /api/v1/earn/dual/invests { "productId": "...", "amount": "0.5" } GET /api/v1/earn/dual/balances訂閱前請先閱讀執行價、上漲 APY 與下跌 APY。資金會在產品期間內被鎖定。
9.6 WebSocket 基本介紹
wss://ws.pionex.com/wsPub
兩種頻道類別:
公開(不需身分驗證) — ticker、kline、depth、trade
私有(需身分驗證) — 餘額更新、訂單更新、持倉更新
以 JSON 訊息進行訂閱:
{ "op": "SUBSCRIBE", "topic": "TRADE", "symbol": "BTC_USDT" }重要:WebSocket 連線會中斷。請將您的用戶端包裝在「重連 + 退避」的迴圈中,並在重連時重新訂閱所有主題。
10. 速率限制與可靠性
10.1 您會收到什麼回應
Pionex 不會回傳 X-RateLimit-* 標頭。限制為每個 IP 每秒 10 次請求,以及每個帳戶(私有端點)每秒 10 次請求,且每個端點會依其權重消耗該額度。超過限制會回傳 HTTP 429 — 請先退避再重試。
10.2 如何保持安全
不要全速輪詢。每 200 毫秒呼叫一次
GET /openOrders是不必要的;對大多數策略而言,每秒一次就綽綽有餘。以 WebSocket 接收由變動驅動的資料。不要為了取得價格 tick 而輪詢 — 直接訂閱即可。
對 429 與 5xx 回應實作指數退避:
import time, random def with_backoff(fn, max_attempts=6): for i in range(max_attempts): r = fn() if r.status_code not in (429, 500, 502, 503): return r sleep = (2 ** i) + random.random() time.sleep(sleep) raise RuntimeError("max retries exceeded")可以批次就批次。需要查詢 50 筆訂單的狀態嗎?以較大的
limit呼叫一次GET /trade/allOrders,而不是 50 次個別查詢。
11. 常見問題
開始上手
問:我需要申請 API 權限嗎?
答:不需要 — 現貨、Earn 與 Bot API,建立金鑰即可開始;Bot API 只需在金鑰上啟用 Bot Reading / Bot Trading 權限。合約直接交易不向任何帳戶開放,也沒有申請或候補名單,但合約的讀取類端點任何 API 金鑰皆可使用。Earn 端點處於測試版,可能並非每個地區都已啟用。
問:API 是免費的嗎?
答:是的。您只需支付一般交易手續費(費率與網站上相同)。
問:我可以從瀏覽器使用嗎?
答:可以,但要小心。瀏覽器無法保管密鑰 — 任何人檢視您的頁面都能讀到。請將簽名邏輯放在您控制的後端,或僅使用唯讀金鑰並嚴格設定 IP 與 origin 限制,且絕對不要將具有交易權限的金鑰部署到用戶端。
問:哪一種程式語言最好?
答:Python 和 JavaScript 擁有最多範例。任何能進行 HTTPS 加上 HMAC-SHA256 的語言都可以:Go、Rust、Java、C#、PHP、Ruby。簽名邏輯在其中任何一種語言裡都約十行。
問:我可以使用 Pionex API 連接外部平台嗎?
答:可以 — 它是標準的 REST/WebSocket API,因此任何能發出已簽名 HTTPS 請求的工具都能與之溝通,包括您自己的腳本、伺服器與第三方工具。至於某個特定的第三方平台是否可用,取決於該平台是否已在其端建置 Pionex 支援 — API 本身不限制誰可以呼叫它,但雙方必須使用相同的整合方式。請查閱該平台自己的文件,確認它是否列出 Pionex,以及它預期您使用哪一種整合方式。在 Pionex 這一端,支援的對接點為本指南中的 Trade/Bot/Wallet/Earn 端點,以及用於 TradingView webhook 的 Signal Bot。
問:我可以將 Pionex API 連接到 Bybit 或 Binance 等其他加密貨幣交易所嗎?
答:不可以。Pionex API 並非用於連接 Bybit、Binance 等其他加密貨幣交易所。它僅設計用於與您自己的 Pionex 帳戶互動 — 下單 / 管理您自己的訂單、機器人和持倉 — 而不用於在其他交易所帳戶之間進行橋接、鏡像或套利交易。
身分驗證
問:我的簽名一直顯示無效。該從哪裡開始檢查?
答:請依序檢查五件事:
查詢參數是否依字母順序排序?
timestamp是否放在查詢字串中,而非請求主體中?您簽名的請求主體是否與您送出的請求主體完全一致(沒有多餘的空白字元)?
您的機器時鐘是否在真實時間的幾秒之內?
PIONEX-KEY與PIONEX-SIGNATURE標頭是否都存在,且沒有互換?
問:為什麼 POST 請求的 timestamp 也要放在查詢字串中?
答:這是 Pionex 定義標準訊息規則的方式。這是慣例,沒有商量餘地。如果您把它放進請求主體中,簽名就會不一致。
問:我可以在不停機的情況下輪換金鑰嗎?
答:可以 — 建立一支新金鑰、將它部署到您的程式碼中,然後撤銷舊金鑰。兩支金鑰在重疊期間都會同時有效。
問:我可以擁有多支金鑰嗎?
答:可以。建議為每個用途各建立一支金鑰(bot-prod、dashboard-readonly、dev-laptop)。出狀況時,這能讓撤銷精準無誤。
交易
問:quantity 與 amount 有什麼差別?
答:quantity 是基礎幣的數量(例如 0.5 BTC)。amount 是計價幣的價值(例如 25,000 USDT)。/common/symbols 中的 minQuantity 與 minAmount 會同時強制這兩者:訂單必須同時滿足這兩項。
問:我的訂單一直因為「最小名目價值」而被拒絕。
答:quantity * price 必須至少等於 minAmount。以 30,000 美元的價格下 0.0001 BTC 的訂單,名目價值為 3 美元,通常低於一般 10 美元的最小值。
問:我該如何讓下單具備冪等性?
答:將 clientOrderId 設為唯一值(例如 UUID)。如果您以相同的 clientOrderId 重試,Pionex 不會重複建單。
問:限價單可能部分成交嗎?
答:可以。請觀察 filledQuantity 與 status(PARTIALLY_FILLED)。使用 WebSocket 訂單更新頻道取得即時狀態。
問:有測試或沙盒端點嗎?
答:Pionex 目前沒有公開的沙盒環境。標準做法是:先以唯讀金鑰開發,然後在低成交量的交易對上,以 quantity = minQuantity 下微小的真實訂單做為煙霧測試。
機器人
問:我可以建立與 App 裡相同的所有機器人類型嗎?
答:API 恰好開放三種機器人類型:現貨網格、合約網格與 Smart Copy。App 中其他所有機器人類型(Martingale、DCA、Rebalancing、Infinity Grid、TWAP、套利、智慧交易)僅限 UI 使用,沒有 API 端點。
GET /api/v1/bot/orders 只會回傳 API 支援的機器人類型。它們的 buOrderType 值為 spot_grid、futures_grid、future_hedge_grid(全倉合約網格)與 smart_copy。其他類型的機器人不會被回傳,即使它們正在您的帳戶上運行。若將不支援的類型作為篩選條件傳入,會回傳 BOT_INVALID_ARGUMENT。
槓桿網格屬於合約網格,會以 futures_grid 回傳。
簡易合約沒有機器人端點。其持有資產僅會出現在 GET /api/v1/wallet/balancesFull 中,位於 botAccount.detail[] 之下,且帶有 type: "futures_lite"。每筆項目包含 buOrderId、baseList、investmentAmount 與 profit。無法取得狀態、訂單或持倉的詳細資訊。
問:我可以調整運行中的機器人嗎?
答:可以。adjustParams 讓您能夠在不取消的情況下變更價格區間(top/bottom)與網格數量(row),或追加投資。在現貨網格上,您還可以使用 investIn(追加資金)與 profit(提取獲利);在合約網格上,您可以 reduce 持倉。沒有獲利率參數 — 每格獲利由區間與網格數量決定。
問:我收到 BOT_INTERNAL_ERROR,但看不出原因。
答:請查看 code 欄位。它現在會告訴您屬於以下兩種情況中的哪一種。
code | 含義 | 該怎麼做 |
| 您的請求被拒絕。 | 修正 |
| 我們這邊發生故障。 | 請退避重試。若持續發生,請聯繫客服並提供您的時間戳記。 |
futuresGrid/create 被拒絕的常見原因,是您主帳戶中的計價幣不足。建立機器人會從您的主帳戶扣款,而不是從合約帳戶或交易帳戶。
如果 BOT_INTERNAL_ERROR 出現在 message 本應說明原因的情況下,請將您的時間戳記提供給客服。
問:reduce 與 cancel 有什麼不同?
答:reduce 會平掉一定百分比的持倉,但機器人會繼續運行。cancel 則會完全停止機器人。
問:aiStrategy 端點實際上在做什麼?
答:它會根據近期波動性,為某個交易對回傳 Pionex 建議的網格參數。請把它當作起點,而非鐵律 — 部署資金前請先自行檢視。
合約
問:如何取得 Futures API 的存取權限?
答:Futures API 直接交易不向任何帳戶開放。它仍在內部開發中,且沒有申請、候補名單或搶先體驗流程 — 無法申請存取權限。
問:透過 API 下合約單時出現「TRADE_TYPE_DENIED: user denied, not in whitelist」,是什麼原因?
答:透過 API 直接進行合約交易(合約下單、變更槓桿或保證金模式)目前尚未向任何帳戶開放。此功能仍在內部開發中,也沒有申請、候補名單或搶先體驗的管道,因此錯誤訊息中的「whitelist」並不代表可以申請開通。目前也沒有公布開放時間。合約的讀取類端點則任何 API 金鑰皆可使用。若想自動化合約交易,目前可以透過 Bot API 建立和管理合約網格機器人,或使用 Signal Bot 以 TradingView webhook 等外部訊號觸發交易。
問:逐倉與全倉保證金有什麼差別?
答:
逐倉 — 只有您分配給該持倉的保證金可能虧損。
全倉 — 您整個合約錢包都會作為該持倉的擔保。對學習者而言,逐倉較為安全。
單向與雙向(Hedge)持倉模式?
答:
單向 — 每個交易對只有一個持倉;開反向倉位會減倉或平倉。雙向(Hedge) — 多空可同時並存。大多數交易者應該從單向開始。
問:資金費率如何顯示?
答:週期性結算(通常每八小時一次,但請查驗該交易對)。使用 GET /uapi/v1/trade/fundingFee 取得歷史紀錄。
Earn
問:雙幣投資有保本嗎?
答:沒有。它們在收益上有「下跌 APY」作為下限,但本金本身是有風險的。訂閱前請閱讀每個產品的詳細說明。
問:我可以提前取消雙幣投資嗎?
答:通常不行。資金會在產品期間內鎖定。請據此規劃您的流動性。
操作面
問:我該規劃什麼樣的速率限制?
答:請以每個 IP 與每個帳戶每秒 10 次請求來規劃(Pionex 不會回傳 X-RateLimit-* 標頭)。一個保守的起點是:每類端點每秒不超過五次請求,並在收到 429 回應時採用指數退避。
問:我該如何處理 5xx 錯誤?
答:用指數退避加上抖動進行重試。關鍵在於,在重試 POST 之前,先查詢狀態以確認先前的請求是否實際成功 — 伺服器錯誤並不總是代表該動作失敗了。
問:我的 WebSocket 一直斷線。是哪裡出了問題嗎?
答:這在網路層級是正常的。請實作:每 30 秒 ping 一次、以退避方式自動重連,並在重連時重新訂閱所有主題。
問:我該如何訂閱多個交易對?
答:傳送多則訂閱訊息,或使用該頻道支援的批次訂閱形式。每個主題彼此獨立。
安全性
問:我認為我的密鑰外洩了。我該怎麼做?
答:
開啟 API 管理頁面並立即撤銷該金鑰。
稽核近期活動(訂單,若已啟用則包含提幣)。
以新的標籤建立新的金鑰。
在您的程式碼庫與 commit 歷史中搜尋外洩的密鑰,並輪換所有相關憑證。
問:我應該把金鑰或密鑰提交到 git 嗎?
答:絕對不要。請使用環境變數、.env 檔案(放入 .gitignore)或密鑰管理工具。如果不小心提交了,請立即輪換金鑰 — git 歷史是永久的。
問:我可以啟用儲值 / 提幣權限嗎?
答:API 管理中沒有儲值或提幣功能。目前,API 端點僅可用於交易與機器人。
問:我可以用 IP 來限制金鑰嗎?
答:可以 — 強烈建議對任何擁有交易權限的金鑰這麼做。請設定您伺服器或工作站的 IP 位址。
問:Pionex 看得到我的密鑰嗎?
答:Pionex 儲存的是單向雜湊值,而非明文。他們以與您產生簽名相同的方式,用它來驗證您的簽名。這就是為什麼他們只能向您顯示一次密鑰。
12. 故障排除速查表
症狀 | 最可能的原因 | 解決方式 |
每個請求都收到 401 | 金鑰錯誤或簽名不一致 | 重新檢查排序順序、請求主體位元組、標頭 |
只有 | 請求主體在簽名後被重新序列化 | 將您簽名過的完全相同字串作為請求主體送出 |
| 時鐘漂移 | 同步您的系統時間 |
403 | 權限未授予 | 重新檢查金鑰權限。合約直接交易未向任何帳戶開放。 |
429 | 觸發速率限制(自最後一次請求起最長 24 小時) | 加入退避;降低輪詢頻率 |
訂單被拒絕 — 最小名目價值 |
| 提高下單量 |
訂單被拒絕 — 精度錯誤 | 小數位過多 | 取至 |
機器人無法啟動 — |
| 修正 |
機器人無法啟動 — | 我們這邊的故障 | 退避後重試;若持續發生,請聯繫客服 |
機器人無法啟動 — | 帳戶受到限制 | 請聯繫客服。重試無濟於事 |
WebSocket 斷線 | 正常現象,或防火牆閒置逾時 | 以退避方式重連;每 30 秒 ping 一次 |
在 curl 中簽名正常,在程式碼中卻不行 | 程式庫自動編碼了請求主體 | 送出原始的已簽名位元組 |
13. 安全最佳實踐
每個用途使用一支金鑰。更容易撤銷,也更容易稽核。
最小權限原則。預設為唯讀;僅在需要時才啟用交易權限。
對任何能動用資金或下單的金鑰設定 IP 白名單。
絕不記錄密鑰。從請求記錄中移除驗證標頭。
絕不在用戶端程式碼放入密鑰。瀏覽器、行動應用程式 — 請假設任何送到使用者裝置上的程式碼都是公開可讀的。
定期輪換。每 90 天是合理的頻率;一有懷疑就立即輪換。
監控用量。Pionex 會顯示 API 金鑰的用量統計 — 請每週檢視一次。
檢查程式碼中是否有不慎提交的內容。
git-secrets、trufflehog或 GitHub 密鑰掃描等工具能及早發現外洩。在正式環境使用密鑰管理工具:AWS Secrets Manager、HashiCorp Vault、1Password CLI、Doppler — 任何方式都比把明文放在磁碟上好。
以小額帳戶測試。不要在第一天就把全新的交易機器人對準您的主要帳戶。
14. 詞彙表
術語 | 定義 |
API key / Secret | 您 API 的使用者名稱與密碼組合。密鑰用來簽署請求;key 用來識別您的身分。 |
HMAC-SHA256 | 一種帶密鑰的雜湊函數。相同的輸入加上相同的密鑰會產生相同的輸出,但您無法從輸出推回密鑰。 |
標準訊息(Canonical message) | 您與 Pionex 雙方用來進行雜湊以比對簽名的同一段確切字串。 |
計價幣(Quote currency) | 交易對中的第二個資產( |
基礎幣(Base currency) | 交易對中的第一個資產( |
名目價值(Notional) |
|
Maker / Taker | Maker 提供流動性(您的訂單掛在訂單簿上)。Taker 移除流動性(您的訂單與既有訂單撮合成交)。 |
標記價格(Mark price) | Pionex 用於合約的參考價格,用於計算強制平倉與未實現損益。 |
資金費率(Funding fee) | 永續合約多空雙方之間的週期性款項。 |
強制平倉價(Liquidation price) | 槓桿持倉被強制平倉的價格。 |
冪等(Idempotent) | 一個可安全重試的操作 — 相同輸入產生相同效果。使用 |
速率限制(Rate limit) | 在被節流前,每個時間窗口內可發出的最大請求數。 |
WebSocket | 一條持久、雙向的連線 — 非常適合推播通知。 |
執行價(Strike price,Earn) | 在到期時決定採用上漲或下跌 APY 的價格門檻。 |
15. 接下來去哪裡
建議的學習路徑:
建立第 7 節中的唯讀投資組合腳本。
以
clientOrderId重試機制,下您的第一張 10 美元限價單。啟動一個迷你現貨網格機器人(投入 50 美元、價格區間窄),並觀察一週。
加上 WebSocket 私有頻道,在成交發生時即時記錄。
在您已操作現貨機器人至少一個月之後,再轉往合約。
官方 Pionex 文件包含最新的端點清單與任何測試版公告:https://www.pionex.com/docs/。
如果您對 API 還有其他疑問,我們誠摯邀請您加入 Telegram 群組,以獲得更好的協助:https://t.me/pionexapi
最後一個小提示:當您撞牆時,最有用的除錯步驟幾乎總是把您的標準訊息字串與簽名,跟一個能正常運作的 curl 範例並排印出來,找出哪一個字元不一樣。那一個字元幾乎一定就是 bug 所在。
API 對合約交易與交易機器人有哪些限制?
Pionex 提供的 API 旨在方便交易活動,但在合約交易與交易機器人的使用上有特定限制。以下是這些限制的詳細說明:
現貨 API(手動交易)
API 目前僅支援現貨交易。這表示使用者可以透過 API 對現貨市場中可交易的資產執行交易。現貨交易是指以當前市價即時交換資產。
合約 API(手動交易)排除事項
合約 API 直接交易不可用 — 它仍在內部開發中,尚未向任何帳戶開放。沒有申請或候補名單流程。可用的替代方案:
Bot API:包含支援建立與關閉合約網格機器人,可作為自動化合約策略的暫時性解決方案。
Signal Bot:您也可以使用 Signal Bot,根據外部觸發條件或自訂訊號執行交易。
祝您開發順利。