desic-okx-agent 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.en.md +353 -0
  2. package/README.md +194 -190
  3. package/dist/account/private-websocket.js +4 -4
  4. package/dist/account/private-websocket.js.map +1 -1
  5. package/dist/account/service.d.ts +12 -1
  6. package/dist/account/service.js +18 -0
  7. package/dist/account/service.js.map +1 -1
  8. package/dist/bars/rate-limiter.d.ts +18 -0
  9. package/dist/bars/rate-limiter.js +84 -0
  10. package/dist/bars/rate-limiter.js.map +1 -0
  11. package/dist/bars/schema.d.ts +36 -0
  12. package/dist/bars/schema.js +134 -0
  13. package/dist/bars/schema.js.map +1 -0
  14. package/dist/bars/service.d.ts +60 -0
  15. package/dist/bars/service.js +120 -0
  16. package/dist/bars/service.js.map +1 -0
  17. package/dist/bars/store.d.ts +105 -0
  18. package/dist/bars/store.js +415 -0
  19. package/dist/bars/store.js.map +1 -0
  20. package/dist/bars/timeframe.d.ts +40 -0
  21. package/dist/bars/timeframe.js +146 -0
  22. package/dist/bars/timeframe.js.map +1 -0
  23. package/dist/bars/types.d.ts +68 -0
  24. package/dist/bars/types.js +13 -0
  25. package/dist/bars/types.js.map +1 -0
  26. package/dist/cli/data-render.d.ts +37 -0
  27. package/dist/cli/data-render.js +143 -0
  28. package/dist/cli/data-render.js.map +1 -0
  29. package/dist/cli/doctor.js +7 -3
  30. package/dist/cli/doctor.js.map +1 -1
  31. package/dist/cli/index.js +758 -27
  32. package/dist/cli/index.js.map +1 -1
  33. package/dist/cli/live-render.d.ts +24 -0
  34. package/dist/cli/live-render.js +85 -0
  35. package/dist/cli/live-render.js.map +1 -0
  36. package/dist/cli/range.d.ts +28 -0
  37. package/dist/cli/range.js +63 -0
  38. package/dist/cli/range.js.map +1 -0
  39. package/dist/cli/render.js +3 -0
  40. package/dist/cli/render.js.map +1 -1
  41. package/dist/cli/strategy-render.d.ts +36 -0
  42. package/dist/cli/strategy-render.js +391 -0
  43. package/dist/cli/strategy-render.js.map +1 -0
  44. package/dist/cli/width.d.ts +18 -0
  45. package/dist/cli/width.js +71 -0
  46. package/dist/cli/width.js.map +1 -0
  47. package/dist/config/loader.js +1 -1
  48. package/dist/config/schema.d.ts +7 -0
  49. package/dist/config/schema.js +24 -0
  50. package/dist/config/schema.js.map +1 -1
  51. package/dist/core/okx-client.d.ts +9 -1
  52. package/dist/core/okx-client.js +14 -5
  53. package/dist/core/okx-client.js.map +1 -1
  54. package/dist/i18n/locale.d.ts +24 -0
  55. package/dist/i18n/locale.js +65 -0
  56. package/dist/i18n/locale.js.map +1 -0
  57. package/dist/i18n/messages.d.ts +333 -0
  58. package/dist/i18n/messages.js +660 -0
  59. package/dist/i18n/messages.js.map +1 -0
  60. package/dist/live/account-snapshot.d.ts +30 -0
  61. package/dist/live/account-snapshot.js +130 -0
  62. package/dist/live/account-snapshot.js.map +1 -0
  63. package/dist/live/cutoff-queue.d.ts +42 -0
  64. package/dist/live/cutoff-queue.js +69 -0
  65. package/dist/live/cutoff-queue.js.map +1 -0
  66. package/dist/live/execution-key.d.ts +23 -0
  67. package/dist/live/execution-key.js +31 -0
  68. package/dist/live/execution-key.js.map +1 -0
  69. package/dist/live/failures.d.ts +37 -0
  70. package/dist/live/failures.js +57 -0
  71. package/dist/live/failures.js.map +1 -0
  72. package/dist/live/gates.d.ts +65 -0
  73. package/dist/live/gates.js +136 -0
  74. package/dist/live/gates.js.map +1 -0
  75. package/dist/live/loop.d.ts +56 -0
  76. package/dist/live/loop.js +197 -0
  77. package/dist/live/loop.js.map +1 -0
  78. package/dist/live/preconditions.d.ts +48 -0
  79. package/dist/live/preconditions.js +69 -0
  80. package/dist/live/preconditions.js.map +1 -0
  81. package/dist/live/reconcile.d.ts +46 -0
  82. package/dist/live/reconcile.js +104 -0
  83. package/dist/live/reconcile.js.map +1 -0
  84. package/dist/live/runner.d.ts +57 -0
  85. package/dist/live/runner.js +160 -0
  86. package/dist/live/runner.js.map +1 -0
  87. package/dist/live/schema.d.ts +18 -0
  88. package/dist/live/schema.js +91 -0
  89. package/dist/live/schema.js.map +1 -0
  90. package/dist/live/service.d.ts +144 -0
  91. package/dist/live/service.js +303 -0
  92. package/dist/live/service.js.map +1 -0
  93. package/dist/live/session.d.ts +85 -0
  94. package/dist/live/session.js +234 -0
  95. package/dist/live/session.js.map +1 -0
  96. package/dist/live/sizing.d.ts +62 -0
  97. package/dist/live/sizing.js +79 -0
  98. package/dist/live/sizing.js.map +1 -0
  99. package/dist/live/store.d.ts +123 -0
  100. package/dist/live/store.js +350 -0
  101. package/dist/live/store.js.map +1 -0
  102. package/dist/live/types.d.ts +82 -0
  103. package/dist/live/types.js +2 -0
  104. package/dist/live/types.js.map +1 -0
  105. package/dist/market/websocket.d.ts +16 -1
  106. package/dist/market/websocket.js +60 -5
  107. package/dist/market/websocket.js.map +1 -1
  108. package/dist/mcp/server.d.ts +1 -0
  109. package/dist/mcp/server.js +15 -1
  110. package/dist/mcp/server.js.map +1 -1
  111. package/dist/network/connectivity.d.ts +9 -1
  112. package/dist/network/connectivity.js +28 -1
  113. package/dist/network/connectivity.js.map +1 -1
  114. package/dist/report/chart-script.d.ts +12 -0
  115. package/dist/report/chart-script.js +146 -0
  116. package/dist/report/chart-script.js.map +1 -0
  117. package/dist/report/compare-html.d.ts +8 -0
  118. package/dist/report/compare-html.js +254 -0
  119. package/dist/report/compare-html.js.map +1 -0
  120. package/dist/report/compare-script.d.ts +12 -0
  121. package/dist/report/compare-script.js +109 -0
  122. package/dist/report/compare-script.js.map +1 -0
  123. package/dist/report/compare.d.ts +61 -0
  124. package/dist/report/compare.js +205 -0
  125. package/dist/report/compare.js.map +1 -0
  126. package/dist/report/fetch.d.ts +20 -0
  127. package/dist/report/fetch.js +56 -0
  128. package/dist/report/fetch.js.map +1 -0
  129. package/dist/report/html.d.ts +54 -0
  130. package/dist/report/html.js +641 -0
  131. package/dist/report/html.js.map +1 -0
  132. package/dist/report/open.d.ts +42 -0
  133. package/dist/report/open.js +114 -0
  134. package/dist/report/open.js.map +1 -0
  135. package/dist/runtime/server.d.ts +16 -1
  136. package/dist/runtime/server.js +112 -9
  137. package/dist/runtime/server.js.map +1 -1
  138. package/dist/setup/installer.d.ts +1 -0
  139. package/dist/setup/installer.js +8 -0
  140. package/dist/setup/installer.js.map +1 -1
  141. package/dist/setup/wizard.d.ts +3 -0
  142. package/dist/setup/wizard.js +131 -6
  143. package/dist/setup/wizard.js.map +1 -1
  144. package/dist/strategy/constants.d.ts +23 -0
  145. package/dist/strategy/constants.js +24 -0
  146. package/dist/strategy/constants.js.map +1 -0
  147. package/dist/strategy/environment.d.ts +52 -0
  148. package/dist/strategy/environment.js +187 -0
  149. package/dist/strategy/environment.js.map +1 -0
  150. package/dist/strategy/instrument.d.ts +29 -0
  151. package/dist/strategy/instrument.js +39 -0
  152. package/dist/strategy/instrument.js.map +1 -0
  153. package/dist/strategy/optimize.d.ts +73 -0
  154. package/dist/strategy/optimize.js +113 -0
  155. package/dist/strategy/optimize.js.map +1 -0
  156. package/dist/strategy/parameter-space.d.ts +59 -0
  157. package/dist/strategy/parameter-space.js +221 -0
  158. package/dist/strategy/parameter-space.js.map +1 -0
  159. package/dist/strategy/python-bridge.d.ts +24 -0
  160. package/dist/strategy/python-bridge.js +114 -0
  161. package/dist/strategy/python-bridge.js.map +1 -0
  162. package/dist/strategy/schema.d.ts +9 -0
  163. package/dist/strategy/schema.js +91 -0
  164. package/dist/strategy/schema.js.map +1 -0
  165. package/dist/strategy/service.d.ts +138 -0
  166. package/dist/strategy/service.js +745 -0
  167. package/dist/strategy/service.js.map +1 -0
  168. package/dist/strategy/settings.d.ts +162 -0
  169. package/dist/strategy/settings.js +243 -0
  170. package/dist/strategy/settings.js.map +1 -0
  171. package/dist/strategy/store.d.ts +96 -0
  172. package/dist/strategy/store.js +367 -0
  173. package/dist/strategy/store.js.map +1 -0
  174. package/dist/strategy/templates.d.ts +11 -0
  175. package/dist/strategy/templates.js +134 -0
  176. package/dist/strategy/templates.js.map +1 -0
  177. package/dist/strategy/types.d.ts +111 -0
  178. package/dist/strategy/types.js +2 -0
  179. package/dist/strategy/types.js.map +1 -0
  180. package/dist/tools/catalog.d.ts +16 -0
  181. package/dist/tools/catalog.js +118 -17
  182. package/dist/tools/catalog.js.map +1 -1
  183. package/dist/trade/service.d.ts +12 -0
  184. package/dist/trade/service.js +24 -7
  185. package/dist/trade/service.js.map +1 -1
  186. package/dist/tui/app.d.ts +23 -0
  187. package/dist/tui/app.js +322 -0
  188. package/dist/tui/app.js.map +1 -0
  189. package/dist/tui/commands.d.ts +70 -0
  190. package/dist/tui/commands.js +313 -0
  191. package/dist/tui/commands.js.map +1 -0
  192. package/dist/tui/entries.d.ts +17 -0
  193. package/dist/tui/entries.js +24 -0
  194. package/dist/tui/entries.js.map +1 -0
  195. package/dist/tui/execute.d.ts +26 -0
  196. package/dist/tui/execute.js +664 -0
  197. package/dist/tui/execute.js.map +1 -0
  198. package/dist/tui/history.d.ts +17 -0
  199. package/dist/tui/history.js +48 -0
  200. package/dist/tui/history.js.map +1 -0
  201. package/dist/tui/index.d.ts +8 -0
  202. package/dist/tui/index.js +48 -0
  203. package/dist/tui/index.js.map +1 -0
  204. package/dist/tui/line-editor.d.ts +44 -0
  205. package/dist/tui/line-editor.js +98 -0
  206. package/dist/tui/line-editor.js.map +1 -0
  207. package/dist/tui/progress.d.ts +23 -0
  208. package/dist/tui/progress.js +46 -0
  209. package/dist/tui/progress.js.map +1 -0
  210. package/dist/tui/settings-editor.d.ts +18 -0
  211. package/dist/tui/settings-editor.js +115 -0
  212. package/dist/tui/settings-editor.js.map +1 -0
  213. package/docs/live-trading.md +455 -0
  214. package/docs/strategy-research.md +597 -0
  215. package/package.json +11 -1
  216. package/python/desic_strategy/__init__.py +34 -0
  217. package/python/desic_strategy/actions.py +158 -0
  218. package/python/desic_strategy/context.py +164 -0
  219. package/python/desic_strategy/engine.py +614 -0
  220. package/python/desic_strategy/indicators.py +159 -0
  221. package/python/desic_strategy/live.py +253 -0
  222. package/python/desic_strategy/policy.py +193 -0
  223. package/python/desic_strategy/portfolio.py +152 -0
  224. package/python/desic_strategy/report.py +319 -0
  225. package/python/desic_strategy/runner.py +574 -0
  226. package/python/desic_strategy/timeframe.py +150 -0
  227. package/python/main.py +18 -0
  228. package/skills/okx-live-trading/SKILL.md +117 -0
  229. package/skills/okx-live-trading/agents/openai.yaml +9 -0
  230. package/skills/okx-live-trading/references/lifecycle.md +128 -0
  231. package/skills/okx-strategy-research/SKILL.md +113 -0
  232. package/skills/okx-strategy-research/agents/openai.yaml +9 -0
  233. package/skills/okx-strategy-research/references/execution-semantics.md +107 -0
  234. package/skills/okx-strategy-research/references/field-traps.md +142 -0
  235. package/skills/okx-strategy-research/references/python-api.md +121 -0
  236. package/skills/okx-strategy-research/references/tools-and-data.md +192 -0
  237. package/skills/okx-trading/SKILL.md +11 -10
