xuanzhu 0.9.2 → 0.10.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.md CHANGED
@@ -232,7 +232,7 @@ xzh
232
232
  | --- | --- |
233
233
  | `/help` | 显示全部命令与快捷键 |
234
234
  | `/model [编号\|id]` | 查看 / 切换当前模型 |
235
- | `/auto [on\|off]` | 切换自动批准(on:工具直接执行,写入配置) |
235
+ | `/auto [on\|off]` | 自动批准(**不带参数 = 开**,`/auto off` 才关;写入配置) |
236
236
  | `/autonomy [ask\|observe\|auto]` | 自治等级:逐项确认 / 只观察 / 全自动 |
237
237
  | `/compact` / `/context` / `/usage` | 压缩历史 / 看上下文预算 / 看 token 用量 |
238
238
  | `/tools` | 列出本轮发给模型的工具(排查「某个工具没被调用」) |
@@ -254,7 +254,7 @@ xzh
254
254
  | --- | --- |
255
255
  | `/feed` | 开关后台巡检过程流:巡检的思考与工具调用会实时显示成 `[后台 15:04] 思考:…` |
256
256
  | `/stop` | 暂停后端的自动巡检与自动交易(进程仍在、队列不丢);`/stop status` 查看、`/stop resume` 恢复 |
257
- | `/reset moni [初始资金]` | 重置模拟盘账本(默认 100000);`/reset` 不带参数仍是重置对话 |
257
+ | `/reset moni [初始资金]` | 重置模拟盘账本(默认 100000):清空成交/挂单/持仓,并**把重置前的状态写进项目记忆**;`/reset` 不带参数仍是重置对话 |
258
258
  | `/switch <目录>` | **不可用**:btc 模式把工作目录锁在 `~/.btc`,界面与 Agent 两处代码都会拒绝 |
259
259
  | `/term` | 右栏是**只读仪表盘**(价格 / 账户或账本 / 巡检 / 风控),`Shift+Tab` 不再切到右栏 |
260
260
 
