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.
- package/README.en.md +353 -0
- package/README.md +194 -190
- package/dist/account/private-websocket.js +4 -4
- package/dist/account/private-websocket.js.map +1 -1
- package/dist/account/service.d.ts +12 -1
- package/dist/account/service.js +18 -0
- package/dist/account/service.js.map +1 -1
- package/dist/bars/rate-limiter.d.ts +18 -0
- package/dist/bars/rate-limiter.js +84 -0
- package/dist/bars/rate-limiter.js.map +1 -0
- package/dist/bars/schema.d.ts +36 -0
- package/dist/bars/schema.js +134 -0
- package/dist/bars/schema.js.map +1 -0
- package/dist/bars/service.d.ts +60 -0
- package/dist/bars/service.js +120 -0
- package/dist/bars/service.js.map +1 -0
- package/dist/bars/store.d.ts +105 -0
- package/dist/bars/store.js +415 -0
- package/dist/bars/store.js.map +1 -0
- package/dist/bars/timeframe.d.ts +40 -0
- package/dist/bars/timeframe.js +146 -0
- package/dist/bars/timeframe.js.map +1 -0
- package/dist/bars/types.d.ts +68 -0
- package/dist/bars/types.js +13 -0
- package/dist/bars/types.js.map +1 -0
- package/dist/cli/data-render.d.ts +37 -0
- package/dist/cli/data-render.js +143 -0
- package/dist/cli/data-render.js.map +1 -0
- package/dist/cli/doctor.js +7 -3
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.js +758 -27
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/live-render.d.ts +24 -0
- package/dist/cli/live-render.js +85 -0
- package/dist/cli/live-render.js.map +1 -0
- package/dist/cli/range.d.ts +28 -0
- package/dist/cli/range.js +63 -0
- package/dist/cli/range.js.map +1 -0
- package/dist/cli/render.js +3 -0
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/strategy-render.d.ts +36 -0
- package/dist/cli/strategy-render.js +391 -0
- package/dist/cli/strategy-render.js.map +1 -0
- package/dist/cli/width.d.ts +18 -0
- package/dist/cli/width.js +71 -0
- package/dist/cli/width.js.map +1 -0
- package/dist/config/loader.js +1 -1
- package/dist/config/schema.d.ts +7 -0
- package/dist/config/schema.js +24 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/core/okx-client.d.ts +9 -1
- package/dist/core/okx-client.js +14 -5
- package/dist/core/okx-client.js.map +1 -1
- package/dist/i18n/locale.d.ts +24 -0
- package/dist/i18n/locale.js +65 -0
- package/dist/i18n/locale.js.map +1 -0
- package/dist/i18n/messages.d.ts +333 -0
- package/dist/i18n/messages.js +660 -0
- package/dist/i18n/messages.js.map +1 -0
- package/dist/live/account-snapshot.d.ts +30 -0
- package/dist/live/account-snapshot.js +130 -0
- package/dist/live/account-snapshot.js.map +1 -0
- package/dist/live/cutoff-queue.d.ts +42 -0
- package/dist/live/cutoff-queue.js +69 -0
- package/dist/live/cutoff-queue.js.map +1 -0
- package/dist/live/execution-key.d.ts +23 -0
- package/dist/live/execution-key.js +31 -0
- package/dist/live/execution-key.js.map +1 -0
- package/dist/live/failures.d.ts +37 -0
- package/dist/live/failures.js +57 -0
- package/dist/live/failures.js.map +1 -0
- package/dist/live/gates.d.ts +65 -0
- package/dist/live/gates.js +136 -0
- package/dist/live/gates.js.map +1 -0
- package/dist/live/loop.d.ts +56 -0
- package/dist/live/loop.js +197 -0
- package/dist/live/loop.js.map +1 -0
- package/dist/live/preconditions.d.ts +48 -0
- package/dist/live/preconditions.js +69 -0
- package/dist/live/preconditions.js.map +1 -0
- package/dist/live/reconcile.d.ts +46 -0
- package/dist/live/reconcile.js +104 -0
- package/dist/live/reconcile.js.map +1 -0
- package/dist/live/runner.d.ts +57 -0
- package/dist/live/runner.js +160 -0
- package/dist/live/runner.js.map +1 -0
- package/dist/live/schema.d.ts +18 -0
- package/dist/live/schema.js +91 -0
- package/dist/live/schema.js.map +1 -0
- package/dist/live/service.d.ts +144 -0
- package/dist/live/service.js +303 -0
- package/dist/live/service.js.map +1 -0
- package/dist/live/session.d.ts +85 -0
- package/dist/live/session.js +234 -0
- package/dist/live/session.js.map +1 -0
- package/dist/live/sizing.d.ts +62 -0
- package/dist/live/sizing.js +79 -0
- package/dist/live/sizing.js.map +1 -0
- package/dist/live/store.d.ts +123 -0
- package/dist/live/store.js +350 -0
- package/dist/live/store.js.map +1 -0
- package/dist/live/types.d.ts +82 -0
- package/dist/live/types.js +2 -0
- package/dist/live/types.js.map +1 -0
- package/dist/market/websocket.d.ts +16 -1
- package/dist/market/websocket.js +60 -5
- package/dist/market/websocket.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +15 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/network/connectivity.d.ts +9 -1
- package/dist/network/connectivity.js +28 -1
- package/dist/network/connectivity.js.map +1 -1
- package/dist/report/chart-script.d.ts +12 -0
- package/dist/report/chart-script.js +146 -0
- package/dist/report/chart-script.js.map +1 -0
- package/dist/report/compare-html.d.ts +8 -0
- package/dist/report/compare-html.js +254 -0
- package/dist/report/compare-html.js.map +1 -0
- package/dist/report/compare-script.d.ts +12 -0
- package/dist/report/compare-script.js +109 -0
- package/dist/report/compare-script.js.map +1 -0
- package/dist/report/compare.d.ts +61 -0
- package/dist/report/compare.js +205 -0
- package/dist/report/compare.js.map +1 -0
- package/dist/report/fetch.d.ts +20 -0
- package/dist/report/fetch.js +56 -0
- package/dist/report/fetch.js.map +1 -0
- package/dist/report/html.d.ts +54 -0
- package/dist/report/html.js +641 -0
- package/dist/report/html.js.map +1 -0
- package/dist/report/open.d.ts +42 -0
- package/dist/report/open.js +114 -0
- package/dist/report/open.js.map +1 -0
- package/dist/runtime/server.d.ts +16 -1
- package/dist/runtime/server.js +112 -9
- package/dist/runtime/server.js.map +1 -1
- package/dist/setup/installer.d.ts +1 -0
- package/dist/setup/installer.js +8 -0
- package/dist/setup/installer.js.map +1 -1
- package/dist/setup/wizard.d.ts +3 -0
- package/dist/setup/wizard.js +131 -6
- package/dist/setup/wizard.js.map +1 -1
- package/dist/strategy/constants.d.ts +23 -0
- package/dist/strategy/constants.js +24 -0
- package/dist/strategy/constants.js.map +1 -0
- package/dist/strategy/environment.d.ts +52 -0
- package/dist/strategy/environment.js +187 -0
- package/dist/strategy/environment.js.map +1 -0
- package/dist/strategy/instrument.d.ts +29 -0
- package/dist/strategy/instrument.js +39 -0
- package/dist/strategy/instrument.js.map +1 -0
- package/dist/strategy/optimize.d.ts +73 -0
- package/dist/strategy/optimize.js +113 -0
- package/dist/strategy/optimize.js.map +1 -0
- package/dist/strategy/parameter-space.d.ts +59 -0
- package/dist/strategy/parameter-space.js +221 -0
- package/dist/strategy/parameter-space.js.map +1 -0
- package/dist/strategy/python-bridge.d.ts +24 -0
- package/dist/strategy/python-bridge.js +114 -0
- package/dist/strategy/python-bridge.js.map +1 -0
- package/dist/strategy/schema.d.ts +9 -0
- package/dist/strategy/schema.js +91 -0
- package/dist/strategy/schema.js.map +1 -0
- package/dist/strategy/service.d.ts +138 -0
- package/dist/strategy/service.js +745 -0
- package/dist/strategy/service.js.map +1 -0
- package/dist/strategy/settings.d.ts +162 -0
- package/dist/strategy/settings.js +243 -0
- package/dist/strategy/settings.js.map +1 -0
- package/dist/strategy/store.d.ts +96 -0
- package/dist/strategy/store.js +367 -0
- package/dist/strategy/store.js.map +1 -0
- package/dist/strategy/templates.d.ts +11 -0
- package/dist/strategy/templates.js +134 -0
- package/dist/strategy/templates.js.map +1 -0
- package/dist/strategy/types.d.ts +111 -0
- package/dist/strategy/types.js +2 -0
- package/dist/strategy/types.js.map +1 -0
- package/dist/tools/catalog.d.ts +16 -0
- package/dist/tools/catalog.js +118 -17
- package/dist/tools/catalog.js.map +1 -1
- package/dist/trade/service.d.ts +12 -0
- package/dist/trade/service.js +24 -7
- package/dist/trade/service.js.map +1 -1
- package/dist/tui/app.d.ts +23 -0
- package/dist/tui/app.js +322 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/commands.d.ts +70 -0
- package/dist/tui/commands.js +313 -0
- package/dist/tui/commands.js.map +1 -0
- package/dist/tui/entries.d.ts +17 -0
- package/dist/tui/entries.js +24 -0
- package/dist/tui/entries.js.map +1 -0
- package/dist/tui/execute.d.ts +26 -0
- package/dist/tui/execute.js +664 -0
- package/dist/tui/execute.js.map +1 -0
- package/dist/tui/history.d.ts +17 -0
- package/dist/tui/history.js +48 -0
- package/dist/tui/history.js.map +1 -0
- package/dist/tui/index.d.ts +8 -0
- package/dist/tui/index.js +48 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/line-editor.d.ts +44 -0
- package/dist/tui/line-editor.js +98 -0
- package/dist/tui/line-editor.js.map +1 -0
- package/dist/tui/progress.d.ts +23 -0
- package/dist/tui/progress.js +46 -0
- package/dist/tui/progress.js.map +1 -0
- package/dist/tui/settings-editor.d.ts +18 -0
- package/dist/tui/settings-editor.js +115 -0
- package/dist/tui/settings-editor.js.map +1 -0
- package/docs/live-trading.md +455 -0
- package/docs/strategy-research.md +597 -0
- package/package.json +11 -1
- package/python/desic_strategy/__init__.py +34 -0
- package/python/desic_strategy/actions.py +158 -0
- package/python/desic_strategy/context.py +164 -0
- package/python/desic_strategy/engine.py +614 -0
- package/python/desic_strategy/indicators.py +159 -0
- package/python/desic_strategy/live.py +253 -0
- package/python/desic_strategy/policy.py +193 -0
- package/python/desic_strategy/portfolio.py +152 -0
- package/python/desic_strategy/report.py +319 -0
- package/python/desic_strategy/runner.py +574 -0
- package/python/desic_strategy/timeframe.py +150 -0
- package/python/main.py +18 -0
- package/skills/okx-live-trading/SKILL.md +117 -0
- package/skills/okx-live-trading/agents/openai.yaml +9 -0
- package/skills/okx-live-trading/references/lifecycle.md +128 -0
- package/skills/okx-strategy-research/SKILL.md +113 -0
- package/skills/okx-strategy-research/agents/openai.yaml +9 -0
- package/skills/okx-strategy-research/references/execution-semantics.md +107 -0
- package/skills/okx-strategy-research/references/field-traps.md +142 -0
- package/skills/okx-strategy-research/references/python-api.md +121 -0
- package/skills/okx-strategy-research/references/tools-and-data.md +192 -0
- package/skills/okx-trading/SKILL.md +11 -10
package/README.md
CHANGED
|
@@ -1,55 +1,57 @@
|
|
|
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
|
|
5
|
+
面向 Codex、Claude Code 及其他 MCP 客户端的独立 OKX 本地 Runtime、MCP Server、CLI 和 Agent Skills。
|
|
9
6
|
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
10
|
+
> [!NOTE]
|
|
11
|
+
> 本项目的所有交易工具仅支持 OKX 永续合约(`instId` 必须以 `-SWAP` 结尾)。不支持现货、交割合约、期权或其他品种的交易。公共行情和账户查询不受此限制。
|
|
23
12
|
|
|
24
|
-
|
|
25
|
-
- npm
|
|
26
|
-
- Network access to OKX, or an HTTP/HTTPS proxy that can reach OKX
|
|
13
|
+
## 安装
|
|
27
14
|
|
|
28
|
-
|
|
15
|
+
要求 Node.js 22.12 或更高版本,以及能够访问 OKX 的网络或 HTTP/HTTPS 代理。
|
|
29
16
|
|
|
30
|
-
|
|
17
|
+
首次安装只需两条命令:
|
|
31
18
|
|
|
32
19
|
```bash
|
|
33
20
|
npm install --global desic-okx-agent
|
|
21
|
+
desic-okx setup
|
|
34
22
|
```
|
|
35
23
|
|
|
36
|
-
|
|
24
|
+
两条命令作用不同:
|
|
25
|
+
|
|
26
|
+
1. `npm install` 安装 `desic-okx` 程序。
|
|
27
|
+
2. `desic-okx setup` 接入 AI 客户端、安装 Skills、检查网络,并询问是否配置 OKX API 账户。
|
|
37
28
|
|
|
38
|
-
|
|
29
|
+
首次安装后需要运行一次 `setup`。以后正常升级无需重复运行;只有新增 AI 客户端、修复配置或重新配置代理时才需要再次运行。
|
|
39
30
|
|
|
40
|
-
|
|
31
|
+
完成后重启已选择的 AI 客户端,并验证:
|
|
41
32
|
|
|
42
33
|
```bash
|
|
43
|
-
desic-okx
|
|
34
|
+
desic-okx doctor
|
|
44
35
|
```
|
|
45
36
|
|
|
46
|
-
|
|
37
|
+
## Setup 会做什么
|
|
47
38
|
|
|
48
|
-
|
|
39
|
+
交互式向导会依次完成:
|
|
49
40
|
|
|
50
|
-
|
|
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
|
-
|
|
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
|
-
|
|
63
|
+
## 配置 OKX API
|
|
62
64
|
|
|
63
|
-
|
|
65
|
+
在 OKX 官方网站或 App 中创建 API Key。实盘账户与模拟交易账户使用各自环境的 API Key,Desic OKX Agent 会通过只读验证自动识别,不需要用户选择实盘或模拟盘。
|
|
64
66
|
|
|
65
|
-
|
|
67
|
+
按实际用途授予权限:
|
|
66
68
|
|
|
67
|
-
|
|
69
|
+
| 功能 | 是否需要 API Key | 所需条件 |
|
|
70
|
+
| --- | --- | --- |
|
|
71
|
+
| 公共行情、K 线、盘口、衍生品分析 | 否 | 无 |
|
|
72
|
+
| 余额、持仓、订单、成交、风险摘要 | 是 | 读取权限 |
|
|
73
|
+
| 远程 News、Smart Money | 是 | `live` 账户,读取权限即可 |
|
|
74
|
+
| 永续合约下单、改单、撤单、平仓、设置杠杆 | 是 | OKX API Key 具备交易权限;仅支持 `*-SWAP` |
|
|
68
75
|
|
|
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
|
|
76
|
+
本项目不提供提现、充值、资金划转、资产转出或 API Key 管理工具,不需要为此授予相关权限。建议先使用 OKX 模拟交易账户验证交易流程,并按自己的安全策略在 OKX 配置 IP 白名单。
|
|
73
77
|
|
|
74
|
-
|
|
78
|
+
交互式添加账户:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
desic-okx account add --name demo
|
|
82
|
+
desic-okx account add --name main
|
|
75
83
|
```
|
|
76
84
|
|
|
77
|
-
|
|
85
|
+
输入 API Key、Secret Key 和 Passphrase 时终端会隐藏文本。`account add` 会先连接 OKX 验证,验证失败不会保存凭证。凭证保存在系统配置目录的 `config.json` 中;Unix 权限为 `0600`:
|
|
78
86
|
|
|
79
87
|
```bash
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
##
|
|
116
|
+
## 快速开始
|
|
88
117
|
|
|
89
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
134
|
+
desic-okx account list
|
|
135
|
+
desic-okx update --check
|
|
109
136
|
```
|
|
110
137
|
|
|
111
|
-
`status`
|
|
138
|
+
`status` 显示 Runtime 版本、运行时间、代理路径、WebSocket 状态、订阅与数据年龄、账户和数据库状态。`doctor` 主动检查安装、网络、SQLite、行情、账户、MCP 客户端和 Skills。两者均支持 `--json`。
|
|
112
139
|
|
|
113
|
-
##
|
|
140
|
+
## 主要能力
|
|
114
141
|
|
|
115
|
-
|
|
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
|
-
|
|
118
|
-
codex mcp add desic-okx -- desic-okx mcp
|
|
119
|
-
```
|
|
153
|
+
## 一条链,不是两个产品
|
|
120
154
|
|
|
121
|
-
|
|
155
|
+
上面的能力不是并列的清单,而是同一条链上的几段。**手动做和让 AI 做,走的是同一条链**:
|
|
122
156
|
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
157
|
+
```text
|
|
158
|
+
分析行情 ──→ 写成策略 ──→ 回测 ──→ 调参 ──→ 建 Profile ──→ 模拟盘验证 ──→ 实盘
|
|
159
|
+
行情/衍生品 Python 7:3 切分 验证段排名 不会开始交易 真实下单 真钱
|
|
160
|
+
News/资金流 策略文件 (需你同意)
|
|
127
161
|
```
|
|
128
162
|
|
|
129
|
-
|
|
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
|
-
|
|
173
|
+
默认情况下 agent 只能读和停,创建与启用不在它的工具列表里。要让 AI 跑完整条链:
|
|
132
174
|
|
|
133
175
|
```bash
|
|
134
|
-
|
|
176
|
+
desic-okx live agent-access on # 需重启 MCP 客户端
|
|
177
|
+
desic-okx live agent-access # 查看当前设置
|
|
135
178
|
```
|
|
136
179
|
|
|
137
|
-
|
|
180
|
+
开启后 agent 仍被要求在启用实盘 Profile 前停下来问你 —— 这条约束写在 Skill 里,不是系统闸门。系统能验证的是"这个 Profile 能不能跑",不能验证"该不该投真钱"。
|
|
181
|
+
|
|
182
|
+
## 策略研究
|
|
183
|
+
|
|
184
|
+
用 Python 写策略,在本地 1 分钟历史数据上回测、调参、对比:
|
|
138
185
|
|
|
139
186
|
```bash
|
|
140
|
-
|
|
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
|
-
|
|
193
|
+
调参会把窗口按 7:3 切分,用候选从未见过的那一段排名,因此过拟合是可见的而不是被埋掉的。对比会在两次运行数据、合约、区间或成本不同时给出警告。
|
|
144
194
|
|
|
145
|
-
|
|
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
|
-
|
|
197
|
+
## 实盘执行
|
|
150
198
|
|
|
151
|
-
|
|
199
|
+
把已验证的策略接到真实账户,每根 1 分钟收线自动执行:
|
|
152
200
|
|
|
153
|
-
```
|
|
154
|
-
|
|
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
|
-
|
|
209
|
+
启用需要该源码 + 该合约已完成回测(按源码 hash 匹配,不是文件名),并会把 Profile 的杠杆写到交易所 —— 预算按杠杆折算张数,两边不一致预算就不成立。八道风控闸门只拒绝、不修正,被拒绝的信号会完整保留 —— 它们是风控运行过的证据。崩溃后向交易所对账,绝不重发可能已存在的订单。
|
|
158
210
|
|
|
159
|
-
|
|
160
|
-
~/.claude/skills/<skill-name>/SKILL.md
|
|
161
|
-
```
|
|
211
|
+
**这部分会用真钱下单。** 完整说明与限制见 **[实盘执行使用指南](docs/live-trading.md)**。
|
|
162
212
|
|
|
163
|
-
|
|
213
|
+
## Skills
|
|
164
214
|
|
|
165
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
|
197
|
-
desic-okx account
|
|
198
|
-
desic-okx account
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
247
|
+
`account add` 和 `account edit` 均在写入配置前验证凭证。工具参数只接受账户别名,不接受 API Key、Secret 或 Passphrase。
|
|
220
248
|
|
|
221
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
260
|
+
## 代理
|
|
247
261
|
|
|
248
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
281
|
+
```bash
|
|
282
|
+
desic-okx stop
|
|
283
|
+
```
|
|
279
284
|
|
|
280
|
-
##
|
|
285
|
+
## 更新
|
|
281
286
|
|
|
282
|
-
|
|
287
|
+
```bash
|
|
288
|
+
desic-okx update --check
|
|
289
|
+
desic-okx update
|
|
290
|
+
desic-okx update --yes
|
|
291
|
+
```
|
|
283
292
|
|
|
284
|
-
|
|
293
|
+
更新器会检查 npm 官方 Registry、停止 Runtime、等待 Windows 释放 SQLite 原生模块、执行全局升级、同步已安装 Skills,最后运行 Doctor。新版 CLI 或 MCP 适配器遇到旧 Runtime 时也会自动切换版本。
|
|
285
294
|
|
|
286
|
-
|
|
287
|
-
- `market`
|
|
288
|
-
- `post_only`
|
|
289
|
-
- `ioc`
|
|
290
|
-
- `fok`
|
|
291
|
-
- `trigger`
|
|
292
|
-
- `conditional`
|
|
293
|
-
- `trailing`
|
|
295
|
+
## 手动接入客户端
|
|
294
296
|
|
|
295
|
-
|
|
297
|
+
推荐使用 `desic-okx setup`。只注册 MCP 时,可运行:
|
|
296
298
|
|
|
297
|
-
|
|
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
|
-
|
|
304
|
+
Codex 的手动配置:
|
|
300
305
|
|
|
301
|
-
|
|
306
|
+
```toml
|
|
307
|
+
[mcp_servers.desic-okx]
|
|
308
|
+
command = "desic-okx"
|
|
309
|
+
args = ["mcp"]
|
|
310
|
+
```
|
|
302
311
|
|
|
303
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
324
|
+
## 运行机制
|
|
326
325
|
|
|
327
|
-
|
|
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
|
-
|
|
333
|
+
交易软件可能造成资金损失。本项目不提供投资建议,也不保证执行结果。
|
|
330
334
|
|
|
331
|
-
##
|
|
335
|
+
## 状态与许可
|
|
332
336
|
|
|
333
|
-
|
|
337
|
+
当前为 `0.3.0` 预发布版本。正式发布 `1.0.0` 前,应在目标网络环境中完成 OKX Demo 交易验证。策略研究与实盘执行已在 OKX 模拟盘上端到端验证过,**实盘执行尚未经过长期真钱运行**。
|
|
334
338
|
|
|
335
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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":"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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"}
|
|
@@ -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>;
|
package/dist/account/service.js
CHANGED
|
@@ -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
|
}
|