package/README.md CHANGED
@@ -1,55 +1,57 @@
1
1
  # Desic OKX Agent
2
2
 
3
- An independent local OKX runtime, MCP server, CLI, and reusable agent skills for Codex, Claude Code, and other MCP clients.
3
+ [简体中文](README.md) | [English](README.en.md)
4
4
 
5
- > [!IMPORTANT]
6
- > Desic OKX Agent is an independent community project. It is not affiliated with, endorsed by, or an official product of OKX.
7
-
8
- ## What it provides
5
+ 面向 Codex、Claude Code 及其他 MCP 客户端的独立 OKX 本地 Runtime、MCP Server、CLI 和 Agent Skills。
9
6
 
10
- - A shared local Runtime reused by multiple MCP and CLI clients
11
- - In-memory ticker, order book, trades, candles, funding, mark price, and open-interest data
12
- - Time-aligned decision snapshots with freshness and consistency metadata
13
- - Public market and derivatives tools that work without API credentials
14
- - Named OKX accounts for balances, positions, orders, fills, bills, and risk summaries
15
- - Direct ordinary-order, algo-order, leverage, amend, cancel, and close-position operations
16
- - Experimental News and Smart Money intelligence with SQLite history fallback
17
- - Seven reusable analysis and trading skills
18
- - SQLite WAL persistence for closed candles, intelligence history, derived events, and execution records
19
-
20
- The project does not expose withdrawal, deposit, transfer, asset-movement, or API-key-management tools.
7
+ > [!IMPORTANT]
8
+ > Desic OKX Agent 是独立的社区项目,并非 OKX 官方产品,也未获得 OKX 的认可或背书。
21
9
 