@@ -324,7 +324,7 @@ Windows 上如果希望 bash 工具使用 Git Bash / WSL 的 shell,可设置 `
324
324
  | `temperature` | `0.2` | 采样温度 |
325
325
  | `maxToolRounds` | `200` | 单轮任务内工具调用轮数上限(用尽时询问是否追加) |
326
326
  | `autoApprove` | `true` | 自动批准工具(`false` 时写文件/执行命令前询问) |
327
- | `autonomy` | 由 `autoApprove` 推导 | `ask` / `observe` / `auto`;`observe` 拦下写操作并记账(`/autonomy` 切换) |
327
+ | `autonomy` | `auto` | `ask` / `observe` / `auto`;`observe` 拦下写操作并记账(`/autonomy` 切换)。旧配置里显式写过的 `ask` / `observe` 会**一次性**迁移成 `auto`(带 `autonomyMigrated` 标记,之后的手动切换不再被覆盖) |
328
328
  | `mouseCapture` | `true` | 接管鼠标:滚轮滚动 + 输出区拖拽选中复制(`/mouse` 切换) |
329
329
  | `confirmSensitiveRead` | `false` | 读取凭据类文件(`.env`、`~/.ssh`、`config.json` 等)时是否确认 |
330
330
  | `memoryMaxChars` | `12000` | **项目**长期记忆字符上限,超出即自动精简(`0` = 不限制长度,仍去重) |
@@ -544,7 +544,7 @@ API Key 也可以来自环境变量,优先级低于配置文件:
544
544
  `observe` 的典型用法:先让它调研并给出方案,你翻 `.xuanzhu/state/observe.log`(或 `/autonomy`
545
545
  里列出的「最近被拦截的操作」)确认它想做什么,再切 `auto` 放行。读文件、搜索、看后台输出不受限制。
546
546
 
547
- `/auto on|off` 仍然可用,等价于 `/autonomy auto|ask`。
547
+ `/auto` 不带参数即打开(`/auto off` 关闭),等价于 `/autonomy auto|ask`。
548
548
 
549
549
  ## 系统提示词分段覆盖
550
550
 
@@ -1052,7 +1052,7 @@ v2ray / Clash / mihomo / sing-box **本地 SOCKS/HTTP 入站端口**,验证后
1052
1052
  当任务涉及某个领域时,玄猪会先 `list_skills` 查看可用技能、再 `load_skill` 加载完整指南
1053
1053
  (加载时自动安装并验证其依赖),然后借助 `bash` 执行指南中描述的命令。
1054
1054
 
1055
- 随包内置 27 个技能,常用如下(`btc-*` 七个只在 `xzh btc` 模式下可见):
1055
+ 随包内置 28 个技能,常用如下(`btc-*` 八个只在 `xzh btc` 模式下可见):
1056
1056
 
1057
1057
  | 技能 | 领域 | 依赖 |
1058
1058
  | --- | --- | --- |
@@ -1061,7 +1061,7 @@ v2ray / Clash / mihomo / sing-box **本地 SOCKS/HTTP 入站端口**,验证后
1061
1061
  | `autojs6` | **操作真实 Android 手机**:点击、滑动、输入、读界面、启动应用(脚本由设备桥推到手机上执行) | 无(手机需装 AutoJs6,见「手机设备桥」) |
1062
1062
  | `v2ray` | **本机代理发现与临时使用**:外网直连失败时探测本机 v2ray / Clash / sing-box 入站端口,验证后只对当前命令生效,并把端点写入全局记忆 | 无(需用户已启动代理客户端) |
1063
1063
  | `release` | **发版流程**:版本号 / CHANGELOG / 构建与测试 / `npm publish` / 等 registry 同步 / 推送 GitHub / 发布后校验(含逐步清单与踩坑) | 无(用 `npm` / `git`) |
1064
- | `btc-*`(7 个) | BTC 交易:数据同步、三阶段买卖点、回测调参、工作流与风控纪律、巡检排期管理、模拟盘规则、决策指令(**仅 `xzh btc` 模式**) | 无(用 btc 模式自带的 `btc_*` 工具) |
1064
+ | `btc-*`(8 个) | BTC 交易:数据同步、三周期打分 + 1h 择时、回测调参、工作流与风控纪律、巡检排期管理、模拟盘规则、决策指令、叫醒条件(**仅 `xzh btc` 模式**) | 无(用 btc 模式自带的 `btc_*` 工具) |
1065
1065
  | `github` / `gitlab` | 仓库、Issue、PR / MR | `gh` / `glab` |
1066
1066
  | `jira` / `linear` | 项目管理 | 对应 CLI |
1067
1067
  | `aws` / `kubernetes` | 云资源与容器编排 | `aws` / `kubectl` |
@@ -1107,7 +1107,7 @@ xzh btc # 进入 BTC 量化交易模式
1107
1107
  | 技能范围 | 只出现 `modes: [btc]` 与通用技能;`list_skills` / `load_skill` 在工具层就按模式裁剪 |
1108
1108
  | 提示词 | 追加一段「当前模式」说明(由代码生成,不可被 `xzh prompt set` 覆盖) |
1109
1109
  | 模型与记忆 | 与普通模式共用 `~/.xzh` 的模型配置;项目记忆落在 `~/.btc/.xuanzhu/` |
1110
- | 工具 | 额外启用 `btc_*`:`btc_price` / `btc_status` / `btc_sync` / `btc_signal` / `btc_backtest` |
1110
+ | 工具 | 额外启用 `btc_*`:行情与计算、巡检节奏与约束、真实交易、模拟盘四组,逐项见下表 |
1111
1111
 
1112
1112
  **首次进入会自动准备计算环境**(建 `~/.btc/venv` 并安装 numpy + pandas,一次性、需联网),
1113
1113
  装好后再进入界面;当时联网失败也不拦启动,只是行情/回测暂不可用 —— 之后可手动重试:
@@ -1120,28 +1120,57 @@ xzh btc setup --force # 删掉 venv 重装
1120
1120
  进模式后让 agent 先同步行情再判断:
1121
1121
 
1122
1122
  ```
