skills/okx-cex-portfolio/SKILL.md
This skill should be used when the user asks about 'account balance', 'how much USDT do I have', 'my funding account', 'show my positions', 'open positions', 'position P&L', 'unrealized PnL', 'closed positions', 'position history', 'realized PnL', 'account bills', 'transaction history', 'trading fees', 'fee tier', 'account config', 'max order size', 'how much can I buy', 'withdrawable amount', 'transfer funds', 'move USDT to trading account', or 'switch position mode'. Also use for '总资产', 'full balance', 'all assets', 'total holdings', 'net worth', 'how much do I have in total', 'show all my balances', 'all account balances', 'asset overview'. Requires API credentials. Do NOT use for market prices (use okx-cex-market), placing/cancelling orders (use okx-cex-trade), or grid/DCA bots (use okx-cex-bot).
npx skillsauth add okx/agent-skills okx-cex-portfolioInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Account balance, positions, P&L, bills, fees, and fund transfers on OKX exchange. Requires API credentials.
Before running any command, follow ../_shared/preflight.md.
Use metadata.version from this file's frontmatter as the reference for Step 2.
okx CLI:
npm install -g @okx_ai/okx-trade-cli
okx config init # select site -> follow browser OAuth flow
okx --demo account balance
Security: NEVER accept credentials in chat. Guide users to
okx config initfor setup.
Run this check before any authenticated command. The auth method is detected during preflight Step 2 and remembered for the session.
Check both sources (see preflight Step 2 for the decision table). okx auth status --json alone is insufficient — its apiKey field is always false and does NOT reflect the TOML config.
okx config show --json # authoritative for API-key presence
okx auth status --json # authoritative for OAuth session state
Branch in this order — first match wins:
config show has any profile with a non-empty api_key — API Key mode. Proceed to Step B.auth status returns "status": "logged_in" — OAuth mode. Proceed to Step B.auth status returns "status": "pending" — login in progress, wait.auth status returns "status": "not_logged_in" — stop all operations, load okx-cex-auth skill and follow login steps, wait for completion.Resolution rules:
"Live (实盘) or Demo (模拟盘)?" — wait for answer before proceedingHow to apply the mode depends on auth method (detected in Step A):
| Auth method | Live (实盘) | Demo (模拟盘) |
|---|---|---|
| API Key | --profile <live-profile> | --profile <demo-profile> |
| OAuth | (no flag needed, live is default) | --demo |
okx config show --json to discover available profile names and their demo settings. Use --profile <name> to select the correct one.--demo for simulated trading. Do not use --profile to switch modes.Authentication error (error contains "401", "Session expired", or "Run okx auth login first"):
okx-cex-auth skill and follow the re-authentication steps| Mode | Funds | API Key param | OAuth param |
|---|---|---|---|
| 实盘 (live) | Real funds | --profile <live-profile> | (default, no flag) |
| 模拟盘 (demo) | Simulated funds | --profile <demo-profile> | --demo |
# API Key user
okx --profile okx-prod account balance # 实盘
okx --profile okx-demo account balance # 模拟盘
# OAuth user
okx account balance # 实盘 (default)
okx --demo account balance # 模拟盘
Rules:
transfer, set-position-mode): mode must be confirmed before execution (see "Credential & Profile Check" Step B); transfer especially — wrong mode means wrong account[mode: live] or [mode: demo]okx-cex-marketokx-cex-portfolio (this skill)okx-cex-tradeokx-cex-bot# Trading account balance (all currencies with balance > 0)
okx account balance
# Check USDT balance only
okx account balance USDT
# Funding account balance
okx account asset-balance
# All open positions
okx account positions
# Closed position history with realized PnL
okx account positions-history
# Recent account bills (last 100)
okx account bills
# My trading fee tier
okx account fees --instType SPOT
# Transfer 100 USDT from funding (6) to trading (18)
okx account transfer --ccy USDT --amt 100 --from 6 --to 18
| # | Command | Type | Description |
|---|---|---|---|
| 1 | okx account balance [ccy] | READ | Trading account equity, available, frozen |
| 2a | okx account asset-balance [ccy] | READ | Funding account balance (per-currency list) |
| 2b | okx account asset-balance [ccy] --valuation [--valuationCcy <ccy>] | READ | Same + total asset valuation across trading/funding/earn; denomination defaults to USDT, override with --valuationCcy BTC |
| 3 | okx account positions | READ | Open contract/swap positions |
| 4 | okx account positions-history | READ | Closed positions + realized PnL |
| 5 | okx account bills | READ | Account ledger (deposits, withdrawals, trades) |
| 6 | okx account fees --instType <type> | READ | My trading fee tier (maker/taker) |
| 7 | okx account config | READ | Account level, position mode, UID |
| 8 | okx account max-size --instId <id> --tdMode <mode> | READ | Max buy/sell size at current price |
| 9 | okx account max-avail-size --instId <id> --tdMode <mode> | READ | Available size for next order |
| 10 | okx account max-withdrawal [ccy] | READ | Max withdrawable per currency |
| # | Command | Type | Description |
|---|---|---|---|
| 11 | okx account set-position-mode <mode> | WRITE | Switch net/hedge position mode |
| 12 | okx account transfer | WRITE | Transfer funds between accounts |
User: "I want to buy 0.1 BTC — do I have enough USDT?"
1. okx-cex-portfolio okx account asset-balance --valuation → total assets in USDT (trading/funding/earn breakdown)
→ check details.trading (available in trading account)
→ if trading balance < needed: check details.funding — may need to transfer
2. okx-cex-market okx market ticker BTC-USDT → check current price
↓ user approves
3. okx-cex-trade okx spot place --instId BTC-USDT --side buy --ordType market --sz 0.1
User: "I want to start a BTC grid bot with 1000 USDT"
1. okx-cex-portfolio okx account asset-balance --valuation → total assets in USDT (trading/funding/earn breakdown)
→ check details.trading ≥ 1000 (funds must be in trading account for grid bot)
→ if details.funding has the USDT instead: use account transfer first
2. okx-cex-market okx market candles BTC-USDT --bar 4H --limit 50 → determine price range
↓ user approves
3. okx-cex-bot okx bot grid create --instId BTC-USDT --algoOrdType grid \
--minPx 90000 --maxPx 100000 --gridNum 10 --quoteSz 1000
User: "Show me my current positions and how they're performing"
1. okx-cex-portfolio okx account positions → open positions with UPL
2. okx-cex-portfolio okx account positions-history → recently closed positions
3. okx-cex-market okx market ticker BTC-USDT-SWAP → check current price vs entry
User: "Move 500 USDT from my funding account to trade BTC"
1. okx-cex-portfolio okx account asset-balance USDT → confirm funding balance ≥ 500
↓ user approves
2. okx-cex-portfolio okx account transfer --ccy USDT --amt 500 --from 6 --to 18
3. okx-cex-portfolio okx account balance USDT → confirm trading balance updated
↓ ready to trade
4. okx-cex-trade okx spot place ...
User: "How much BTC can I buy with cross margin?"
1. okx-cex-portfolio okx account balance → total equity
2. okx-cex-portfolio okx account max-size --instId BTC-USDT-SWAP --tdMode cross → max buy/sell size
3. okx-cex-market okx market ticker BTC-USDT-SWAP → current price reference
Before any authenticated command: see Credential & Profile Check. Determine auth method and trading mode before executing.
After every command result: append [mode: live] or [mode: demo] to the response
okx account balance (trading equity only) or okx account asset-balance (funding balances) or okx account asset-balance --valuation (total across all accounts in USDT)okx account positionsokx account positions-historyokx account billsokx account feesokx account configokx account max-size or okx account max-avail-sizeokx account max-withdrawalokx account transferokx account set-position-modeRead commands (1–10): run immediately, no confirmation needed.
ccy filter: use currency symbol like USDT, BTC, ETH--instType for fees/positions: SPOT, SWAP, FUTURES, OPTION--archive for bills: access older records beyond the default window--tdMode for max-size: cash (spot), cross, or isolatedWrite commands (11–12): confirm once before executing.
set-position-mode: confirm mode (net = one-directional, long_short_mode = hedge mode); switching may affect open positionstransfer: confirm --ccy, --amt, --from, --to (account types: 6=funding, 18=trading); verify source balance firstset-position-mode: run okx account config to confirm posMode updatedtransfer: run okx account balance and okx account asset-balance to confirm balances updatedokx account balance [ccy] [--json]
| Param | Required | Default | Description |
|---|---|---|---|
| ccy | No | - | Filter to a single currency (e.g., USDT) |
Returns table: currency, equity, available, frozen. Only shows currencies with balance > 0.
okx account asset-balance [ccy] [--valuation] [--valuationCcy <ccy>] [--json]
| Param | Required | Default | Description |
|---|---|---|---|
| ccy | No | - | Filter to a specific currency (e.g., USDT); does not affect valuation denomination |
| --valuation | No | false | Also show total asset valuation across all account types (trading/funding/earn) |
| --valuationCcy | No | USDT | Currency in which to denominate the total asset valuation (e.g., USDT, BTC). Only used when --valuation is set. |
Returns: ccy, bal, availBal, frozenBal. Only shows currencies with balance > 0.
With --valuation: additionally prints a valuation summary table with totalBal and per-account-type breakdown (classic/earn/funding/trading). The numbers are denominated in --valuationCcy (default USDT).
Important: ccy (balance filter) and --valuationCcy (valuation denomination) are independent parameters — ccy=BTC filters the balance list to BTC rows but does NOT change the valuation currency; set --valuationCcy BTC explicitly for BTC-denominated totals.
okx account positions [--instType <type>] [--instId <id>] [--json]
| Param | Required | Default | Description |
|---|---|---|---|
| --instType | No | - | Filter: SWAP, FUTURES, OPTION |
| --instId | No | - | Filter to specific instrument |
Returns: instId, instType, side (posSide), pos, avgPx, upl (unrealized PnL), lever. Only shows positions with size ≠ 0.
okx account positions-history [--instType <type>] [--instId <id>] [--limit <n>] [--json]
Returns: instId, direction, openAvgPx, closeAvgPx, realizedPnl, uTime.
okx account bills [--archive] [--instType <type>] [--ccy <ccy>] [--limit <n>] [--json]
| Param | Required | Default | Description |
|---|---|---|---|
| --archive | No | false | Access older records (archive endpoint) |
| --instType | No | - | Filter by instrument type |
| --ccy | No | - | Filter by currency |
| --limit | No | 100 | Number of records |
Returns: billId, instId, type, ccy, balChg, bal, ts.
okx account fees --instType <type> [--instId <id>] [--json]
| Param | Required | Default | Description |
|---|---|---|---|
| --instType | Yes | - | SPOT, SWAP, FUTURES, OPTION |
| --instId | No | - | Specific instrument (optional) |
Returns: level, maker, taker, makerU, takerU, ts.
okx account config [--json]
Returns: uid, acctLv (account level), posMode (net/long_short_mode), autoLoan, greeksType, level, levelTmp.
okx account max-size --instId <id> --tdMode <mode> [--px <price>] [--json]
| Param | Required | Default | Description |
|---|---|---|---|
| --instId | Yes | - | Instrument ID |
| --tdMode | Yes | - | cash (spot), cross, or isolated |
| --px | No | - | Reference price (uses mark price if omitted) |
Returns: instId, maxBuy, maxSell.
okx account max-avail-size --instId <id> --tdMode <mode> [--json]
Returns: instId, availBuy, availSell — the immediately available size for the next order.
okx account max-withdrawal [ccy] [--json]
Returns table: ccy, maxWd, maxWdEx (with borrowing). Shows all currencies if no filter.
okx account set-position-mode <net|long_short_mode> [--json]
| Value | Behavior |
|---|---|
| net | One-directional (default) — long and short net out |
| long_short_mode | Hedge mode — long and short can coexist |
Warning: Switching modes when positions are open may cause unexpected behavior. Check
okx account positionsfirst.
okx account transfer --ccy <ccy> --amt <n> --from <acctType> --to <acctType> \
[--transferType <type>] [--subAcct <name>] [--json]
| Param | Required | Default | Description |
|---|---|---|---|
| --ccy | Yes | - | Currency to transfer (e.g., USDT) |
| --amt | Yes | - | Amount to transfer |
| --from | Yes | - | Source account type: 6=funding, 18=trading |
| --to | Yes | - | Destination account type: 6=funding, 18=trading |
| --transferType | No | 0 | 0=within account, 1=to sub-account, 2=from sub-account |
| --subAcct | No | - | Sub-account name (required for sub-account transfers) |
Returns: transId, ccy, amt.
| Tool | Description |
|---|---|
| account_get_balance | Trading account balance |
| account_get_asset_balance | Funding account balance. Use showValuation=true to include total asset valuation across trading/funding/earn accounts. Use valuationCcy (default "USDT") to set the denomination for the valuation total — e.g. valuationCcy="BTC" returns the total in BTC. |
| account_get_positions | Open positions |
| account_get_positions_history | Closed position history |
| account_get_bills | Account bills (recent) |
| account_get_bills_archive | Account bills (archive) |
| account_get_trade_fee | Trading fee tier |
| account_get_config | Account configuration |
| account_get_max_size | Max order size |
| account_get_max_avail_size | Max available size |
| account_get_max_withdrawal | Max withdrawable |
| account_set_position_mode | Set position mode |
| account_transfer | Transfer between accounts |
"How much USDT do I have?"
okx account balance USDT
# → currency: USDT | equity: 5000.00 | available: 4500.00 | frozen: 500.00
"Show all my open positions"
okx account positions
# → table: instId, instType, side, pos, avgPx, upl, lever
"What's my trading history and realized PnL?"
okx account positions-history
# → table: instId, direction, openAvgPx, closeAvgPx, realizedPnl, uTime
"Show my recent account activity"
okx account bills --limit 20
# → table: billId, instId, type, ccy, balChg, bal, ts
"What are my trading fees for SWAP?"
okx account fees --instType SWAP
# → level: VIP1 | maker: -0.0001 | taker: 0.0005
"How much BTC can I buy in cross margin?"
okx account max-size --instId BTC-USDT-SWAP --tdMode cross
# → instId: BTC-USDT-SWAP | maxBuy: 12.5 | maxSell: 12.5
"Transfer 200 USDT from funding to trading"
okx account transfer --ccy USDT --amt 200 --from 6 --to 18
# → Transfer: TXN123456 (USDT 200)
"Check my account config"
okx account config
# → uid: 123456789 | acctLv: 2 | posMode: net | autoLoan: false
OKX splits assets across multiple sub-accounts. The --valuation breakdown maps directly:
| Account type | details key | Used for | Check with |
|---|---|---|---|
| Trading (unified) | trading | Spot, margin, swap, futures, options | okx account balance or details.trading in --valuation |
| Funding | funding | Deposits/withdrawals, idle funds | okx account asset-balance or details.funding in --valuation |
| Earn | earn | Simple earn, staking, savings | details.earn in --valuation |
| Classic | classic | Classic account (legacy, less common) | details.classic in --valuation |
Typical flow when user says "I have X USDT but can't trade":
okx account asset-balance --valuation → look at each details.* fielddetails.funding is large and details.trading is small → the funds are in the funding accountokx account transfer --ccy USDT --amt <n> --from 6 --to 18okx account balance USDT → equity should now reflect the transferred amountaccount balance)net if you have both long and short positions on the same instrument6=funding account, 18=trading account; other values exist for sub-account flowsmax-size is the theoretical maximum; max-avail-size accounts for existing orders and reserved marginokx --demo account balance (OAuth) or okx --profile <demo-profile> account balance (API Key) shows simulated balances, not real funds~/.okx/config.toml)[mode: live] or [mode: demo] tag for audit reference--json returns the raw OKX API v5 response by default. Add --env to wrap the output as {"env": "<live|demo>", "profile": "<name>", "data": <response>}6=Funding Account (deposits/withdrawals), 18=Unified Trading Account (spot + derivatives)development
Smart Money analytics on OKX: leaderboard traders, position tracking, trade records, closed-position history, aggregated consensus signals, and signal history. Use this skill when the user asks about 聪明钱, smart money, 牛人榜, leaderboard, top traders, 交易员排行, trader ranking, trader positions, trader PnL, 交易员持仓, 交易员收益, 历史平仓, closed positions, realized PnL track record, trade history, 成交记录, smart money signal, 聪明钱信号, long/short ratio, 多空比, capital flow, 资金流向, position conviction, 仓位强度, entry price distribution, smart money overview, 聪明钱总览, signal history, 信号历史, trader search, 搜索交易员, who is trading BTC, 谁在交易BTC, recommend traders, 推荐交易员, best traders, top performers.
tools
Use this skill when the user wants to 'login/log in/sign in', 'authenticate', 'authorize', 'connect OKX account', 'set up credentials', 'first time setup', 'configure okx', '登录', '授权', '认证', '连接账户', '首次配置'. Also when any OKX CLI command fails with an auth error: 'Run okx auth login first', 'Session expired', 'not authenticated', 'requires_auth', '401 Unauthorized', 'token expired/not found', 'StorageNotFoundError', '会话过期', '未认证', '需要登录'. Also when the user asks about login status or the login was interrupted. Also when the user wants to install/update/check/remove the okx-auth binary — 'install/update/remove auth', 'download okx-auth', '安装/更新/卸载认证', 'auth binary status', 'Failed to spawn okx-auth'. Also use before using okx-cex-trade/portfolio/earn/bot for the first time. Do NOT use for market data queries (use okx-cex-market).
development
Use this skill when the user asks about: 'any crypto news', 'latest news', 'market update', 'daily briefing', 'BTC news', 'ETH news', 'news on SOL', 'search SEC ETF', 'regulation news', 'Bitcoin halving', 'is BTC bullish or bearish', 'coin sentiment', 'sentiment trend', 'trending coins', 'top bullish coins', 'bearish sentiment', 'social buzz', 'market mood', 'fear and greed', 'full article', 'read more', 'economic calendar', '经济日历', 'macro data', '宏观数据', 'NFP', 'nonfarm', '非农', 'CPI', 'GDP', 'FOMC', '利率决议', 'interest rate decision', 'PMI', 'unemployment rate', '失业率', 'economic events', '经济事件', or any request for crypto news, market intelligence, sentiment analysis, social trend data, or macro-economic calendar. Requires API credentials. Do NOT use for market prices/candles (okx-cex-market), placing orders (okx-cex-trade), or account info (okx-cex-portfolio).
development
Use when the user asks to 'buy BTC', 'sell ETH', 'place a limit order', 'place a market order', 'cancel my order', 'amend my order', 'long BTC perp', 'short ETH swap', 'open a position', 'close a position', 'set take profit', 'limit take profit', 'immediate TP', 'set stop loss', 'self-trade prevention', 'stpMode', 'auto-cancel on close', 'trailing stop', 'pending order', 'chase order', 'iceberg', 'TWAP', 'split order', 'large order', 'set leverage', 'check my orders', 'fill history', 'buy a call', 'sell a put', 'option chain', 'implied volatility', 'IV', 'Greeks', 'delta', 'gamma', 'event contract', 'buy Yes', 'buy No', 'buy Up', 'buy Down', 'prediction market', or any request to place, cancel, or amend spot, swap, futures, options, or event contract orders on OKX CEX. Covers conditional (TP/SL/trailing) algo orders. Requires API credentials. Do NOT use for market data (okx-cex-market), account balance (okx-cex-portfolio), or bots (okx-cex-bot).