22
- ## Requirements
10
+ > [!NOTE]
11
+ > 本项目的所有交易工具仅支持 OKX 永续合约(`instId` 必须以 `-SWAP` 结尾)。不支持现货、交割合约、期权或其他品种的交易。公共行情和账户查询不受此限制。
23
12
 
24
- - Node.js 22.12 or newer
25
- - npm
26
- - Network access to OKX, or an HTTP/HTTPS proxy that can reach OKX
13
+ ## 安装
27
14
 
28
- ## Install
15
+ 要求 Node.js 22.12 或更高版本,以及能够访问 OKX 的网络或 HTTP/HTTPS 代理。
29
16
 
30
- Install the published package:
17
+ 首次安装只需两条命令:
31
18
 
32
19
  ```bash
33
20
  npm install --global desic-okx-agent
21
+ desic-okx setup
34
22
  ```
35
23
 
36
- This registers the `desic-okx` command on the local machine.
24
+ 两条命令作用不同:
25
+
26
+ 1. `npm install` 安装 `desic-okx` 程序。
27
+ 2. `desic-okx setup` 接入 AI 客户端、安装 Skills、检查网络,并询问是否配置 OKX API 账户。
37
28
 
38
- ## Set up an AI client
29
+ 首次安装后需要运行一次 `setup`。以后正常升级无需重复运行;只有新增 AI 客户端、修复配置或重新配置代理时才需要再次运行。
39
30
 
40
- Run the guided setup after installation:
31
+ 完成后重启已选择的 AI 客户端,并验证:
41
32
 
42
33
  ```bash
43
- desic-okx setup
34
+ desic-okx doctor
44
35
  ```
45
36
 
46
- The terminal guide lets you select Codex, Claude Code, Cursor, VS Code / GitHub Copilot, Cline, or all supported clients with the arrow keys and Space. It safely adds the `desic-okx` MCP entry without replacing other MCP servers.
37
+ ## Setup 会做什么
47
38
 
48
- For Codex and Claude Code, setup also installs all bundled Skills automatically. Cursor, VS Code / GitHub Copilot, and Cline receive MCP configuration only because they do not share a portable `SKILL.md` installation format.
39
+ 交互式向导会依次完成:
49
40
 