1123
- btc_status → btc_sync → btc_signal(三阶段)→ btc_backtest(可选)
1123
+ btc_status → btc_sync → btc_signal(三周期打分 + 1h 择时)→ btc_backtest(可选)
1124
1124
  ```
1125
1125
 
1126
+ 买卖点规则(用户设定,代码执行):周线 / 日线 / 4h 各给 **-1(下跌)/ 0(横盘)/ +1(上涨)**,
1127
+ 三周期都 ≥0 只做多、都 ≤0 只做空、**全 0 或方向冲突不做**,任一周期数据不足也不做;
1128
+ **1 小时线负责「有没有机会」**:在上面做技术分析(结构 / 位置 / 动量 / 量能 / 形态),
1129
+ 给出 0–100 的机会评分与形态(回调 `pullback` 或放量突破 `breakout`);
1130
+ `≥60` 分且结构、位置、形态都不为 0 才是 `stage4_1h.entry = now`,否则等。
1131
+ 1h 不会把三周期给出的方向翻过来。含横盘周期时仓位减半。
1132
+
1133
+ `btc_order` 在下单前会用同一套结论做**方向闸门**:方向不符、`none` 或数据不足都直接拒绝
1134
+ (真钱);模拟盘 `btc_paper_open` 不拦,但会在返回里标注「实盘会被拒绝」。
1135
+
1126
1136
  | 工具 | 作用 |
1127
1137
  | --- | --- |
1128
1138
  | `btc_price` | 币安永续最新价、24h 涨跌与成交额(实时,不落库) |
1129
1139
  | `btc_status` | 计算环境是否就绪、日线/小时线根数与最新时间、风控参数 |
1130
1140
  | `btc_sync` | 从币安增量同步 K 线到 `~/.btc/data/btc.db`(走 xzh 的全局代理) |
1131
- | `btc_signal` | 三阶段买卖点(周线定势 → 日线定向 → 4 小时线定时) |
1132
- | `btc_backtest` | 内置融合策略全量回测,`overrides` 可临时覆盖参数做对比 |
1141
+ | `btc_signal` | 三周期打分(周/日/4h 各 -1/0/+1,同向才单向)+ 1 小时线机会评分(≥60 且形态成立才进) |
1142
+ | `btc_backtest` | 内置融合策略全量回测,`overrides` 可临时覆盖参数做对比(**注意:它不是实盘那套三周期判定**) |
1133
1143
  | `btc_schedule` | 安排巡检:默认**改写下一跳**(旧的自动取消),`mode=add` 追加额外检查点 |
1134
1144
  | `btc_unschedule` | 撤销巡检计划(按 id,或 `scope`:`next` / `extra` / `all`) |
1135
1145
  | `btc_policy` | 决策指令:把用户的长期要求落盘,注入后台每一轮巡检 |
1136
- | `btc_order` / `btc_close` | **真实挂单**(合约限价 GTC,不追价)/ 只减仓平仓 |
1146
+ | `btc_trigger` | 叫醒条件:价格/指标到什么值时叫醒巡检(后台每 5 分钟评估,**只叫醒不下单**) |
1147
+ | `btc_renew` | 给未成交挂单续期(判断继续等时用;只改时效、不动订单) |
1148
+ | `btc_order` / `btc_close` | **真实挂单**:限价(单档或 `orders[]` 多档分批,带时效 `expires_min`)/ 平仓(`market` 或 `limit`) |
1137
1149
  | `btc_orders` | 查挂单与持仓(确认限价单是否成交) |
1138
1150
  | `btc_cancel` | 撤单(按订单号或整个交易对) |
1139
1151
  | `btc_transfer_profit` | 锁利:合约 → 现货单向划转(上限为可用余额 95%) |
1140
1152
  | `btc_paper_status` | 模拟盘账本:权益、持仓、浮动盈亏、胜率、最近成交 |
1141
- | `btc_paper_open` / `btc_paper_close` | 模拟盘挂限价单(收盘价到达即成交)/ 平仓 |
1153
+ | `btc_paper_open` / `btc_paper_close` | 模拟盘挂限价单(到达即成交;限价被穿越则按更优价)/ 平仓 |
1142
1154
  | `btc_paper_cancel` | 撤销模拟盘未成交挂单 |
1143
1155
  | `btc_paper_reset` | 清空模拟盘账本(需确认;后台巡检里必被拒) |
1144
1156
 
1157
+ 「到某个位置再看一眼」不必改排期,直接用叫醒条件(对话里说就行,模型会调 `btc_trigger`):
1158
+
1159
+ ```
1160
+ 到 80000 提醒我看做空 → 价格条件(一次性,命中即失效)
1161
+ 1h RSI 跌破 30 就看一眼 → 指标条件(rsi / adx / ma_gap_pct / macd_hist,1h/4h/1d)
1162
+ ```
1163
+
1164
+ 后台**每 5 分钟**评估一次,命中才跑一轮巡检(不命中不调模型,所以很便宜);
1165
+ 条件默认 72 小时失效、最多同时 10 条,可用 `window_start_hour` / `window_end_hour`
1166
+ 限定北京时间时段(例如只在 21–24 点评估)。**它只叫醒、不下单** ——
1167
+ 下单仍由那一轮按三周期打分与风控判断。
1168
+
1169
+ 组合条件用**受限公式**(`kind=formula`):`rsi_1h * 0.6 + adx_1h * 0.4`、
1170
+ `(close_1h - ma20_1h) / atr_1h`。变量是 `字段_周期`(+`price`),只允许四则/比较/`and or not`
1171
+ 与 `abs/min/max`;求值在计算层按 AST 白名单执行,导入、属性、下标一律拒绝 ——
1172
+ **它不是「让模型写代码」的通道**,只是把「自己组合的指标」做成条件。
1173
+
1145
1174
  平台选择:`xzh btc platform` 交互式切换(写入 `~/.btc/platform.json`,立即生效,不用重启);
1146
1175
  环境变量 `BTC_EXCHANGE` 优先级更高,适合 CI / 多环境临时覆盖。
1147
1176
 
@@ -1163,7 +1192,8 @@ btc_status → btc_sync → btc_signal(三阶段)→ btc_backtest(可选
1163
1192
 
1164
1193
  `xzh btc` 会确保一个**独立的后端进程**在跑,它按**模型自己决定的间隔**巡检:
1165
1194
 
1166
- - 每轮巡检会取行情、算三阶段、给结论,然后自己决定下次什么时候再看
1195
+ - 行情由后端按 `BTC_SYNC_INTERVAL_MIN`(默认 15 分钟)**自动增量同步**,与是否巡检无关;
1196
+ - 每轮巡检会取行情、算三周期打分与 1h 择时、给结论,然后自己决定下次什么时候再看
1167
1197
  —— 例如判断「4 小时线接近触发,45 分钟后复核」;
1168
1198
  - 计划写进一个**排期队列**(`~/.btc/run/schedules.json`),后台每 60 秒检查一次,
1169
1199
  到点就执行 —— 不是 sleep,所以你随时能让它多排一次检查,不用等它「睡醒」;
@@ -1197,7 +1227,7 @@ btc_status → btc_sync → btc_signal(三阶段)→ btc_backtest(可选
1197
1227
 
1198
1228
  ### 模拟盘(`xzh btc moni`)
1199
1229
 
1200
- 模拟盘用**同一份行情库**、**同一套三阶段判断**,但成交记在本地虚拟账本上,**不涉及真钱**:
1230
+ 模拟盘用**同一份行情库**、**同一套三周期判断**,但成交记在本地虚拟账本上,**不涉及真钱**:
1201
1231
 
1202
1232
  ```bash
