jcc_hyper_tool 0.1.5 → 0.1.7
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.md +160 -17
- package/dist/advisor/actionRunner.d.ts +6 -0
- package/dist/advisor/actionRunner.d.ts.map +1 -1
- package/dist/advisor/actionRunner.js +38 -7
- package/dist/advisor/actionRunner.js.map +1 -1
- package/dist/advisor/actionSchema.d.ts +1209 -75
- package/dist/advisor/actionSchema.d.ts.map +1 -1
- package/dist/advisor/actionSchema.js +117 -5
- package/dist/advisor/actionSchema.js.map +1 -1
- package/dist/advisor/adviseDisplay.d.ts +26 -0
- package/dist/advisor/adviseDisplay.d.ts.map +1 -0
- package/dist/advisor/adviseDisplay.js +174 -0
- package/dist/advisor/adviseDisplay.js.map +1 -0
- package/dist/advisor/adviseEngine.d.ts +12 -2
- package/dist/advisor/adviseEngine.d.ts.map +1 -1
- package/dist/advisor/adviseEngine.js +88 -7
- package/dist/advisor/adviseEngine.js.map +1 -1
- package/dist/advisor/ambushPolicy.d.ts +47 -0
- package/dist/advisor/ambushPolicy.d.ts.map +1 -0
- package/dist/advisor/ambushPolicy.js +161 -0
- package/dist/advisor/ambushPolicy.js.map +1 -0
- package/dist/advisor/contextBuilder.d.ts +17 -0
- package/dist/advisor/contextBuilder.d.ts.map +1 -1
- package/dist/advisor/contextBuilder.js +25 -6
- package/dist/advisor/contextBuilder.js.map +1 -1
- package/dist/advisor/executionPolicy.d.ts +92 -0
- package/dist/advisor/executionPolicy.d.ts.map +1 -0
- package/dist/advisor/executionPolicy.js +273 -0
- package/dist/advisor/executionPolicy.js.map +1 -0
- package/dist/advisor/guards.d.ts +14 -0
- package/dist/advisor/guards.d.ts.map +1 -1
- package/dist/advisor/guards.js +143 -16
- package/dist/advisor/guards.js.map +1 -1
- package/dist/advisor/indicatorCompute.d.ts +45 -0
- package/dist/advisor/indicatorCompute.d.ts.map +1 -0
- package/dist/advisor/indicatorCompute.js +259 -0
- package/dist/advisor/indicatorCompute.js.map +1 -0
- package/dist/advisor/positionPlan.d.ts +33 -0
- package/dist/advisor/positionPlan.d.ts.map +1 -0
- package/dist/advisor/positionPlan.js +118 -0
- package/dist/advisor/positionPlan.js.map +1 -0
- package/dist/advisor/promptTemplate.d.ts +8 -2
- package/dist/advisor/promptTemplate.d.ts.map +1 -1
- package/dist/advisor/promptTemplate.js +175 -23
- package/dist/advisor/promptTemplate.js.map +1 -1
- package/dist/advisor/touchProbability.d.ts +54 -0
- package/dist/advisor/touchProbability.d.ts.map +1 -0
- package/dist/advisor/touchProbability.js +215 -0
- package/dist/advisor/touchProbability.js.map +1 -0
- package/dist/advisor/tpslPolicy.d.ts +22 -0
- package/dist/advisor/tpslPolicy.d.ts.map +1 -0
- package/dist/advisor/tpslPolicy.js +120 -0
- package/dist/advisor/tpslPolicy.js.map +1 -0
- package/dist/cli/advisorCli.d.ts.map +1 -1
- package/dist/cli/advisorCli.js +478 -126
- package/dist/cli/advisorCli.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/riskCli.d.ts +3 -0
- package/dist/cli/riskCli.d.ts.map +1 -0
- package/dist/cli/riskCli.js +120 -0
- package/dist/cli/riskCli.js.map +1 -0
- package/dist/cli/strategyCli.d.ts.map +1 -1
- package/dist/cli/strategyCli.js +3 -1
- package/dist/cli/strategyCli.js.map +1 -1
- package/dist/cli/tradingCli.d.ts.map +1 -1
- package/dist/cli/tradingCli.js +31 -1
- package/dist/cli/tradingCli.js.map +1 -1
- package/dist/core/hyperliquid/asset.d.ts +2 -0
- package/dist/core/hyperliquid/asset.d.ts.map +1 -1
- package/dist/core/hyperliquid/asset.js +25 -0
- package/dist/core/hyperliquid/asset.js.map +1 -1
- package/dist/core/hyperliquid/orders.d.ts +5 -0
- package/dist/core/hyperliquid/orders.d.ts.map +1 -1
- package/dist/core/hyperliquid/orders.js +15 -5
- package/dist/core/hyperliquid/orders.js.map +1 -1
- package/dist/core/hyperliquid/rounding.d.ts +23 -0
- package/dist/core/hyperliquid/rounding.d.ts.map +1 -0
- package/dist/core/hyperliquid/rounding.js +53 -0
- package/dist/core/hyperliquid/rounding.js.map +1 -0
- package/dist/core/risk/isolatedTopUp.d.ts +112 -0
- package/dist/core/risk/isolatedTopUp.d.ts.map +1 -0
- package/dist/core/risk/isolatedTopUp.js +209 -0
- package/dist/core/risk/isolatedTopUp.js.map +1 -0
- package/dist/core/risk/isolatedTopUpHistory.d.ts +7 -0
- package/dist/core/risk/isolatedTopUpHistory.d.ts.map +1 -0
- package/dist/core/risk/isolatedTopUpHistory.js +26 -0
- package/dist/core/risk/isolatedTopUpHistory.js.map +1 -0
- package/dist/core/risk/isolatedTopUpParse.d.ts +16 -0
- package/dist/core/risk/isolatedTopUpParse.d.ts.map +1 -0
- package/dist/core/risk/isolatedTopUpParse.js +78 -0
- package/dist/core/risk/isolatedTopUpParse.js.map +1 -0
- package/dist/core/risk/runIsolatedTopUpReconcile.d.ts +28 -0
- package/dist/core/risk/runIsolatedTopUpReconcile.d.ts.map +1 -0
- package/dist/core/risk/runIsolatedTopUpReconcile.js +184 -0
- package/dist/core/risk/runIsolatedTopUpReconcile.js.map +1 -0
- package/dist/core/state/bracketReconcile.d.ts.map +1 -1
- package/dist/core/state/bracketReconcile.js +6 -2
- package/dist/core/state/bracketReconcile.js.map +1 -1
- package/dist/core/state/gridReconcile.d.ts +2 -0
- package/dist/core/state/gridReconcile.d.ts.map +1 -1
- package/dist/core/state/gridReconcile.js +42 -2
- package/dist/core/state/gridReconcile.js.map +1 -1
- package/dist/core/state/intentFactory.d.ts +1 -0
- package/dist/core/state/intentFactory.d.ts.map +1 -1
- package/dist/core/state/intentFactory.js +1 -0
- package/dist/core/state/intentFactory.js.map +1 -1
- package/dist/core/state/profileStore.d.ts.map +1 -1
- package/dist/core/state/profileStore.js +12 -16
- package/dist/core/state/profileStore.js.map +1 -1
- package/dist/core/state/runReconcile.d.ts.map +1 -1
- package/dist/core/state/runReconcile.js +53 -18
- package/dist/core/state/runReconcile.js.map +1 -1
- package/dist/core/state/schema.d.ts +439 -68
- package/dist/core/state/schema.d.ts.map +1 -1
- package/dist/core/state/schema.js +51 -0
- package/dist/core/state/schema.js.map +1 -1
- package/dist/core/state/snapshot.d.ts +13 -0
- package/dist/core/state/snapshot.d.ts.map +1 -1
- package/dist/core/state/snapshot.js +36 -0
- package/dist/core/state/snapshot.js.map +1 -1
- package/dist/core/state/store.d.ts +21 -3
- package/dist/core/state/store.d.ts.map +1 -1
- package/dist/core/state/store.js +122 -13
- package/dist/core/state/store.js.map +1 -1
- package/dist/core/state/types.d.ts +13 -0
- package/dist/core/state/types.d.ts.map +1 -1
- package/dist/daemon/index.js +47 -2
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/validateChild.d.ts +13 -0
- package/dist/daemon/validateChild.d.ts.map +1 -0
- package/dist/daemon/validateChild.js +77 -0
- package/dist/daemon/validateChild.js.map +1 -0
- package/dist/strategies/grid.d.ts +1 -0
- package/dist/strategies/grid.d.ts.map +1 -1
- package/dist/strategies/grid.js +1 -0
- package/dist/strategies/grid.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
- **签名 `/exchange`**:限价 / 触发单 / bracket 等下单与撤单,以及 HTTP 轮询 **`watch orders`**
|
|
7
7
|
- **网格策略(`strategy grid`)**:在价格区间内批量铺限价
|
|
8
8
|
- **本地 JSON 状态**(默认 **`~/.jcc_hyper_tool/trade-state.json`**;根或子命令 **`--state-file`** 可改路径;根 **`--no-state`** 可关闭挂单类命令的读写):**`state reconcile`** / **`state cancel-open`**,跟踪 bracket / grid 意图,并在入场视为成交后再推进 TP/SL
|
|
9
|
+
- **逐仓自动加保证金(`risk isolated-top-up`)**:在 **`state reconcile`** 每轮开头评估逐仓持仓强平距离,必要时 **`updateIsolatedMargin`**;配置写入 **`userProfile.isolatedTopUp`**(默认关闭)
|
|
9
10
|
- **LLM 顾问(`advise`)**:DeepSeek 推理接口 + K 线与持仓上下文 → 结构化动作(`wait` / `open_with_bracket` / `close_position` / `cancel_all`);默认 **dry-run**,真下单时经子命令既有 **`YES`** / **`--assume-yes`** 流程;用户偏好写入同文件 **`userProfile`**(**`advisor profile`**)
|
|
10
11
|
|
|
11
12
|
私钥**仅**通过**环境变量**提供,请勿写入仓库或配置文件;变量名、何时必填与安全注意见 **[环境变量](#环境变量)**。
|
|
@@ -20,20 +21,33 @@
|
|
|
20
21
|
|
|
21
22
|
## 守护进程(定时循环)
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
**网格**与 **LLM 自动交易(advise)** 应各跑一个 **`jcc_hyper_daemon`**,**不要混在同一进程**(分开 state 文件,避免持仓/挂单互相撤改)。**若 advise 使用 `open_with_bracket`,还需另起一个 `state reconcile` daemon 指向同一份 advise state**(入场成交后挂 TP/SL;仅跑 advise 不会自动挂保护腿)。详见 **[Manual.md → 定时循环](./Manual.md#定时循环)**。
|
|
25
|
+
|
|
26
|
+
**`jcc_hyper_daemon`** 按固定间隔 **`spawn`** 一次 **`jcc_hyper_tool`**;子命令写在 **`--`** 之后。
|
|
24
27
|
|
|
25
28
|
```bash
|
|
26
|
-
|
|
29
|
+
# 网格:对账 / 补单 / 逐仓加保证金(可 30–120s)
|
|
30
|
+
jcc_hyper_daemon --mode grid --interval 60 --state-file ~/.jcc_hyper_tool/grid-state.json -- \
|
|
31
|
+
state reconcile --live --assume-yes
|
|
32
|
+
|
|
33
|
+
# 自动交易:advise 单轮 + 自动执行(间隔 ≥ 300s,建议 900s+)
|
|
34
|
+
jcc_hyper_daemon --mode advise --interval 900 --state-file ~/.jcc_hyper_tool/advise-state.json -- \
|
|
35
|
+
advise --coin xyz:CL --max-sz 2 --once --auto --live --assume-yes
|
|
36
|
+
|
|
27
37
|
jcc_hyper_daemon --once -- config print
|
|
28
38
|
```
|
|
29
39
|
|
|
30
40
|
选项摘要:
|
|
31
41
|
|
|
32
|
-
- **`-i, --interval <seconds>`**:周期间隔,默认 `60
|
|
33
|
-
- **`--
|
|
34
|
-
- **`--
|
|
42
|
+
- **`-i, --interval <seconds>`**:周期间隔,默认 `60`;**`advise` 子命令至少 300 秒**。
|
|
43
|
+
- **`--mode grid|advise`**:约束子命令类型,防止 grid 与 advise 混用。
|
|
44
|
+
- **`--once`(daemon 层)**:守护进程**只跑一轮**子命令后退出;**长期 advise 循环不要加此项**。
|
|
45
|
+
- **`advise --once`(子命令层)**:每次 spawn 的 advise **只问模型一次**后退出;与 daemon 循环配合使用(见 **[Manual.md → 自动交易守护进程](./Manual.md#自动交易守护进程-mode-advise)**)。
|
|
46
|
+
- **`--jcc-bin <path>`**:显式指定 `jcc_hyper_tool` 可执行文件。
|
|
35
47
|
|
|
36
|
-
|
|
48
|
+
**`userProfile` / `advisor profile`**:偏好写在 **`trade-state.json` 同一文件**的 `userProfile` 字段里,**不是**单独配置文件;网格与 advise 可各用不同 state 路径,但 profile 须写入**该 daemon 使用的 `--state-file`**。审计日志在 **`advisor-log/`**,与 profile 无关。
|
|
49
|
+
|
|
50
|
+
收到 **`SIGINT` / `SIGTERM`** 时守护进程会立即退出。
|
|
37
51
|
|
|
38
52
|
## 从源码参与开发
|
|
39
53
|
|
|
@@ -212,11 +226,21 @@ Dry-run 示例:
|
|
|
212
226
|
|
|
213
227
|
### LLM 顾问(`advise`)
|
|
214
228
|
|
|
215
|
-
使用 **DeepSeek** OpenAI 兼容接口(环境变量 **`DEEPSEEK_API_KEY`**,可选 **`DEEPSEEK_MODEL`**,默认模型 **`deepseek-v4-pro`**)。拉取当前 **`coin`** 的 **5m / 1h / 1d** K 线与 **clearinghouse 持仓**,拼成结构化上下文;模型只允许输出 **JSON** 动作(经 Zod 校验,失败会自动重试最多 2 次)。**`--max-sz`** 为强制硬顶;价格相对 **mid** 偏离超过 profile / 默认 **3%**
|
|
229
|
+
使用 **DeepSeek** OpenAI 兼容接口(环境变量 **`DEEPSEEK_API_KEY`**,可选 **`DEEPSEEK_MODEL`**,默认模型 **`deepseek-v4-pro`**)。拉取当前 **`coin`** 的 **5m / 1h / 1d** K 线与 **clearinghouse 持仓**,拼成结构化上下文;模型只允许输出 **JSON** 动作(经 Zod 校验,失败会自动重试最多 2 次)。**`--max-sz`** 为强制硬顶;价格相对 **mid** 偏离超过 profile / 默认 **3%** 的限价会被拒绝;**`open_with_bracket` / `order bracket` 还须满足 Hyperliquid 最低名义价值 **$10**(`limit_px × sz`,上下文含 **`min_order_sz`** 参考)。
|
|
230
|
+
|
|
231
|
+
**动作枚举**:`wait` | `open_with_bracket` | `close_position` | `cancel_all`。执行时通过 **`spawnSync`** 调本包 **`jcc_hyper_tool`** 子命令,**继承**现有 **`--live` / `--assume-yes` / `YES`** 与 dry-run 语义。**`open_with_bracket`**、**`cancel_all`** 需要可写 **`trade-state.json`**(勿与根 **`--no-state`** 同用)。**`close_position`** 的 **market** 在实现上为 **IOC** + 相对 mid 的激进限价(近似市价减仓);持仓大于 **`--max-sz`** 时**按 cap 部分平仓**,不再整单拒绝。
|
|
216
232
|
|
|
217
|
-
|
|
233
|
+
**一轮 advise** = **一次模型调用 → 一个动作**;模型返回 **`wait`** 则不下单。**`--auto`** 会在通过护栏后自动执行该动作(仍可用不加 **`--live`** 做 dry-run)。
|
|
218
234
|
|
|
219
|
-
|
|
235
|
+
**反同质化护栏**(CLI 或 **`userProfile`**,详见 Manual):
|
|
236
|
+
|
|
237
|
+
- **`--min-confidence`** / **`minConfidenceToExecute`**:低于阈值不执行;**`--auto`** 且未配置时默认 **0.55**。
|
|
238
|
+
- **`--limit-jitter-pct`** / **`limitPriceJitterPct`**:限价随机微偏移(仍须在 mid 偏离带宽内)。
|
|
239
|
+
- **`--sl-entry-shift <0-1>`** / **`bracketSlEntryShift`**:bracket 入场向模型止损平移(**1** = 以原 SL 价挂限价单,TP/SL 等量平移;未成交无仓)。
|
|
240
|
+
- **`--execute-cooldown-sec`** / **`executeCooldownSec`**:同 coin + 同动作类型冷却;**`open_with_bracket` 另按 `side`(buy/sell)区分**;记录写在 state 的 **`adviseExecuteHistory`**(**`--live` 成功**后更新,键如 **`${coin}:open_with_bracket:sell`**)。
|
|
241
|
+
- **`defaultMinSz` / `minSzByCoin`**(`advisor profile set --min-sz` / `--coin-min COIN=size`):开仓数量下限,与 HL $10 名义价值检查叠加(例如 `xyz:CL` 设 `--coin-min xyz:CL=1` 可禁止 0.15 等小 fractional 仓)。
|
|
242
|
+
|
|
243
|
+
会话留痕目录(默认 **`~/.jcc_hyper_tool/advisor-log/<uuid>.json`**)包含 **`reasoning_content`**(仅落盘;按 DeepSeek 要求**不会**回传到下一轮的 `messages`)。**这不是 profile 文件**——偏好仍在 **`trade-state.json` → `userProfile`**。
|
|
220
244
|
|
|
221
245
|
```bash
|
|
222
246
|
export DEEPSEEK_API_KEY='sk-…'
|
|
@@ -227,16 +251,29 @@ jcc_hyper_tool advise --coin BTC --max-sz 0.002
|
|
|
227
251
|
jcc_hyper_tool advise --coin BTC --max-sz 0.002 --note "manual note" --once
|
|
228
252
|
|
|
229
253
|
# 单轮后立刻走执行分支(仍可 dry-run,不加 --live 则子命令亦 dry-run)
|
|
230
|
-
jcc_hyper_tool advise --coin BTC --max-sz 0.002 --auto
|
|
254
|
+
jcc_hyper_tool advise --coin BTC --max-sz 0.002 --once --auto
|
|
255
|
+
|
|
256
|
+
# v2 提示词:预计算指标模式(节省 token,指标值精确)
|
|
257
|
+
jcc_hyper_tool advise --coin BTC --max-sz 0.002 --context-version precomputed_indicators --once
|
|
231
258
|
|
|
232
|
-
# 用户风险偏好写入 trade-state(与 intents
|
|
233
|
-
jcc_hyper_tool advisor profile set --
|
|
234
|
-
|
|
235
|
-
jcc_hyper_tool advisor profile
|
|
259
|
+
# 用户风险偏好写入 trade-state 的 userProfile(与 intents 同文件;reconcile / cancel-open 不改此块)
|
|
260
|
+
jcc_hyper_tool advisor profile set --state-file ~/.jcc_hyper_tool/advise-state.json \
|
|
261
|
+
--min-confidence 0.6 --limit-jitter-pct 0.002 --sl-entry-shift 1 --execute-cooldown-sec 1800
|
|
262
|
+
jcc_hyper_tool advisor profile show --state-file ~/.jcc_hyper_tool/advise-state.json
|
|
263
|
+
jcc_hyper_tool advisor profile clear --state-file ~/.jcc_hyper_tool/advise-state.json
|
|
236
264
|
```
|
|
237
265
|
|
|
238
266
|
K 线条数默认 **48 / 48 / 30**,可用 **`--bars5m` / `--bars1h` / `--bars1d`** 覆盖。
|
|
239
267
|
|
|
268
|
+
**Prompt 上下文版本**(`--context-version`):控制发送给模型的 K 线和技术指标格式。
|
|
269
|
+
|
|
270
|
+
| 版本 | 说明 |
|
|
271
|
+
|------|------|
|
|
272
|
+
| **`raw_kline`**(默认,v1) | 原始 K 线 OHLCV 全量数据;模型自行分析 EMA/MACD/RSI/布林带等指标。**兼容旧版行为。** |
|
|
273
|
+
| **`precomputed_indicators`**(v2) | 服务端使用 `trading-signals` 库预计算技术指标(EMA 排列、MACD、RSI、布林带、ATR、量价),输出结构化中文摘要替代大部分 K 线数据;仅保留精简 5m/1h/1d K 线(与 v1 相同根数,仅 h/l/o/c/v 五字段)供波浪/缠论多周期联立、K 线形态和量价配合分析。**大幅节省 token(约 75%)且指标值精确。** |
|
|
274
|
+
|
|
275
|
+
v2 模式下,模型 §1 分析框架会从「从裸 K 线计算指标」变为「解读预计算指标摘要并做综合判断」。相比 v1 额外提供的对数收益率衍生指标(ATR%、历史波动率、价格 Z-Score)让模型可以从跨价格量级可比的角度判断波动率环境和价格极端程度。
|
|
276
|
+
|
|
240
277
|
---
|
|
241
278
|
|
|
242
279
|
## 实战:单边 / 双边网格、定时补单、一键撤销
|
|
@@ -334,6 +371,42 @@ jcc_hyper_tool state cancel-open --state-file ./trade-state.json --intent <意
|
|
|
334
371
|
|
|
335
372
|
撤单成功后同样会做一次 **GC**,终态 intent 会从文件里删掉,事件一并收缩,避免 state 无限长大。
|
|
336
373
|
|
|
374
|
+
### 运行中调整网格间距(修改 state 文件)
|
|
375
|
+
|
|
376
|
+
网格运行期间,可以**直接编辑 state 文件**调整间距、范围或档数,无需重新运行 `strategy grid` 命令。
|
|
377
|
+
|
|
378
|
+
找到 state 文件中对应 grid intent,修改以下字段并**新增 `"regenerateGrid": true`**:
|
|
379
|
+
|
|
380
|
+
```json
|
|
381
|
+
{
|
|
382
|
+
"kind": "grid",
|
|
383
|
+
"id": "xxx-xxx-xxx",
|
|
384
|
+
"lower": 87.0,
|
|
385
|
+
"upper": 93.0,
|
|
386
|
+
"grids": 12,
|
|
387
|
+
"bias": "symmetric",
|
|
388
|
+
"orderSz": 0.01,
|
|
389
|
+
"regenerateGrid": true,
|
|
390
|
+
"legs": [...]
|
|
391
|
+
}
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
| 可改字段 | 含义 |
|
|
395
|
+
|---------|------|
|
|
396
|
+
| `lower` | 网格下界价格 |
|
|
397
|
+
| `upper` | 网格上界价格 |
|
|
398
|
+
| `grids` | 档位数(正整数) |
|
|
399
|
+
| `bias` | `symmetric`(双边)/ `long`(只做多)/ `short`(只做空) |
|
|
400
|
+
| `orderSz` | 每档挂单数量 |
|
|
401
|
+
|
|
402
|
+
保存后,下一次 reconcile 检测到 `regenerateGrid: true` 会:
|
|
403
|
+
1. 用新的 `lower`/`upper`/`grids`/`bias` 重新计算每条腿的价格
|
|
404
|
+
2. 保留已成交(`filled`)腿的历史记录
|
|
405
|
+
3. 自动撤销价格不在新网格中的活单(OID 仍在簿上的)
|
|
406
|
+
4. 新 pending 腿在下一次 reconcile 时挂单
|
|
407
|
+
|
|
408
|
+
**注意**:不要手动编辑 `legs[].px` 或 `legs[].oid`——让 `regenerateGrid` 自动重建更安全。修改前建议备份 state 文件。
|
|
409
|
+
|
|
337
410
|
---
|
|
338
411
|
|
|
339
412
|
## 本地状态与对账
|
|
@@ -348,8 +421,10 @@ jcc_hyper_tool state cancel-open --state-file ./trade-state.json --intent <意
|
|
|
348
421
|
- **`grid`**:网格参数 + 每一档 **leg**(含 oid、阶段等)。
|
|
349
422
|
- **`single_limit`**:单笔限价(配合 `order place --state-file`)。
|
|
350
423
|
- **`standalone_tpsl`**:独立触发单(配合 `order tpsl --state-file`)。
|
|
351
|
-
- **`events
|
|
352
|
-
-
|
|
424
|
+
- **`events`**:与该意图相关的事件日志(逐仓加保证金事件使用虚拟 intentId **`_risk`**)。
|
|
425
|
+
- **`userProfile`**(可选):顾问偏好 + **`isolatedTopUp`** 风控参数;**reconcile / cancel-open 不删此块**。
|
|
426
|
+
- **`adviseExecuteHistory`**(可选):advise **`--live` 成功执行**后的冷却记录(键为 **`${coin}:${action}`**;**`open_with_bracket` 为 `${coin}:open_with_bracket:${side}`**)。
|
|
427
|
+
- **写入**:先写同目录临时文件再 **`rename`**,尽量原子化;**跨进程**(例如 advise + reconcile 两个 daemon 共用 `--state-file`)通过 **`${stateFile}.lock`** 互斥,默认最多等待 **30s**、每 **50ms** 重试;reconcile 写回时会保留 advise 刚更新的 **`adviseExecuteHistory`** / **`userProfile`**。重复对账依赖 **`dedupeKeys`**(`plan:*` / `done:*`),避免在同一模式下重复生成同一类「拟执行动作」。
|
|
353
428
|
|
|
354
429
|
未使用根 **`--no-state`** 时,**`order place` / `order tpsl` / `strategy grid`** 会默认写入默认 state 文件(或根 / 子命令 **`--state-file`** 指定路径)。**`--no-state`** 则完全不写、不读。
|
|
355
430
|
|
|
@@ -357,7 +432,7 @@ jcc_hyper_tool state cancel-open --state-file ./trade-state.json --intent <意
|
|
|
357
432
|
|
|
358
433
|
| 子命令 | 作用 |
|
|
359
434
|
| ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
360
|
-
| **`state reconcile`** | 读状态 → 拉 **合并后的 openOrders**(默认 perp + 各 builder dex)与 **clearinghouseState(仓位)** → 推进 bracket/grid 状态机 → **默认只输出 dry-run 计划**;加 **`--live`** 则在确认后真实下单 /
|
|
435
|
+
| **`state reconcile`** | 读状态 → 拉 **合并后的 openOrders**(默认 perp + 各 builder dex)与 **clearinghouseState(仓位)** → **(可选)逐仓自动加保证金** → 推进 bracket/grid 状态机 → **默认只输出 dry-run 计划**;加 **`--live`** 则在确认后真实下单 / 撤单 / 加保证金(需私钥;可用 **`--assume-yes`** 跳过交互)。**`--intent <id>`** 可只处理一条意图(逐仓评估也仅针对该 intent 的 coin)。写回前会 **GC** 终态意图。 |
|
|
361
436
|
| **`state cancel-open`** | 从 state 收集 oid,与 **合并后的 openOrders**(默认 perp + 各 builder dex)求交后按 **coin / assetIndex** 批量撤单;默认 **dry** 只出计划;**`--live`** 真实撤单(**`--assume-yes`** 可非交互)。结束后 **GC** 本地 state。 |
|
|
362
437
|
| **`state list`** | 以任务可读方式列出全部意图摘要(阶段、下一步提示等)。 |
|
|
363
438
|
| **`state show <intentId>`** | 单条意图的结构化详情 + 最近相关事件。 |
|
|
@@ -407,6 +482,74 @@ jcc_hyper_tool state reconcile --state-file ./trade-state.json --live --assume-y
|
|
|
407
482
|
|
|
408
483
|
---
|
|
409
484
|
|
|
485
|
+
## 逐仓自动加保证金(`risk isolated-top-up`)
|
|
486
|
+
|
|
487
|
+
当网格或 bracket 产生**逐仓持仓**且 mark 与强平价距离偏紧时,可在 **`state reconcile`** 每轮**开头**(grid/bracket 动作之前)自动调用 Hyperliquid **`updateIsolatedMargin`** 追加 USDC 保证金。
|
|
488
|
+
|
|
489
|
+
**适用范围(代码硬约束)**
|
|
490
|
+
|
|
491
|
+
| 场景 | 行为 |
|
|
492
|
+
|------|------|
|
|
493
|
+
| 全仓(`leverage.type === "cross"`) | 跳过 |
|
|
494
|
+
| 无持仓(`\|szi\| === 0`) | 跳过 |
|
|
495
|
+
| 逐仓 + 有持仓 | 评估是否加仓 |
|
|
496
|
+
|
|
497
|
+
**加多少(目标驱动)**
|
|
498
|
+
|
|
499
|
+
1. 计算当前安全距离:`distancePct = |mark − liq| / mark × 100`
|
|
500
|
+
2. 若 `distancePct >= safeDistancePct`(默认 **8%**)→ 不加
|
|
501
|
+
3. 否则算拉到安全距离所需 USDC:`neededUsd ≈ gapPx × |szi| × safetyFactor`(默认 **`safetyFactor = 1.10`**)
|
|
502
|
+
4. 可加仓池:`withdrawable − reserveUsd`(默认 **`reserveUsd = 100`**,留给网格挂单)
|
|
503
|
+
5. 钱够 → 加 `neededUsd`;不够 → 加 `availableToAdd`(partial);若 partial 后不足 **`minPartialUsd`(默认 20)** → 只记日志、不加
|
|
504
|
+
|
|
505
|
+
**配置**(写入 **`trade-state.json` → `userProfile.isolatedTopUp`**,默认 **`enabled: false`**):
|
|
506
|
+
|
|
507
|
+
```json
|
|
508
|
+
{
|
|
509
|
+
"userProfile": {
|
|
510
|
+
"isolatedTopUp": {
|
|
511
|
+
"enabled": true,
|
|
512
|
+
"safeDistancePct": 8,
|
|
513
|
+
"safetyFactor": 1.1,
|
|
514
|
+
"reserveUsd": 100,
|
|
515
|
+
"minTopUpUsd": 5,
|
|
516
|
+
"minPartialUsd": 20,
|
|
517
|
+
"maxSingleTopUpUsd": 5000,
|
|
518
|
+
"maxDailyTopUpUsd": 20000,
|
|
519
|
+
"cooldownSec": 300
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
**CLI**
|
|
526
|
+
|
|
527
|
+
```bash
|
|
528
|
+
# 启用并设置保留金(写入 state 文件 userProfile)
|
|
529
|
+
jcc_hyper_tool risk isolated-top-up configure --enable --reserve-usd 100 --state-file ./trade-state.json
|
|
530
|
+
|
|
531
|
+
# 仅预览本轮评估(不 POST /exchange)
|
|
532
|
+
jcc_hyper_tool risk isolated-top-up plan --state-file ./trade-state.json
|
|
533
|
+
|
|
534
|
+
# 与 grid 对账一起跑(dry 会在 dryPlan 里列出 isolated_top_up / isolated_top_up_skip)
|
|
535
|
+
jcc_hyper_tool state reconcile --state-file ./trade-state.json
|
|
536
|
+
|
|
537
|
+
# 真实加保证金(与 grid live 共用一次 YES / --assume-yes)
|
|
538
|
+
jcc_hyper_tool state reconcile --state-file ./trade-state.json --live --assume-yes
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
**daemon 示例**(仅 **grid** daemon;与 advise 分开进程,见 **[守护进程](#守护进程定时循环)**):
|
|
542
|
+
|
|
543
|
+
```bash
|
|
544
|
+
jcc_hyper_daemon --mode grid --interval 60 -- state reconcile --state-file ~/.jcc_hyper_tool/grid-state.json --live --assume-yes
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
**输出**:`state reconcile` JSON 的 **`dryPlan` / `actionsExecuted`** 含 **`isolated_top_up`** 或 **`isolated_top_up_skip`**;事件类型 **`isolated_margin_top_up_executed`** / **`_skipped`** / **`_failed`** 写入 **`events`**。
|
|
548
|
+
|
|
549
|
+
**注意**:`withdrawable` 为**账户级**;同地址多 coin 多 daemon 会共享可加仓池。加保证金成功后**不会**立刻 refetch 全量仓位;下轮 reconcile 用新 `liquidationPx` 验证效果。
|
|
550
|
+
|
|
551
|
+
---
|
|
552
|
+
|
|
410
553
|
## 校验与测试
|
|
411
554
|
|
|
412
555
|
仓库内跑静态检查与单元测试:
|
|
@@ -16,6 +16,12 @@ export declare function advisorActionToCliArgs(action: AdvisorAction, params: {
|
|
|
16
16
|
globals: string[];
|
|
17
17
|
live: boolean;
|
|
18
18
|
assumeYes: boolean;
|
|
19
|
+
/** Hard cap for close size (partial close when position exceeds cap). */
|
|
20
|
+
szCap?: number;
|
|
21
|
+
/** Optional jitter on aggressive market-close limit. */
|
|
22
|
+
limitJitterPct?: number;
|
|
23
|
+
maxDevPct?: number;
|
|
24
|
+
szDecimals?: number;
|
|
19
25
|
}): string[];
|
|
20
26
|
export declare function formatCliInvocation(args: string[]): string;
|
|
21
27
|
export type SpawnCapture = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actionRunner.d.ts","sourceRoot":"","sources":["../../src/advisor/actionRunner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"actionRunner.d.ts","sourceRoot":"","sources":["../../src/advisor/actionRunner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAQvD,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAcvE;AAED,kEAAkE;AAClE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKhF;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,IAAI,CAaN;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE;IACN,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,MAAM,EAAE,CAwIV;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAS1D;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,GACpC,YAAY,CAmBd"}
|
|
@@ -2,6 +2,8 @@ import { ConfigError } from "../core/errors.js";
|
|
|
2
2
|
import { inferHlDexFromPrefixedPerpCoin } from "../core/hyperliquid/prefixedPerpCoin.js";
|
|
3
3
|
import { resolveJccHyperToolSpawn } from "../core/cliBin.js";
|
|
4
4
|
import { spawnSync } from "node:child_process";
|
|
5
|
+
import { isAdvisorBracketOpenAction } from "./actionSchema.js";
|
|
6
|
+
import { applyLimitJitterWithinBand, roundAdvisorLimitPx, resolveCloseSz, } from "./executionPolicy.js";
|
|
5
7
|
export function buildGlobalPrefix(opts) {
|
|
6
8
|
const out = [];
|
|
7
9
|
if (opts.network) {
|
|
@@ -26,7 +28,9 @@ export function aggressiveCloseLimitPx(side, mid) {
|
|
|
26
28
|
return mid * 1.08;
|
|
27
29
|
}
|
|
28
30
|
export function assertAdviseActionNeedsState(action, noState, stateFile) {
|
|
29
|
-
if (action.action !== "open_with_bracket" &&
|
|
31
|
+
if (action.action !== "open_with_bracket" &&
|
|
32
|
+
action.action !== "place_limit_ambush" &&
|
|
33
|
+
action.action !== "cancel_all") {
|
|
30
34
|
return;
|
|
31
35
|
}
|
|
32
36
|
if (noState || !stateFile) {
|
|
@@ -36,7 +40,7 @@ export function assertAdviseActionNeedsState(action, noState, stateFile) {
|
|
|
36
40
|
export function advisorActionToCliArgs(action, params) {
|
|
37
41
|
const g = [...params.globals];
|
|
38
42
|
const dex = inferHlDexFromPrefixedPerpCoin(params.coin);
|
|
39
|
-
if (action
|
|
43
|
+
if (isAdvisorBracketOpenAction(action)) {
|
|
40
44
|
const args = [
|
|
41
45
|
...g,
|
|
42
46
|
"order",
|
|
@@ -63,6 +67,13 @@ export function advisorActionToCliArgs(action, params) {
|
|
|
63
67
|
else if (action.protection_limit_px !== undefined) {
|
|
64
68
|
args.push("--protection-limit-px", String(action.protection_limit_px));
|
|
65
69
|
}
|
|
70
|
+
if (action.action === "place_limit_ambush") {
|
|
71
|
+
args.push("--expires-in-ms", String(Math.round(action.expires_in_min * 60_000)));
|
|
72
|
+
args.push("--strategy", "ambush");
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
args.push("--strategy", "scalp");
|
|
76
|
+
}
|
|
66
77
|
if (params.live) {
|
|
67
78
|
args.push("--live");
|
|
68
79
|
}
|
|
@@ -72,24 +83,44 @@ export function advisorActionToCliArgs(action, params) {
|
|
|
72
83
|
return args;
|
|
73
84
|
}
|
|
74
85
|
if (action.action === "close_position") {
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
86
|
+
const cap = params.szCap;
|
|
87
|
+
const { sz, capped, positionAbs } = cap !== undefined && Number.isFinite(cap) && cap > 0
|
|
88
|
+
? resolveCloseSz(params.positionSignedSz, cap)
|
|
89
|
+
: (() => {
|
|
90
|
+
const pos = params.positionSignedSz;
|
|
91
|
+
if (pos === undefined || !Number.isFinite(pos) || pos === 0) {
|
|
92
|
+
throw new ConfigError("close_position: no open position for this coin.");
|
|
93
|
+
}
|
|
94
|
+
const positionAbs = Math.abs(pos);
|
|
95
|
+
return { sz: positionAbs, capped: false, positionAbs };
|
|
96
|
+
})();
|
|
97
|
+
if (capped) {
|
|
98
|
+
process.stderr.write(`advise: close_position size capped to ${sz} (position ${positionAbs}, cap ${cap}).\n`);
|
|
78
99
|
}
|
|
100
|
+
const pos = params.positionSignedSz;
|
|
79
101
|
const closeSide = pos > 0 ? "sell" : "buy";
|
|
80
|
-
const sz = Math.abs(pos);
|
|
81
102
|
let limitPx;
|
|
82
103
|
if (action.method === "market") {
|
|
83
104
|
if (params.mid === null || params.mid <= 0) {
|
|
84
105
|
throw new ConfigError("close_position: market close needs mid price.");
|
|
85
106
|
}
|
|
86
107
|
limitPx = aggressiveCloseLimitPx(closeSide, params.mid);
|
|
108
|
+
limitPx = roundAdvisorLimitPx(limitPx, params.szDecimals);
|
|
109
|
+
const jitterPct = params.limitJitterPct ?? 0;
|
|
110
|
+
const maxDev = params.maxDevPct ?? 1;
|
|
111
|
+
if (jitterPct > 0) {
|
|
112
|
+
const jittered = applyLimitJitterWithinBand(limitPx, params.mid, jitterPct, maxDev, Math.random, params.szDecimals);
|
|
113
|
+
if (jittered.applied) {
|
|
114
|
+
process.stderr.write(`advise: market close limit jitter ${limitPx} → ${jittered.px}.\n`);
|
|
115
|
+
}
|
|
116
|
+
limitPx = jittered.px;
|
|
117
|
+
}
|
|
87
118
|
}
|
|
88
119
|
else {
|
|
89
120
|
if (action.limit_px === undefined || !Number.isFinite(action.limit_px)) {
|
|
90
121
|
throw new ConfigError("close_position: limit method needs limit_px.");
|
|
91
122
|
}
|
|
92
|
-
limitPx = action.limit_px;
|
|
123
|
+
limitPx = roundAdvisorLimitPx(action.limit_px, params.szDecimals);
|
|
93
124
|
}
|
|
94
125
|
const args = [
|
|
95
126
|
...g,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actionRunner.js","sourceRoot":"","sources":["../../src/advisor/actionRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"actionRunner.js","sourceRoot":"","sources":["../../src/advisor/actionRunner.ts"],"names":[],"mappings":"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"}
|