50
- Setup then checks both OKX REST and WebSocket connectivity. Transient TLS and network failures are retried before setup asks for action. When direct and detected system-proxy connections still fail, it offers to test and save an HTTP proxy URL, retry, or continue without network access.
41
+ 1. 选择 Codex、Claude Code、Cursor、VS Code / GitHub Copilot、Cline,或全部客户端。
42
+ 2. 注册 `desic-okx` MCP Server,保留已有 MCP 配置。
43
+ 3. 为 Codex 和 Claude Code 自动安装全部 9 个 Skills。
44
+ 4. 检查 OKX REST 与 WebSocket;连接失败时引导测试并保存 HTTP 代理。
45
+ 5. 解释不同功能的 API Key 要求,并让用户选择“现在配置”或“以后配置”。
46
+ 6. 如果现在配置,隐藏凭证输入,自动识别实盘或模拟盘,验证成功后才写入本地配置。
51
47
 
52
- For automation, choose explicit targets without opening the UI:
48
+ API 账户是可选的。跳过后公共行情和公共衍生品仍可使用,以后运行下面的命令即可配置:
49
+
50
+ ```bash
51
+ desic-okx account add
52
+ ```
53
+
54
+ 自动化或无人值守安装可以指定客户端;该模式不会询问或保存 API 凭证:
53
55
 
54
56
  ```bash
55
57
  desic-okx setup --targets codex --yes
@@ -58,111 +60,159 @@ desic-okx setup --all --yes
58
60
  desic-okx setup --targets codex --yes --skip-network-check
59
61
  ```
60
62
 
61
- Non-interactive setup exits with an error when the network check fails. Use `--skip-network-check` only when connectivity will be configured later.
63
+ ## 配置 OKX API
62
64
 
63
- Restart the selected client after setup. The MCP server starts the local Runtime automatically when it is first used. Run `desic-okx doctor` at any time to verify the package, client configuration, Skills, network, Runtime, SQLite, public market data, and configured accounts.
65
+ 在 OKX 官方网站或 App 中创建 API Key。实盘账户与模拟交易账户使用各自环境的 API Key,Desic OKX Agent 会通过只读验证自动识别,不需要用户选择实盘或模拟盘。
64
66
 
65
- ## Ask an AI to install it
67
+ 按实际用途授予权限:
66
68
 
67
- Paste this into Codex, Claude Code, Cursor, VS Code / GitHub Copilot, or Cline. Replace `codex` with `claude-code`, `cursor`, `vscode`, `cline`, or `all` when appropriate.
69
+ | 功能 | 是否需要 API Key | 所需条件 |
70
+ | --- | --- | --- |
71
+ | 公共行情、K 线、盘口、衍生品分析 | 否 | 无 |
72
+ | 余额、持仓、订单、成交、风险摘要 | 是 | 读取权限 |
73
+ | 远程 News、Smart Money | 是 | `live` 账户,读取权限即可 |
74
+ | 永续合约下单、改单、撤单、平仓、设置杠杆 | 是 | OKX API Key 具备交易权限;仅支持 `*-SWAP` |
68
75
 
69
- ```text
70
- Install Desic OKX Agent for me. Check that Node.js is at least 22.12, then run:
71
- npm install --global desic-okx-agent
72
- desic-okx setup --targets codex --yes
76
+ 本项目不提供提现、充值、资金划转、资产转出或 API Key 管理工具,不需要为此授予相关权限。建议先使用 OKX 模拟交易账户验证交易流程,并按自己的安全策略在 OKX 配置 IP 白名单。
73
77
 
74
- Verify the installation with `desic-okx doctor`. Do not ask for or configure any OKX API credentials. Confirm that public market tools are ready to use.
78
+ 交互式添加账户:
79
+
80
+ ```bash
81
+ desic-okx account add --name demo
82
+ desic-okx account add --name main
75
83
  ```
76
84
 
77
- For development from source:
85
+ 输入 API Key、Secret Key 和 Passphrase 时终端会隐藏文本。`account add` 会先连接 OKX 验证,验证失败不会保存凭证。凭证保存在系统配置目录的 `config.json` 中;Unix 权限为 `0600`:
78
86
 
79
87
  ```bash
80
- git clone https://github.com/xiazhi88/desic-okx-agent.git
81
- cd desic-okx-agent
82
- npm ci
83
- npm run build
84
- npm link
88
+ desic-okx config-path
89
+ ```
90
+
91
+ 也支持环境变量覆盖同名账户:
92
+
93
+ ```text
94
+ OKX_ACCOUNT
95
+ OKX_API_KEY
96
+ OKX_API_SECRET
97
+ OKX_API_PASSPHRASE
98
+ ```
99
+
100
+ 三个凭证变量必须同时提供。Runtime 会自动探测账户环境;能否交易完全取决于 OKX 为该 API Key 配置的官方权限。
101
+
102
+ ## 让 AI 自动安装
103
+
104
+ 可将下面的提示词交给 Codex、Claude Code、Cursor、VS Code / GitHub Copilot 或 Cline。将 `codex` 替换为 `claude-code`、`cursor`、`vscode`、`cline` 或 `all`:
105
+
106
+ ```text
107
+ 请为我安装 Desic OKX Agent:
108
+ 1. 检查 Node.js 是否为 22.12 或更高版本。
109
+ 2. 运行 npm install --global desic-okx-agent。
110
+ 3. 运行 desic-okx setup --targets codex --yes。
111
+ 4. 运行 desic-okx doctor 验证 MCP、Skills 和 OKX 网络。
112
+ 5. 不要要求我在聊天中发送任何 API Key、Secret 或 Passphrase。
113
+ 6. 告诉我公共工具已可使用;如果我需要账户、News、Smart Money 或交易功能,引导我直接在自己的终端运行 desic-okx account add,并由我在隐藏输入框中填写凭证。
85
114
  ```
86
115
 
87
- ## Quick start
116
+ ## 快速开始
88
117
 
89
- Public market tools do not require an account:
118
+ 公共行情不需要账户:
90
119
 
91
120
  ```bash
92
- desic-okx start
93
121
  desic-okx call market_get_ticker --json '{"instId":"BTC-USDT-SWAP"}'
