desic-okx-agent 0.1.9 → 0.2.1
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.
- package/README.en.md +273 -0
- package/README.md +155 -175
- package/dist/account/private-websocket.d.ts +1 -0
- package/dist/account/private-websocket.js +27 -2
- package/dist/account/private-websocket.js.map +1 -1
- package/dist/cli/doctor.d.ts +14 -0
- package/dist/cli/doctor.js +133 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.js +186 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/prompts.d.ts +1 -0
- package/dist/cli/prompts.js +6 -0
- package/dist/cli/prompts.js.map +1 -1
- package/dist/cli/render.d.ts +8 -0
- package/dist/cli/render.js +73 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/market/store.d.ts +1 -0
- package/dist/market/store.js +24 -0
- package/dist/market/store.js.map +1 -1
- package/dist/market/websocket.d.ts +1 -0
- package/dist/market/websocket.js +13 -0
- package/dist/market/websocket.js.map +1 -1
- package/dist/runtime/client.d.ts +1 -0
- package/dist/runtime/client.js +46 -2
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/server.js +21 -2
- package/dist/runtime/server.js.map +1 -1
- package/dist/setup/installer.d.ts +21 -0
- package/dist/setup/installer.js +113 -27
- package/dist/setup/installer.js.map +1 -1
- package/dist/setup/wizard.d.ts +3 -0
- package/dist/setup/wizard.js +131 -3
- package/dist/setup/wizard.js.map +1 -1
- package/dist/storage/database.d.ts +2 -0
- package/dist/storage/database.js +23 -0
- package/dist/storage/database.js.map +1 -1
- package/dist/tools/catalog.js +1 -1
- package/dist/tools/catalog.js.map +1 -1
- package/dist/tools/help.d.ts +10 -0
- package/dist/tools/help.js +79 -0
- package/dist/tools/help.js.map +1 -0
- package/dist/update/service.d.ts +10 -0
- package/dist/update/service.js +104 -0
- package/dist/update/service.js.map +1 -0
- package/package.json +2 -1
- package/skills/okx-news-intelligence/SKILL.md +2 -0
- package/skills/okx-smart-money-analysis/SKILL.md +2 -0
package/README.md
CHANGED
|
@@ -1,55 +1,54 @@
|
|
|
1
1
|
# Desic OKX Agent
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[简体中文](README.md) | [English](README.en.md)
|
|
4
4
|
|
|
5
|
-
|
|
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
|
|
9
|
-
|
|
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.
|
|
5
|
+
面向 Codex、Claude Code 及其他 MCP 客户端的独立 OKX 本地 Runtime、MCP Server、CLI 和 Agent Skills。
|
|
21
6
|
|
|
22
|
-
|
|
7
|
+
> [!IMPORTANT]
|
|
8
|
+
> Desic OKX Agent 是独立的社区项目,并非 OKX 官方产品,也未获得 OKX 的认可或背书。
|
|
23
9
|
|
|
24
|
-
|
|
25
|
-
- npm
|
|
26
|
-
- Network access to OKX, or an HTTP/HTTPS proxy that can reach OKX
|
|
10
|
+
## 安装
|
|
27
11
|
|
|
28
|
-
|
|
12
|
+
要求 Node.js 22.12 或更高版本,以及能够访问 OKX 的网络或 HTTP/HTTPS 代理。
|
|
29
13
|
|
|
30
|
-
|
|
14
|
+
首次安装只需两条命令:
|
|
31
15
|
|
|
32
16
|
```bash
|
|
33
17
|
npm install --global desic-okx-agent
|
|
18
|
+
desic-okx setup
|
|
34
19
|
```
|
|
35
20
|
|
|
36
|
-
|
|
21
|
+
两条命令作用不同:
|
|
22
|
+
|
|
23
|
+
1. `npm install` 安装 `desic-okx` 程序。
|
|
24
|
+
2. `desic-okx setup` 接入 AI 客户端、安装 Skills、检查网络,并询问是否配置 OKX API 账户。
|
|
37
25
|
|
|
38
|
-
|
|
26
|
+
首次安装后需要运行一次 `setup`。以后正常升级无需重复运行;只有新增 AI 客户端、修复配置或重新配置代理时才需要再次运行。
|
|
39
27
|
|
|
40
|
-
|
|
28
|
+
完成后重启已选择的 AI 客户端,并验证:
|
|
41
29
|
|
|
42
30
|
```bash
|
|
43
|
-
desic-okx
|
|
31
|
+
desic-okx doctor
|
|
44
32
|
```
|
|
45
33
|
|
|
46
|
-
|
|
34
|
+
## Setup 会做什么
|
|
47
35
|
|
|
48
|
-
|
|
36
|
+
交互式向导会依次完成:
|
|
49
37
|
|
|
50
|
-
|
|
38
|
+
1. 选择 Codex、Claude Code、Cursor、VS Code / GitHub Copilot、Cline,或全部客户端。
|
|
39
|
+
2. 注册 `desic-okx` MCP Server,保留已有 MCP 配置。
|
|
40
|
+
3. 为 Codex 和 Claude Code 自动安装全部 7 个 Skills。
|
|
41
|
+
4. 检查 OKX REST 与 WebSocket;连接失败时引导测试并保存 HTTP 代理。
|
|
42
|
+
5. 解释不同功能的 API Key 要求,并让用户选择“现在配置”或“以后配置”。
|
|
43
|
+
6. 如果现在配置,隐藏凭证输入,先向 OKX 验证,成功后才写入本地配置。
|
|
51
44
|
|
|
52
|
-
|
|
45
|
+
API 账户是可选的。跳过后公共行情和公共衍生品仍可使用,以后运行下面的命令即可配置:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
desic-okx account add
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
自动化或无人值守安装可以指定客户端;该模式不会询问或保存 API 凭证:
|
|
53
52
|
|
|
54
53
|
```bash
|
|
55
54
|
desic-okx setup --targets codex --yes
|
|
@@ -58,106 +57,98 @@ desic-okx setup --all --yes
|
|
|
58
57
|
desic-okx setup --targets codex --yes --skip-network-check
|
|
59
58
|
```
|
|
60
59
|
|
|
61
|
-
|
|
60
|
+
## 配置 OKX API
|
|
62
61
|
|
|
63
|
-
|
|
62
|
+
在 OKX 官方网站或 App 中创建 API Key。实盘账户与模拟交易账户使用各自环境的 API Key;在向导中必须选择对应的 `live` 或 `demo` 环境。
|
|
64
63
|
|
|
65
|
-
|
|
64
|
+
按实际用途授予权限:
|
|
66
65
|
|
|
67
|
-
|
|
66
|
+
| 功能 | 是否需要 API Key | 所需条件 |
|
|
67
|
+
| --- | --- | --- |
|
|
68
|
+
| 公共行情、K 线、盘口、衍生品分析 | 否 | 无 |
|
|
69
|
+
| 余额、持仓、订单、成交、风险摘要 | 是 | 读取权限 |
|
|
70
|
+
| 远程 News、Smart Money | 是 | `live` 账户,读取权限即可 |
|
|
71
|
+
| 下单、改单、撤单、平仓、设置杠杆 | 是 | OKX API Key 具备交易权限 |
|
|
68
72
|
|
|
69
|
-
|
|
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
|
|
73
|
-
|
|
74
|
-
Verify the installation with `desic-okx status` and `desic-okx tools`. Do not ask for or configure any OKX API credentials. Confirm that public market tools are ready to use.
|
|
75
|
-
```
|
|
73
|
+
本项目不提供提现、充值、资金划转、资产转出或 API Key 管理工具,不需要为此授予相关权限。建议先使用 OKX 模拟交易账户验证交易流程,并按自己的安全策略在 OKX 配置 IP 白名单。
|
|
76
74
|
|
|
77
|
-
|
|
75
|
+
交互式添加账户:
|
|
78
76
|
|
|
79
77
|
```bash
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
npm ci
|
|
83
|
-
npm run build
|
|
84
|
-
npm link
|
|
78
|
+
desic-okx account add --name demo --environment demo
|
|
79
|
+
desic-okx account add --name main --environment live
|
|
85
80
|
```
|
|
86
81
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
Public market tools do not require an account:
|
|
82
|
+
输入 API Key、Secret Key 和 Passphrase 时终端会隐藏文本。`account add` 会先连接 OKX 验证,验证失败不会保存凭证。凭证保存在系统配置目录的 `config.json` 中;Unix 权限为 `0600`:
|
|
90
83
|
|
|
91
84
|
```bash
|
|
92
|
-
desic-okx
|
|
93
|
-
desic-okx call market_get_ticker --json '{"instId":"BTC-USDT-SWAP"}'
|
|
94
|
-
desic-okx call market_get_decision_snapshot --json '{"instId":"BTC-USDT-SWAP","bar":"1m"}'
|
|
85
|
+
desic-okx config-path
|
|
95
86
|
```
|
|
96
87
|
|
|
97
|
-
|
|
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.
|
|
99
|
-
|
|
100
|
-
Useful Runtime commands:
|
|
88
|
+
也支持环境变量覆盖同名账户:
|
|
101
89
|
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
90
|
+
```text
|
|
91
|
+
OKX_ACCOUNT
|
|
92
|
+
OKX_API_KEY
|
|
93
|
+
OKX_API_SECRET
|
|
94
|
+
OKX_API_PASSPHRASE
|
|
95
|
+
OKX_ENVIRONMENT=demo|live
|
|
106
96
|
```
|
|
107
97
|
|
|
108
|
-
|
|
98
|
+
三个凭证变量必须同时提供。能否交易完全取决于 OKX 为该 API Key 配置的官方权限。
|
|
109
99
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
```bash
|
|
113
|
-
codex mcp add desic-okx -- desic-okx mcp
|
|
114
|
-
```
|
|
100
|
+
## 让 AI 自动安装
|
|
115
101
|
|
|
116
|
-
|
|
102
|
+
可将下面的提示词交给 Codex、Claude Code、Cursor、VS Code / GitHub Copilot 或 Cline。将 `codex` 替换为 `claude-code`、`cursor`、`vscode`、`cline` 或 `all`:
|
|
117
103
|
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
104
|
+
```text
|
|
105
|
+
请为我安装 Desic OKX Agent:
|
|
106
|
+
1. 检查 Node.js 是否为 22.12 或更高版本。
|
|
107
|
+
2. 运行 npm install --global desic-okx-agent。
|
|
108
|
+
3. 运行 desic-okx setup --targets codex --yes。
|
|
109
|
+
4. 运行 desic-okx doctor 验证 MCP、Skills 和 OKX 网络。
|
|
110
|
+
5. 不要要求我在聊天中发送任何 API Key、Secret 或 Passphrase。
|
|
111
|
+
6. 告诉我公共工具已可使用;如果我需要账户、News、Smart Money 或交易功能,引导我直接在自己的终端运行 desic-okx account add,并由我在隐藏输入框中填写凭证。
|
|
122
112
|
```
|
|
123
113
|
|
|
124
|
-
##
|
|
114
|
+
## 快速开始
|
|
125
115
|
|
|
126
|
-
|
|
116
|
+
公共行情不需要账户:
|
|
127
117
|
|
|
128
118
|
```bash
|
|
129
|
-
|
|
119
|
+
desic-okx call market_get_ticker --json '{"instId":"BTC-USDT-SWAP"}'
|
|
120
|
+
desic-okx call market_get_decision_snapshot --json '{"instId":"BTC-USDT-SWAP","bar":"1m"}'
|
|
130
121
|
```
|
|
131
122
|
|
|
132
|
-
|
|
123
|
+
Runtime 会在 MCP 或 CLI 首次调用时自动启动,通常不需要手动运行 `desic-okx start`。
|
|
124
|
+
|
|
125
|
+
常用命令:
|
|
133
126
|
|
|
134
127
|
```bash
|
|
135
|
-
|
|
128
|
+
desic-okx status
|
|
129
|
+
desic-okx doctor
|
|
130
|
+
desic-okx tools
|
|
131
|
+
desic-okx tool market_get_decision_snapshot
|
|
132
|
+
desic-okx account list
|
|
133
|
+
desic-okx update --check
|
|
136
134
|
```
|
|
137
135
|
|
|
138
|
-
|
|
136
|
+
`status` 显示 Runtime 版本、运行时间、代理路径、WebSocket 状态、订阅与数据年龄、账户和数据库状态。`doctor` 主动检查安装、网络、SQLite、行情、账户、MCP 客户端和 Skills。两者均支持 `--json`。
|
|
139
137
|
|
|
140
|
-
##
|
|
141
|
-
|
|
142
|
-
`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.
|
|
143
|
-
|
|
144
|
-
To install selected Skills manually, copy their directories from the installed package:
|
|
145
|
-
|
|
146
|
-
Codex personal skills:
|
|
147
|
-
|
|
148
|
-
```text
|
|
149
|
-
${CODEX_HOME:-~/.codex}/skills/<skill-name>/SKILL.md
|
|
150
|
-
```
|
|
138
|
+
## 主要能力
|
|
151
139
|
|
|
152
|
-
|
|
140
|
+
- 共享单例 Runtime,可被多个 MCP 和 CLI 客户端复用
|
|
141
|
+
- 内存中的 ticker、盘口、逐笔成交、K 线、资金费率、标记价格和持仓量
|
|
142
|
+
- 带新鲜度、交易所时间和一致性元数据的统一决策快照
|
|
143
|
+
- 公共行情、指标扫描和公共衍生品分析
|
|
144
|
+
- 账户余额、持仓、委托、成交、账单及风险摘要
|
|
145
|
+
- 普通单、策略单、杠杆、改单、撤单和平仓操作
|
|
146
|
+
- 实验性的 News 与 Smart Money 能力,以及 SQLite 历史回退
|
|
147
|
+
- SQLite WAL 持久化已收盘 K 线、情报历史、派生事件和执行记录
|
|
153
148
|
|
|
154
|
-
|
|
155
|
-
~/.claude/skills/<skill-name>/SKILL.md
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
Project-scoped alternatives are `.agents/skills/` for Codex and `.claude/skills/` for Claude Code.
|
|
149
|
+
## Skills
|
|
159
150
|
|
|
160
|
-
|
|
151
|
+
`desic-okx setup` 会为 Codex 和 Claude Code 自动安装:
|
|
161
152
|
|
|
162
153
|
- `okx-market-analysis`
|
|
163
154
|
- `okx-derivatives-analysis`
|
|
@@ -167,50 +158,49 @@ Included skills:
|
|
|
167
158
|
- `okx-trading`
|
|
168
159
|
- `trading-philosophy`
|
|
169
160
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
## Configure an OKX account
|
|
173
|
-
|
|
174
|
-
Public tools work without credentials. Account and trading tools use a named account alias and never accept credentials as tool arguments.
|
|
175
|
-
|
|
176
|
-
Add and verify an account interactively:
|
|
161
|
+
升级后 Skills 会自动同步。也可手动检查或同步;被修改的旧版本会先备份:
|
|
177
162
|
|
|
178
163
|
```bash
|
|
179
|
-
desic-okx
|
|
180
|
-
desic-okx
|
|
181
|
-
desic-okx
|
|
164
|
+
desic-okx skills status
|
|
165
|
+
desic-okx skills sync
|
|
166
|
+
desic-okx skills sync --targets codex --dry-run
|
|
182
167
|
```
|
|
183
168
|
|
|
184
|
-
|
|
169
|
+
## 账户管理
|
|
185
170
|
|
|
186
171
|
```bash
|
|
187
|
-
desic-okx
|
|
172
|
+
desic-okx account list
|
|
173
|
+
desic-okx account verify --name main
|
|
174
|
+
desic-okx account verify --all
|
|
175
|
+
desic-okx account set-default main
|
|
176
|
+
desic-okx account rename main primary
|
|
177
|
+
desic-okx account edit primary
|
|
178
|
+
desic-okx account remove primary
|
|
188
179
|
```
|
|
189
180
|
|
|
190
|
-
|
|
181
|
+
`account add` 和 `account edit` 均在写入配置前验证凭证。工具参数只接受账户别名,不接受 API Key、Secret 或 Passphrase。
|
|
191
182
|
|
|
192
|
-
|
|
193
|
-
OKX_ACCOUNT
|
|
194
|
-
OKX_API_KEY
|
|
195
|
-
OKX_API_SECRET
|
|
196
|
-
OKX_API_PASSPHRASE
|
|
197
|
-
OKX_ENVIRONMENT=demo|live
|
|
198
|
-
```
|
|
183
|
+
## 工具帮助
|
|
199
184
|
|
|
200
|
-
|
|
185
|
+
```bash
|
|
186
|
+
desic-okx tools
|
|
187
|
+
desic-okx tool news_search
|
|
188
|
+
desic-okx tool trade_place_order
|
|
189
|
+
desic-okx tool trade_place_order --json
|
|
190
|
+
```
|
|
201
191
|
|
|
202
|
-
|
|
192
|
+
帮助会显示用途、账户要求、输入 Schema 和可直接运行的调用示例。远程 News 与 Smart Money 接口属于实验性能力,上游兼容性问题会返回 `CAPABILITY_UNAVAILABLE`,不会影响行情、账户和交易模块。
|
|
203
193
|
|
|
204
|
-
|
|
194
|
+
## 代理
|
|
205
195
|
|
|
206
|
-
|
|
207
|
-
2. `HTTPS_PROXY`, `HTTP_PROXY`, or `ALL_PROXY` environment variables, with `NO_PROXY` support
|
|
208
|
-
3. The enabled Windows or macOS HTTP/HTTPS system proxy
|
|
209
|
-
4. Direct connection
|
|
196
|
+
REST 以及公共、业务和私有 WebSocket 统一按以下顺序解析代理:
|
|
210
197
|
|
|
211
|
-
|
|
198
|
+
1. `config.json` 中的 `proxy.url`
|
|
199
|
+
2. `HTTPS_PROXY`、`HTTP_PROXY` 或 `ALL_PROXY`,并支持 `NO_PROXY`
|
|
200
|
+
3. Windows 或 macOS 已启用的系统 HTTP/HTTPS 代理
|
|
201
|
+
4. 直接连接
|
|
212
202
|
|
|
213
|
-
|
|
203
|
+
只支持 HTTP/HTTPS 代理 URL。仅有 PAC 或 SOCKS 的环境需要提供 HTTP 代理入口。示例:
|
|
214
204
|
|
|
215
205
|
```json
|
|
216
206
|
{
|
|
@@ -220,74 +210,64 @@ Example explicit configuration:
|
|
|
220
210
|
}
|
|
221
211
|
```
|
|
222
212
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
## Runtime behavior
|
|
226
|
-
|
|
227
|
-
- Binds a random port on `127.0.0.1`
|
|
228
|
-
- Stores PID, port, and a random access token in private local state files
|
|
229
|
-
- Prewarms `BTC-USDT-SWAP` and `ETH-USDT-SWAP`
|
|
230
|
-
- Subscribes to other instruments on demand and releases them after 15 minutes of inactivity
|
|
231
|
-
- Serves fresh data from memory and uses REST for cold or stale data
|
|
232
|
-
- Reconnects WebSockets automatically
|
|
233
|
-
- Rebuilds the order book after sequence gaps or checksum failures
|
|
234
|
-
- Restores persisted candle and intelligence history before live prewarming
|
|
213
|
+
修改配置后重启 Runtime:
|
|
235
214
|
|
|
236
|
-
|
|
215
|
+
```bash
|
|
216
|
+
desic-okx stop
|
|
217
|
+
```
|
|
237
218
|
|
|
238
|
-
##
|
|
219
|
+
## 更新
|
|
239
220
|
|
|
240
|
-
|
|
221
|
+
```bash
|
|
222
|
+
desic-okx update --check
|
|
223
|
+
desic-okx update
|
|
224
|
+
desic-okx update --yes
|
|
225
|
+
```
|
|
241
226
|
|
|
242
|
-
|
|
227
|
+
更新器会检查 npm 官方 Registry、停止 Runtime、等待 Windows 释放 SQLite 原生模块、执行全局升级、同步已安装 Skills,最后运行 Doctor。新版 CLI 或 MCP 适配器遇到旧 Runtime 时也会自动切换版本。
|
|
243
228
|
|
|
244
|
-
|
|
245
|
-
- `market`
|
|
246
|
-
- `post_only`
|
|
247
|
-
- `ioc`
|
|
248
|
-
- `fok`
|
|
249
|
-
- `trigger`
|
|
250
|
-
- `conditional`
|
|
251
|
-
- `trailing`
|
|
229
|
+
## 手动接入客户端
|
|
252
230
|
|
|
253
|
-
|
|
231
|
+
推荐使用 `desic-okx setup`。只注册 MCP 时,可运行:
|
|
254
232
|
|
|
255
|
-
|
|
233
|
+
```bash
|
|
234
|
+
codex mcp add desic-okx -- desic-okx mcp
|
|
235
|
+
claude mcp add --transport stdio --scope user desic-okx -- desic-okx mcp
|
|
236
|
+
```
|
|
256
237
|
|
|
257
|
-
|
|
238
|
+
Codex 的手动配置:
|
|
258
239
|
|
|
259
|
-
|
|
240
|
+
```toml
|
|
241
|
+
[mcp_servers.desic-okx]
|
|
242
|
+
command = "desic-okx"
|
|
243
|
+
args = ["mcp"]
|
|
244
|
+
```
|
|
260
245
|
|
|
261
|
-
##
|
|
246
|
+
## 从源码开发
|
|
262
247
|
|
|
263
248
|
```bash
|
|
249
|
+
git clone https://github.com/xiazhi88/desic-okx-agent.git
|
|
250
|
+
cd desic-okx-agent
|
|
264
251
|
npm ci
|
|
265
252
|
npm run check
|
|
253
|
+
npm link
|
|
266
254
|
```
|
|
267
255
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
- TypeScript type checking
|
|
271
|
-
- Unit tests
|
|
272
|
-
- Skill validation
|
|
273
|
-
- Sensitive-information scanning
|
|
274
|
-
- Production build
|
|
275
|
-
- MCP SDK smoke tests
|
|
276
|
-
|
|
277
|
-
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:
|
|
278
|
-
|
|
279
|
-
```bash
|
|
280
|
-
npm run test:demo
|
|
281
|
-
```
|
|
256
|
+
检查流程包含 TypeScript 类型检查、单元测试、Skill 校验、敏感信息扫描、生产构建和 MCP 传输冒烟测试。普通测试不会提交订单;真实交易端到端测试仅允许 OKX Demo 环境。
|
|
282
257
|
|
|
283
|
-
|
|
258
|
+
## 运行机制
|
|
284
259
|
|
|
285
|
-
|
|
260
|
+
- Runtime 绑定 `127.0.0.1` 随机端口,并以私有状态文件保存 PID、端口和访问令牌。
|
|
261
|
+
- 默认预热 `BTC-USDT-SWAP` 和 `ETH-USDT-SWAP`,其他合约按需订阅并在空闲 15 分钟后释放。
|
|
262
|
+
- 热数据从内存返回,冷数据或过期数据由 REST 补齐。
|
|
263
|
+
- WebSocket 自动重连;盘口序列、校验失败时重新建立快照。
|
|
264
|
+
- `market_get_decision_snapshot` 对齐多个数据组件并报告最大时间偏差;交易预检拒绝不一致快照。
|
|
265
|
+
- 交易写操作使用稳定 `executionKey`。超时或结果不明确时先查询远端状态,不直接重复提交。
|
|
286
266
|
|
|
287
|
-
|
|
267
|
+
交易软件可能造成资金损失。本项目不提供投资建议,也不保证执行结果。
|
|
288
268
|
|
|
289
|
-
##
|
|
269
|
+
## 状态与许可
|
|
290
270
|
|
|
291
|
-
|
|
271
|
+
当前为 `0.2.1` 预发布版本。正式发布 `1.0.0` 前,应在目标网络环境中完成 OKX Demo 交易验证。
|
|
292
272
|
|
|
293
|
-
|
|
273
|
+
MIT License,详见 `LICENSE`。OKX 及相关商标归其各自权利人所有。
|
|
@@ -8,7 +8,9 @@ export class PrivateAccountWebSockets {
|
|
|
8
8
|
agent;
|
|
9
9
|
constructor(config, store) {
|
|
10
10
|
this.store = store;
|
|
11
|
-
this.connections = Object.entries(config.accounts).map(([name, account]) => ({
|
|
11
|
+
this.connections = Object.entries(config.accounts).map(([name, account]) => ({
|
|
12
|
+
account: { name, ...account }, stopping: false, attempt: 0, authenticated: false
|
|
13
|
+
}));
|
|
12
14
|
const proxyUrl = resolveProxy(config.proxy.url).url;
|
|
13
15
|
this.agent = proxyUrl ? new HttpsProxyAgent(proxyUrl) : undefined;
|
|
14
16
|
}
|
|
@@ -26,6 +28,18 @@ export class PrivateAccountWebSockets {
|
|
|
26
28
|
connection.socket?.close();
|
|
27
29
|
}
|
|
28
30
|
}
|
|
31
|
+
status() {
|
|
32
|
+
const states = ["connecting", "open", "closing", "closed"];
|
|
33
|
+
return this.connections.map((connection) => ({
|
|
34
|
+
account: connection.account.name,
|
|
35
|
+
environment: connection.account.environment,
|
|
36
|
+
state: connection.socket ? states[connection.socket.readyState] ?? "unknown" : "not-started",
|
|
37
|
+
authenticated: connection.authenticated,
|
|
38
|
+
reconnectAttempt: connection.attempt,
|
|
39
|
+
lastMessageAt: connection.lastMessageAt ?? null,
|
|
40
|
+
lastError: connection.lastError ?? null
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
29
43
|
connect(connection) {
|
|
30
44
|
if (connection.stopping)
|
|
31
45
|
return;
|
|
@@ -34,10 +48,14 @@ export class PrivateAccountWebSockets {
|
|
|
34
48
|
: "wss://ws.okx.com:8443/ws/v5/private";
|
|
35
49
|
const socket = new WebSocket(url, this.agent ? { agent: this.agent } : undefined);
|
|
36
50
|
connection.socket = socket;
|
|
51
|
+
connection.authenticated = false;
|
|
37
52
|
socket.on("open", () => socket.send(JSON.stringify({ op: "login", args: [loginArgs(connection.account)] })));
|
|
38
53
|
socket.on("message", (buffer) => this.message(connection, buffer.toString()));
|
|
39
54
|
socket.on("close", () => this.reconnect(connection));
|
|
40
|
-
socket.on("error", () =>
|
|
55
|
+
socket.on("error", (error) => {
|
|
56
|
+
connection.lastError = error.message;
|
|
57
|
+
socket.close();
|
|
58
|
+
});
|
|
41
59
|
}
|
|
42
60
|
reconnect(connection) {
|
|
43
61
|
if (connection.stopping || connection.reconnect)
|
|
@@ -55,6 +73,7 @@ export class PrivateAccountWebSockets {
|
|
|
55
73
|
message(connection, text) {
|
|
56
74
|
if (text === "pong")
|
|
57
75
|
return;
|
|
76
|
+
connection.lastMessageAt = Date.now();
|
|
58
77
|
let message;
|
|
59
78
|
try {
|
|
60
79
|
message = JSON.parse(text);
|
|
@@ -64,6 +83,8 @@ export class PrivateAccountWebSockets {
|
|
|
64
83
|
}
|
|
65
84
|
if (message.event === "login" && message.code === "0") {
|
|
66
85
|
connection.attempt = 0;
|
|
86
|
+
connection.authenticated = true;
|
|
87
|
+
connection.lastError = undefined;
|
|
67
88
|
connection.socket?.send(JSON.stringify({
|
|
68
89
|
op: "subscribe",
|
|
69
90
|
args: [
|
|
@@ -80,6 +101,10 @@ export class PrivateAccountWebSockets {
|
|
|
80
101
|
connection.heartbeat.unref();
|
|
81
102
|
return;
|
|
82
103
|
}
|
|
104
|
+
if (message.event === "login" && message.code !== "0") {
|
|
105
|
+
connection.authenticated = false;
|
|
106
|
+
connection.lastError = String(message.msg ?? `Login failed with code ${String(message.code ?? "unknown")}`);
|
|
107
|
+
}
|
|
83
108
|
const arg = message.arg;
|
|
84
109
|
const data = Array.isArray(message.data) ? message.data : [];
|
|
85
110
|
if (!arg?.channel || !data.length)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"private-websocket.js","sourceRoot":"","sources":["../../src/account/private-websocket.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"private-websocket.js","sourceRoot":"","sources":["../../src/account/private-websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type DoctorStatus = "pass" | "warn" | "fail";
|
|
2
|
+
export interface DoctorCheck {
|
|
3
|
+
name: string;
|
|
4
|
+
status: DoctorStatus;
|
|
5
|
+
details: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DoctorReport {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
version: string;
|
|
10
|
+
checkedAt: number;
|
|
11
|
+
checks: DoctorCheck[];
|
|
12
|
+
}
|
|
13
|
+
export declare function runDoctor(): Promise<DoctorReport>;
|
|
14
|
+
export declare function formatDoctor(reportValue: DoctorReport): string;
|