1203
1233
  xzh btc moni # 启动/复用模拟盘后端并进入界面
@@ -1207,9 +1237,11 @@ xzh btc stop # 两个都停(--paper 只停模拟盘)
1207
1237
 
1208
1238
  | 项 | 规则 |
1209
1239
  | --- | --- |
1210
- | 成交 | **限价挂单**:最新收盘价到达限价即视为全部成交,成交价 = 限价 |
1240
+ | 成交 | **限价挂单**:价格到达限价即成交;限价已在市场另一侧则**挂出即成交**,成交价取更优价(不会比限价差) |
1241
+ | 价格源 | 实时标记价;取不到才用库内最新收盘价,并在输出里标注「可能滞后」 |
1211
1242
  | 成本 | 手续费 0.05%(开平各一次),不计资金费 |
1212
- | 持仓 | 同时只允许一个持仓、一张未成交挂单 |
1243
+ | 杠杆 | `leverage` 默认 1x:现金占用 = 名义 ÷ 杠杆,与实盘保证金口径一致 |
1244
+ | 持仓 | 同时只允许一个持仓;可挂多档(最多 5 张未成交) |
1213
1245
  | 初始资金 | 默认 100000 USDT(`BTC_PAPER_CAPITAL` 可改) |
1214
1246
  | 账本 | `~/.btc/data/btc.db` 的 `paper_account` / `paper_trades` 表 |