94
122
  desic-okx call market_get_decision_snapshot --json '{"instId":"BTC-USDT-SWAP","bar":"1m"}'
95
123
  ```
96
124
 
97
- The Runtime starts automatically when an MCP client or CLI call needs it. `desic-okx start` is optional.
98
- The stdio MCP adapter does not load the native SQLite module itself, which avoids holding the package binary open during Windows upgrades. Stop a running Runtime with `desic-okx stop` before upgrading.
125
+ Runtime 会在 MCP 或 CLI 首次调用时自动启动,通常不需要手动运行 `desic-okx start`。
99
126
 
100
- Useful Runtime commands:
127
+ 常用命令:
101
128
 
102
129
  ```bash
103
130
  desic-okx status
104
- desic-okx status --json
105
131
  desic-okx doctor
106
132
  desic-okx tools
107
133
  desic-okx tool market_get_decision_snapshot
108
- desic-okx stop
134
+ desic-okx account list
135
+ desic-okx update --check
109
136
  ```
110
137
 
111
- `status` shows the Runtime version, uptime, redacted proxy route, public/business/private WebSocket state, subscriptions and data ages, accounts, and database size. `doctor` performs active network, SQLite, market-data, account, MCP-client, Skill, and package checks. Both support machine-readable JSON.
138
+ `status` 显示 Runtime 版本、运行时间、代理路径、WebSocket 状态、订阅与数据年龄、账户和数据库状态。`doctor` 主动检查安装、网络、SQLite、行情、账户、MCP 客户端和 Skills。两者均支持 `--json`。
112
139
 
113
- ## Connect Codex
140
+ ## 主要能力
114
141
 
115
- The recommended option is `desic-okx setup`, which also installs all Skills. To register only the local stdio MCP server manually:
142
+ - 共享单例 Runtime,可被多个 MCP 和 CLI 客户端复用
143
+ - 内存中的 ticker、盘口、逐笔成交、K 线、资金费率、标记价格和持仓量
144
+ - 带新鲜度、交易所时间和一致性元数据的统一决策快照
145
+ - 公共行情、指标扫描和公共衍生品分析
146
+ - 账户余额、持仓、委托、成交、账单及风险摘要
147
+ - 仅限永续合约的普通单、策略单、杠杆、改单、撤单和平仓操作
148
+ - 实验性的 News 与 Smart Money 能力,以及 SQLite 历史回退
149
+ - SQLite WAL 持久化已收盘 K 线、情报历史、派生事件和执行记录
150
+ - Python 策略研究:1 分钟历史数据、回测、参数调优、多次回测对比
151
+ - 实盘执行:把已回测的策略绑到账户,每根 1 分钟收线自动决策,八道风控闸门前置
116
152
 
117
- ```bash
118
- codex mcp add desic-okx -- desic-okx mcp
119
- ```
153
+ ## 一条链,不是两个产品
120
154
 
121
- Or add it to `~/.codex/config.toml`:
155
+ 上面的能力不是并列的清单,而是同一条链上的几段。**手动做和让 AI 做,走的是同一条链**:
122
156
 
123
- ```toml
124
- [mcp_servers.desic-okx]
125
- command = "desic-okx"
126
- args = ["mcp"]
157
+ ```text
158
+ 分析行情 ──→ 写成策略 ──→ 回测 ──→ 调参 ──→ 建 Profile ──→ 模拟盘验证 ──→ 实盘
159
+ 行情/衍生品 Python 7:3 切分 验证段排名 不会开始交易 真实下单 真钱
160
+ News/资金流 策略文件 (需你同意)
127
161
  ```
128
162
 
129
- ## Connect Claude Code
163
+ 两种用法的区别只在谁按键:
164
+
165
+ | | 你自己做 | 交给 AI |
166
+ | --- | --- | --- |
167
+ | 找想法 | `market_*` / `news_*` 工具,或 TUI | `okx-market-analysis` 等 Skill |
168
+ | 写策略 | `strategy new` 起模板,自己编辑 | agent 写文件,`strategy_validate_source` 校验 |
169
+ | 回测调参 | `strategy backtest` / `optimize` / `compare` | 同名 MCP 工具,`okx-strategy-research` Skill |
170
+ | 建 Profile | `live create` | `live_create_profile`(需开 `agent-access`) |
171
+ | 启用实盘 | `live start` | `live_start`,且 Skill 要求**先问你并给出数字** |
130
172
 
131
- The recommended option is `desic-okx setup`, which also installs all Skills. To register only the MCP server manually:
173
+ 默认情况下 agent 只能读和停,创建与启用不在它的工具列表里。要让 AI 跑完整条链:
132
174
 
133
175
  ```bash
134
- claude mcp add --transport stdio --scope user desic-okx -- desic-okx mcp
176
+ desic-okx live agent-access on # 需重启 MCP 客户端
177
+ desic-okx live agent-access # 查看当前设置
135
178
  ```
136
179
 
137
- Verify the connection with:
180
+ 开启后 agent 仍被要求在启用实盘 Profile 前停下来问你 —— 这条约束写在 Skill 里,不是系统闸门。系统能验证的是"这个 Profile 能不能跑",不能验证"该不该投真钱"。
181
+
182
+ ## 策略研究
183
+
184
+ 用 Python 写策略,在本地 1 分钟历史数据上回测、调参、对比:
138
185
 
139
186
  ```bash
140
- claude mcp get desic-okx
187
+ desic-okx strategy env --setup
188
+ desic-okx data download --inst BTC-USDT-SWAP --days 90
189
+ desic-okx strategy new --out ema.py --template ema-trend
190
+ desic-okx strategy backtest --file ema.py --inst BTC-USDT-SWAP --days 30 --follow
141
191
  ```
142
192
 
143
- A JSON example is available in `examples/claude-code/mcp.json`.
193
+ 调参会把窗口按 7:3 切分,用候选从未见过的那一段排名,因此过拟合是可见的而不是被埋掉的。对比会在两次运行数据、合约、区间或成本不同时给出警告。
144
194
 
145
- ## Skills
146
-
147
- `desic-okx setup` automatically installs all seven Skills for Codex and Claude Code. The MCP server exposes the tools; Skills add reusable analysis and trading workflows.
195
+ 完整说明见 **[策略研究使用指南](docs/strategy-research.md)**。
148
196
 
149
- To install selected Skills manually, copy their directories from the installed package:
197
+ ## 实盘执行
150
198
 
151
- Codex personal skills:
199
+ 把已验证的策略接到真实账户,每根 1 分钟收线自动执行:
152
200
 
153
- ```text
154
- ${CODEX_HOME:-~/.codex}/skills/<skill-name>/SKILL.md
201
+ ```bash
202
+ desic-okx live create --file ema.py --inst BTC-USDT-SWAP --account demo \
203
+ --environment demo --entry-budget 100 --side-budget 200 --daily-loss 500
204
+ desic-okx live readiness --id lp_xxxx
205
+ desic-okx live start --id lp_xxxx
206
+ desic-okx live signals --id lp_xxxx
155
207
  ```
156
208
 
157
- Claude Code personal skills:
209
+ 启用需要该源码 + 该合约已完成回测(按源码 hash 匹配,不是文件名),并会把 Profile 的杠杆写到交易所 —— 预算按杠杆折算张数,两边不一致预算就不成立。八道风控闸门只拒绝、不修正,被拒绝的信号会完整保留 —— 它们是风控运行过的证据。崩溃后向交易所对账,绝不重发可能已存在的订单。
158
210
 
159
- ```text
160
- ~/.claude/skills/<skill-name>/SKILL.md
161
- ```
211
+ **这部分会用真钱下单。** 完整说明与限制见 **[实盘执行使用指南](docs/live-trading.md)**。
162
212
 
163
- Project-scoped alternatives are `.agents/skills/` for Codex and `.claude/skills/` for Claude Code.
213
+ ## Skills
164
214
 
165
- Included skills:
215
+ `desic-okx setup` 会为 Codex 和 Claude Code 自动安装:
166
216
 
167
217
  - `okx-market-analysis`
168
218
  - `okx-derivatives-analysis`
@@ -170,11 +220,11 @@ Included skills:
170
220
  - `okx-smart-money-analysis`
171
221
  - `okx-account-analysis`
172
222
  - `okx-trading`
223
+ - `okx-strategy-research`
224
+ - `okx-live-trading`
173
225
  - `trading-philosophy`
174
226
 
175
- Restart the client if a newly installed skill does not appear.
176
-
177
- Setup synchronizes bundled Skills on every run. Identical Skills are left untouched. Changed copies are backed up before the bundled version is installed. They can also be inspected or synchronized explicitly:
227
+ 升级后 Skills 会自动同步。也可手动检查或同步;被修改的旧版本会先备份:
178
228
 
179
229
  ```bash
180
230
  desic-okx skills status
@@ -182,77 +232,41 @@ desic-okx skills sync
182
232
  desic-okx skills sync --targets codex --dry-run
183
233
  ```
184
234
 
185
- ## Configure an OKX account
186
-
187
- Public tools work without credentials. Account and trading tools use a named account alias and never accept credentials as tool arguments.
188
-
189
- Add and verify an account interactively:
235
+ ## 账户管理
190
236
 
191
237
  ```bash
192
- desic-okx account add --name demo --environment demo
193
- desic-okx account verify --name demo
194
- desic-okx account verify --all
195
238
  desic-okx account list
196
- desic-okx account set-default demo
197
- desic-okx account rename demo demo-primary
198
- desic-okx account edit demo-primary
199
- ```
200
-
201
- `account add` and `account edit` verify the credentials with OKX before writing the configuration file. Editing credentials remains interactive so secrets are not passed as command-line arguments.
202
-
203
- The credential prompts hide input. Credentials are stored in the system configuration directory in `config.json`; Unix permissions are set to `0600`. The active path is shown by:
204
-
205
- ```bash
206
- desic-okx config-path
207
- ```
208
-
209
- Environment variables can override a named account:
210
-
211
- ```text
212
- OKX_ACCOUNT
213
- OKX_API_KEY
214
- OKX_API_SECRET
215
- OKX_API_PASSPHRASE
216
- OKX_ENVIRONMENT=demo|live
239
+ desic-okx account verify --name main
240
+ desic-okx account verify --all
241
+ desic-okx account set-default main
242
+ desic-okx account rename main primary
243
+ desic-okx account edit primary
244
+ desic-okx account remove primary
217
245
  ```
218
246
 
219
- The three credential values must be provided together. Whether an account can trade is determined by the permissions assigned to its API key in OKX.
247
+ `account add` 和 `account edit` 均在写入配置前验证凭证。工具参数只接受账户别名,不接受 API Key、Secret 或 Passphrase。
220
248
 
221
- ## Tool help
222
-
223
- The MCP schemas are available to AI clients. Humans can inspect the same schema, account requirement, and a runnable example from the CLI:
249
+ ## 工具帮助
224
250
 
225
251
  ```bash
252
+ desic-okx tools
226
253
  desic-okx tool news_search
254
+ desic-okx tool trade_place_order
227
255
  desic-okx tool trade_place_order --json