1215
1247
 
@@ -1223,11 +1255,23 @@ xzh btc stop # 两个都停(--paper 只停模拟盘)
1223
1255
 
1224
1256
  `btc_order` **必须给 `limit_price`**,下的是限价 GTC 单:
1225
1257
 
1226
- - 不追价、不立即成交,**挂到下一次买卖点或主动撤单为止**;
1258
+ - **可以多档**:`orders: [{limit_price, notional}, …]` 一次挂好分批接单(每档独立时效、独立撤单);
1259
+ - **开仓前算保证金**:总名义 ÷ 杠杆 + 手续费 ≤ 可用余额 × 0.95,超了直接拒绝并给出「最多可开多少名义」;
1260
+ - 不追价、不立即成交,**挂到时效(`expires_min`,默认 60 分钟)、下一次买卖点或主动撤单为止**;
1227
1261
  - 未成交前不算持仓,面板与 `btc_orders` 里显示为挂单;
1228
- - 到下一次巡检、或三阶段结论变了仍未成交 → 由 agent 决定「继续等」还是 `btc_cancel all=true` 撤掉;
1262
+ - 到下一次巡检、或三周期打分变了仍未成交 → 由 agent 决定「继续等」还是 `btc_cancel all=true` 撤掉;
1263
+ - **时效到点仍未成交 / 只部分成交 → 后端主动叫醒一轮巡检**(每 5 分钟检查),
1264
+ 由 agent 决定撤单、改价,还是明确继续等并给新时效;它**不会自动撤单**;
1229
1265
  - 止损/止盈作为 `closePosition` 条件单一起挂(触发时按当时仓位全平);
1230
- - 模拟盘同规则:挂单后按**收盘价**判断,价格到达限价即全部成交。
1266
+ - 模拟盘同规则:价格到达限价即成交;限价被穿越时按市价成交(用实时标记价,取不到才用收盘价),
1267
+ 挂单同样带时效,且允许同时挂多档(成交后按加权均价合并成一个持仓)。
1268
+
1269
+ **平仓由 agent 判断用市价还是限价**(`btc_close` 的 `mode`):
1270
+
1271
+ - 市价(默认):确定出场、接受滑点 —— 临近止损/强平、行情快速时用它;
1272
+ - 限价:控滑点,但**未成交前仓位与止损都还在**,必须给 `expires_min`;
1273
+ 挂在不成交侧时工具会明确警告,超时由后端叫醒处理;
1274
+ - 市价平仓会回报成交均价与估算盈亏,限价平仓在成交前不算「已平仓」。
1231
1275
 