228
256
  ```
229
257
 
230
- Remote News and Smart Money tools require a configured **live OKX account**. Read-only API permission is sufficient. Local News event and history tools can use previously persisted data where available. This requirement is included in the MCP tool descriptions and relevant Skills.
231
-
232
- ## Update
233
-
234
- Check or install the latest npm release:
235
-
236
- ```bash
237
- desic-okx update --check
238
- desic-okx update
239
- desic-okx update --yes
240
- ```
241
-
242
- The updater checks the official npm registry, stops the Runtime, waits for the native SQLite module to be released, and then performs the global npm update. It synchronizes Skills for detected installations and runs Doctor afterward. When a newer CLI or MCP adapter encounters an older running Runtime, it automatically replaces it before handling requests.
243
-
244
- ## Proxy
258
+ 帮助会显示用途、账户要求、输入 Schema 和可直接运行的调用示例。远程 News 与 Smart Money 接口属于实验性能力,上游兼容性问题会返回 `CAPABILITY_UNAVAILABLE`,不会影响行情、账户和交易模块。
245
259
 
246
- REST and every public, business, and private WebSocket connection use the same proxy resolution order:
260
+ ## 代理
247
261
 
248
- 1. `proxy.url` in `config.json`
249
- 2. `HTTPS_PROXY`, `HTTP_PROXY`, or `ALL_PROXY` environment variables, with `NO_PROXY` support
250
- 3. The enabled Windows or macOS HTTP/HTTPS system proxy
251
- 4. Direct connection
262
+ REST 以及公共、业务和私有 WebSocket 统一按以下顺序解析代理:
252
263
 
253
- Linux system-wide desktop proxy settings vary by distribution; use the standard environment variables or `config.json`. Only HTTP and HTTPS proxy URLs are supported. PAC-only and SOCKS-only system settings require an HTTP proxy endpoint.
264
+ 1. `config.json` 中的 `proxy.url`
265
+ 2. `HTTPS_PROXY`、`HTTP_PROXY` 或 `ALL_PROXY`,并支持 `NO_PROXY`
266
+ 3. Windows 或 macOS 已启用的系统 HTTP/HTTPS 代理
267
+ 4. 直接连接
254
268
 
255
- Example explicit configuration:
269
+ 只支持 HTTP/HTTPS 代理 URL。仅有 PAC 或 SOCKS 的环境需要提供 HTTP 代理入口。示例:
256
270
 
257
271
  ```json
258
272
  {
@@ -262,74 +276,64 @@ Example explicit configuration:
262
276
  }
263
277
  ```
264
278
 
265
- The guided `desic-okx setup` flow tests a manually entered proxy before saving it. See `examples/config.example.json` for a complete credential-free configuration template. Restart the Runtime after changing configuration.
266
-
267
- ## Runtime behavior
268
-
269
- - Binds a random port on `127.0.0.1`
270
- - Stores PID, port, and a random access token in private local state files
271
- - Prewarms `BTC-USDT-SWAP` and `ETH-USDT-SWAP`
272
- - Subscribes to other instruments on demand and releases them after 15 minutes of inactivity
273
- - Serves fresh data from memory and uses REST for cold or stale data
274
- - Reconnects WebSockets automatically
275
- - Rebuilds the order book after sequence gaps or checksum failures
276
- - Restores persisted candle and intelligence history before live prewarming
279
+ 修改配置后重启 Runtime:
277
280
 
278
- `market_get_decision_snapshot` combines market components around one observation time. It reports every component's exchange timestamp, receive time, age, warnings, and maximum observed time skew. Trading prechecks reject inconsistent snapshots.
281
+ ```bash
282
+ desic-okx stop
283
+ ```
279
284
 
280
- ## Trading behavior
285
+ ## 更新
281
286
 
282
- Trading tools require a stable `executionKey`. Client order IDs are derived from that key, and execution state is recorded locally. When a write times out or returns an unclear result, the Runtime queries remote order state before deciding whether a retry is safe.
287
+ ```bash
288
+ desic-okx update --check
289
+ desic-okx update
290
+ desic-okx update --yes
291
+ ```
283
292
 
284
- Supported order families include:
293
+ 更新器会检查 npm 官方 Registry、停止 Runtime、等待 Windows 释放 SQLite 原生模块、执行全局升级、同步已安装 Skills,最后运行 Doctor。新版 CLI 或 MCP 适配器遇到旧 Runtime 时也会自动切换版本。
285
294
 
286
- - `limit`
287
- - `market`
288
- - `post_only`
289
- - `ioc`
290
- - `fok`
291
- - `trigger`
292
- - `conditional`
293
- - `trailing`
295
+ ## 手动接入客户端
294
296
 
295
- Ordinary and strategy orders are checked against instrument increments, minimum size, current account permission, and market snapshot consistency before submission.
297
+ 推荐使用 `desic-okx setup`。只注册 MCP 时,可运行:
296
298
 
297
- Use an OKX Demo account first. Trading software can lose money, and the project provides no investment advice or guarantee of execution quality.
299
+ ```bash
300
+ codex mcp add desic-okx -- desic-okx mcp
301
+ claude mcp add --transport stdio --scope user desic-okx -- desic-okx mcp
302
+ ```
298
303
 
299
- ## Experimental intelligence
304
+ Codex 的手动配置:
300
305
 
301
- Remote News and Smart Money use upstream interfaces that may change without notice and require a configured live OKX account; read-only API permission is sufficient. Compatibility failures return `CAPABILITY_UNAVAILABLE`, or locally persisted history when available. A failure in these modules does not disable market, account, or trading tools.
306
+ ```toml
307
+ [mcp_servers.desic-okx]
308
+ command = "desic-okx"
309
+ args = ["mcp"]
310
+ ```
302
311
 
303
- ## Development
312
+ ## 从源码开发
304
313
 
305
314
  ```bash
315
+ git clone https://github.com/xiazhi88/desic-okx-agent.git
316
+ cd desic-okx-agent
306
317
  npm ci
307
318
  npm run check