1232
1276
  平仓(`btc_close`)是市价 + `reduceOnly` —— 出场要确定,不在场内等。
1233
1277
 
@@ -1264,7 +1308,7 @@ btc 模式下右侧面板不再是终端,而是只读仪表盘(每 8 秒刷
1264
1308
 
1265
1309
  ```
1266
1310
  BTC 永续 U 本位合约
1267
- 77,415.30 -0.58%
1311
+ 79,350.40 -1.20%
1268
1312
  ─────────────
1269
1313
  权益 100,000.00
1270
1314
  可用 98,999.50
@@ -1274,16 +1318,30 @@ btc 模式下右侧面板不再是终端,而是只读仪表盘(每 8 秒刷
1274
1318
  挂单 2 条
1275
1319
  买 76,800.00 × 0.010
1276
1320
  ─────────────
1277
- 巡检
1278
- 14:47 · 30 分钟后
1279
- 复核小时线
1280
- 15:20 · 45 分钟后(额外)
1281
- 资金费前后各看一次
1282
- ─────────────
1283
1321
  风控 正常
1284
1322
  持仓亏损 50% · 当日 10%
1323
+ ─────────────
1324
+ 监控(每 5 分钟)
1325
+ 2 条条件 · 下次评估 3 分 20 秒后
1326
+ · 价格 >= 80000 · 现 79350 · 仅 21–24 点
1327
+ · 1h rsi <= 30 · 现 42.8
1328
+ ─────────────
1329
+ 最近交易
1330
+ 22:10 空 1.2444 80,276→79,359 +1,140.00
1331
+ 21:02 多 1.2000 78,900→79,400 -120.00
1332
+ ─────────────
1333
+ 巡检
1334
+ 23:47 · 30 分钟后
1335
+ 复核小时线
1285
1336
  ```
1286
1337
 
1338
+ 两段数据各有边界:
1339
+
1340
+ - **监控**:倒计时来自后端 state(每 5 分钟评估一次叫醒条件);后端没在跑时显示「后端未运行」。
1341
+ 面板只列前 2 条条件并附带最近观测值,完整列表用 `btc_trigger list`。
1342
+ - **最近交易**:模拟盘读虚拟账本的已平仓记录(最近 3 笔,含入场→出场与盈亏);
1343
+ 实盘读动作账本 `run/actions.jsonl`(只含**我们自己发起**的开/平仓,手动操作不在内)。
1344
+
1287
1345
  `Shift+Tab` 在 btc 模式下不再切到右栏(那里没有输入行)。
1288
1346
 
1289
1347
  **模拟盘(`xzh btc moni`)下同一个面板换一套数据**:权益 / 现金 / 持仓 / 挂单 / 已平仓绩效,
@@ -1308,6 +1366,11 @@ btc 模式下右侧面板不再是终端,而是只读仪表盘(每 8 秒刷
1308
1366
 
1309
1367
  `/reset`(不带参数)仍然是重置对话上下文,两者互不影响。
1310
1368
 
1369
+ 重置除了把钱改回初始值,还会**清空成交、挂单与持仓**,并把「重置前是什么状态」
1370
+ (几笔成交、实现盈亏、原持仓/挂单、现金与初始资金变化)写进项目记忆
1371
+ `~/.btc/.xuanzhu/memory/<日期>.md` —— 否则下一轮对话里 xzh 只看到「钱回到 10 万」,
1372
+ 分不清是你主动重置还是数据丢了。
1373
+
1311
1374
  ### 只做合约,不做现货
1312
1375
 
1313
1376
  - 交易只走**合约**(`fapi`),代码里没有现货下单路径;