319
+ npm link
308
320
  ```
309
321
 
310
- The check pipeline runs:
311
-
312
- - TypeScript type checking
313
- - Unit tests
314
- - Skill validation
315
- - Sensitive-information scanning
316
- - Production build
317
- - MCP SDK smoke tests
318
-
319
- The optional end-to-end trading test is restricted to OKX Demo. Export the four environment variables listed in the account section, using `demo` as the environment, and then run:
320
-
321
- ```bash
322
- npm run test:demo
323
- ```
322
+ 检查流程包含 TypeScript 类型检查、单元测试、Skill 校验、敏感信息扫描、生产构建和 MCP 传输冒烟测试。普通测试不会提交订单;真实交易端到端测试仅允许 OKX Demo 环境。
324
323
 
325
- Normal tests never submit orders.
324
+ ## 运行机制
326
325
 
327
- ## Status
326
+ - Runtime 绑定 `127.0.0.1` 随机端口,并以私有状态文件保存 PID、端口和访问令牌。
327
+ - 默认预热 `BTC-USDT-SWAP` 和 `ETH-USDT-SWAP`,其他合约按需订阅并在空闲 15 分钟后释放。
328
+ - 热数据从内存返回,冷数据或过期数据由 REST 补齐。
329
+ - WebSocket 自动重连;盘口序列、校验失败时重新建立快照。
330
+ - `market_get_decision_snapshot` 对齐多个数据组件并报告最大时间偏差;交易预检拒绝不一致快照。
331
+ - 交易写操作使用稳定 `executionKey`。超时或结果不明确时先查询远端状态,不直接重复提交。
328
332
 
329
- This repository is currently pre-release software at version `0.2.0`. Unit, packaging, Skill, and MCP transport checks are automated. Real OKX Demo trading should be validated in the target network environment before a `1.0.0` release.
333
+ 交易软件可能造成资金损失。本项目不提供投资建议,也不保证执行结果。
330
334
 
331
- ## License
335
+ ## 状态与许可
332
336
 
333
- MIT. See `LICENSE`.
337
+ 当前为 `0.3.0` 预发布版本。正式发布 `1.0.0` 前,应在目标网络环境中完成 OKX Demo 交易验证。策略研究与实盘执行已在 OKX 模拟盘上端到端验证过,**实盘执行尚未经过长期真钱运行**。
334
338
 
335
- OKX and related marks belong to their respective owners.
339
+ MIT License,详见 `LICENSE`。OKX 及相关商标归其各自权利人所有。
@@ -2,6 +2,7 @@ import crypto from "node:crypto";
2
2
  import WebSocket from "ws";
3
3
  import { HttpsProxyAgent } from "https-proxy-agent";
4
4
  import { resolveProxy } from "../network/proxy.js";
5
+ import { privateWsUrl } from "../network/connectivity.js";
5
6
  export class PrivateAccountWebSockets {
6
7
  store;
7
8
  connections;
@@ -43,10 +44,9 @@ export class PrivateAccountWebSockets {
43
44
  connect(connection) {
44
45
  if (connection.stopping)
45
46
  return;
46
- const url = connection.account.environment === "demo"
47
- ? "wss://wspap.okx.com:8443/ws/v5/private"
48
- : "wss://ws.okx.com:8443/ws/v5/private";
49
- const socket = new WebSocket(url, this.agent ? { agent: this.agent } : undefined);
47
+ // Per account, not per runtime: the private feed follows whichever environment
48
+ // the credentials belong to, while market data follows its own setting.
49
+ const socket = new WebSocket(privateWsUrl(connection.account.environment), this.agent ? { agent: this.agent } : undefined);
50
50
  connection.socket = socket;
51
51
  connection.authenticated = false;
52
52
  socket.on("open", () => socket.send(JSON.stringify({ op: "login", args: [loginArgs(connection.account)] })));
@@ -1 +1 @@
1
- {"version":3,"file":"private-websocket.js","sourceRoot":"","sources":["../../src/account/private-websocket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"private-websocket.js","sourceRoot":"","sources":["../../src/account/private-websocket.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { RuntimeConfig } from "../config/schema.js";
2
2
  import { OkxClient } from "../core/okx-client.js";
3
- import { type AccountCredentials, type ToolResult } from "../core/types.js";
3
+ import { type AccountCredentials, type OkxEnvironment, type ToolResult } from "../core/types.js";
4
4
  import type { AccountStore } from "./store.js";
5
5
  export declare class AccountService {
6
6
  private readonly config;
@@ -20,3 +20,14 @@ export declare class AccountService {
20
20
  getRisk(name?: string): Promise<ToolResult<Record<string, unknown>>>;
21
21
  private wrap;
22
22
  }
23
+ export interface UnclassifiedAccountCredentials {
24
+ name: string;
25
+ apiKey: string;
26
+ secretKey: string;
27
+ passphrase: string;
28
+ }
29
+ export interface DetectedAccount {
30
+ account: AccountCredentials;
31
+ config: Record<string, unknown>;
32
+ }
33
+ export declare function detectAccountEnvironment(client: Pick<OkxClient, "privateGet">, credentials: UnclassifiedAccountCredentials, preferred?: OkxEnvironment): Promise<DetectedAccount>;
@@ -1,4 +1,5 @@
1
1
  import { resolveAccount } from "../config/loader.js";
2
+ import { RuntimeError } from "../core/errors.js";
2
3
  import { resultMeta } from "../core/types.js";
3
4
  export class AccountService {
4
5
  config;
@@ -108,6 +109,23 @@ export class AccountService {
108
109
  };
109
110
  }
110
111
  }
112
+ export async function detectAccountEnvironment(client, credentials, preferred) {
113
+ const environments = preferred === "demo" ? ["demo", "live"] : ["live", "demo"];
114
+ let lastError;
115
+ for (const environment of environments) {
116
+ const account = { ...credentials, environment };
117
+ try {
118
+ const [config] = await client.privateGet("/api/v5/account/config", account);
119
+ return { account, config: config ?? {} };
120
+ }
121
+ catch (error) {
122
+ lastError = error;
123
+ if (error instanceof RuntimeError && !["AUTH", "PERMISSION", "OKX_REJECTED"].includes(error.code))
124
+ throw error;
125
+ }
126
+ }
127
+ throw lastError ?? new RuntimeError("AUTH", "OKX account environment could not be detected");
128
+ }
111
129
  function recent(value) {
112
130
  return value && Date.now() - value.receivedAt <= 15_000 ? value : undefined;
113
131
  }