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
|
@@ -1,38 +1,86 @@
|
|
|
1
1
|
import { mergeUserProfileDefaults } from "../core/state/profileStore.js";
|
|
2
|
-
|
|
2
|
+
import { HL_MIN_ORDER_NOTIONAL_USD } from "../core/hyperliquid/rounding.js";
|
|
3
|
+
import { computeAtr, parseCandlesFromSnapshot } from "./touchProbability.js";
|
|
4
|
+
export function buildAdvisorSystemPrompt(profile, contextVersion = "raw_kline") {
|
|
3
5
|
const p = mergeUserProfileDefaults(profile);
|
|
4
|
-
const
|
|
6
|
+
const perCoinMax = p.maxSzByCoin && Object.keys(p.maxSzByCoin).length > 0
|
|
5
7
|
? `- per-coin max size: ${JSON.stringify(p.maxSzByCoin)}`
|
|
6
8
|
: "";
|
|
9
|
+
const perCoinMin = p.minSzByCoin && Object.keys(p.minSzByCoin).length > 0
|
|
10
|
+
? `- per-coin min size: ${JSON.stringify(p.minSzByCoin)}`
|
|
11
|
+
: "";
|
|
12
|
+
const antiRush = (p.antiRushCloseMinSec ?? 0) > 0
|
|
13
|
+
? `- 防抢跑平仓:持仓未满 ${p.antiRushCloseMinSec}s 且 mid 未触及原 TP/SL 时,系统会拒绝 close_position(含 protection_pending 与 protection_active)`
|
|
14
|
+
: "";
|
|
15
|
+
const protectionGrace = (p.protectionGraceSec ?? 360) > 0
|
|
16
|
+
? `- 保护单宽限期:entry_filled 后 ${p.protectionGraceSec ?? 360}s 内 reconcile 可能尚未把 TP/SL 挂到簿上;此期间勿称「裸仓」,应 wait 再等一轮`
|
|
17
|
+
: "";
|
|
18
|
+
const minClosePnl = (p.minClosePnlPct ?? 0.01) > 0
|
|
19
|
+
? `- 微利禁平:|浮盈/亏| < ${((p.minClosePnlPct ?? 0.01) * 100).toFixed(2)}% 时系统拒绝 close_position;**若 protection_active(SL 已挂簿),小浮亏应 wait 让 SL 工作,tp_unreachable 不能绕过**;无保护单时方可 tp_unreachable=true 且 thesis 已破`
|
|
20
|
+
: "";
|
|
21
|
+
const minRr = p.minRewardRiskRatio ?? (p.risk === "conservative" ? 2.5 : p.risk === "aggressive" ? 1.5 : 2);
|
|
22
|
+
const maxSlPct = p.maxSlPctFromEntry ?? (p.risk === "conservative" ? 0.012 : p.risk === "aggressive" ? 0.03 : 0.02);
|
|
23
|
+
const tpslDiscipline = `- TP/SL 几何(系统硬校验):以 limit_px 为基准,**止损距离须小于止盈距离**(盈亏比 TP/SL ≥ ${minRr.toFixed(1)}:1);SL 距 entry 不得超过 ${(maxSlPct * 100).toFixed(2)}%。禁止 TP/SL 与 entry 或 mid 等距对称。SL 挂最近结构支撑/阻力;TP 挂趋势目标位(analysis.price_targets)。若 SL 过宽,应把 limit_px 沿趋势方向回调(做多更低、做空更高)而非放大 SL`;
|
|
24
|
+
const touchProb = `- SL 触及概率(系统自算,**仅 open_with_bracket 执行前校验**;place_limit_ambush 未成交前 SL 未激活,跳过此护栏):用 1h ATR + analysis.time_horizon 估算 mid 在 horizon 内触及 entry/SL 的概率;SL 触及 ×${(p.slSweepLiquidityMultiplier ?? 2).toFixed(1)} 近似扫止损风险。超过 profile 阈值会拒单;执行前自动把 SL 再偏移 ${((p.slAntiSweepAtrFactor ?? 0.3) * 100).toFixed(0)}%×ATR₁h 避 magnet,并同步外推 TP 保持盈亏比。confidence ≠ 触及概率;请在 price_targets 为 SL/entry 标注 probability 供 reasoning`;
|
|
25
|
+
const ambushDev = p.ambushReplaceDeviationPct !== undefined
|
|
26
|
+
? `- 埋伏单替换阈值:新限价与 pending 偏离 > ${(p.ambushReplaceDeviationPct * 100).toFixed(2)}% 时自动 request-cancel 并重挂`
|
|
27
|
+
: `- 埋伏单替换阈值:偏离 > ${(p.priceDeviationPctMax * 100).toFixed(2)}%(同 priceDeviationPctMax)时自动替换`;
|
|
7
28
|
return `你是一位专注于 Hyperliquid 永续合约的风控型量化交易顾问,具备专业的技术分析能力。请只回复一个 JSON 对象(不要 markdown 围栏,不要额外文字)。JSON 必须符合用户消息中的约定,且 reason 等文本字段请使用中文。
|
|
8
29
|
|
|
30
|
+
## analysis 字段类型(硬性约束,违反会导致校验失败并重试)
|
|
31
|
+
|
|
32
|
+
- \`analysis.indicators\`、\`analysis.elliott_wave\`、\`analysis.chan_theory\`:**必须是字符串**(一段中文摘要),**禁止 JSON 子对象**(勿写 \`{ "trend": "...", "macd": "..." }\` 这类嵌套结构;把要点合并成一段 prose)
|
|
33
|
+
- \`analysis.time_horizon\`:字符串
|
|
34
|
+
- \`analysis.price_targets\`:对象数组(每项含 level、label、time_est,probability 可选)
|
|
35
|
+
- \`analysis.range_15_30m\`:可选对象;不适用则**省略该字段**,勿填 null
|
|
36
|
+
- \`place_limit_ambush\` 的 \`range_15_30m\` 在 **action 顶层**,不要与 analysis 混用重复
|
|
37
|
+
|
|
9
38
|
用户风险偏好:
|
|
10
39
|
- 风格:${p.risk}
|
|
11
|
-
- 当 requireTpsl 为 true(当前:${p.requireTpsl})时,bracket 交易必须包含 TP 和 SL
|
|
40
|
+
- 当 requireTpsl 为 true(当前:${p.requireTpsl})时,bracket / 埋伏 交易必须包含 TP 和 SL
|
|
12
41
|
- 限价单价格应在当前 mid 的 ±${(p.priceDeviationPctMax * 100).toFixed(2)}% 以内,除非选择等待
|
|
13
42
|
${p.defaultMaxSz !== undefined ? `- 建议最大仓位上限参考:${p.defaultMaxSz}` : ""}
|
|
14
|
-
${
|
|
43
|
+
${p.defaultMinSz !== undefined ? `- 建议最小开仓数量参考:${p.defaultMinSz}` : ""}
|
|
44
|
+
${perCoinMax}
|
|
45
|
+
${perCoinMin}
|
|
46
|
+
${antiRush}
|
|
47
|
+
${protectionGrace}
|
|
48
|
+
${minClosePnl}
|
|
49
|
+
${tpslDiscipline}
|
|
50
|
+
${touchProb}
|
|
51
|
+
${ambushDev}
|
|
52
|
+
${p.forbidCancelAllWithActiveAmbush ? "- 有未过期 TTL 埋伏入场单时,禁止 cancel_all;应 wait 或 place_limit_ambush 替换" : ""}
|
|
15
53
|
${p.tradingStyleNotes ? `- 备注:${p.tradingStyleNotes}` : ""}
|
|
16
54
|
|
|
17
|
-
## 分析框架(决策前必须先完成以下三维分析,结果写入 analysis
|
|
55
|
+
## 分析框架(决策前必须先完成以下三维分析,结果写入 analysis 字段;§1–§3 各输出一段中文字符串)
|
|
56
|
+
${contextVersion === "precomputed_indicators"
|
|
57
|
+
? `**数据路由**:§1 技术指标解读使用 indicator_summary;§2 波浪理论、§3 缠论、§4 价格目标使用 kline_5m_compact / kline_1h_compact / kline_1d_compact(精简 K 线,含 h/l/o/c/v,根数与标准 K 线一致,用于结构分析和量价配合)。两套数据互补,不得仅依赖 indicator_summary 做价格点位判断。
|
|
18
58
|
|
|
19
|
-
### 1. 常规技术指标(analysis.indicators
|
|
59
|
+
### 1. 常规技术指标(analysis.indicators — 字符串,非对象)
|
|
60
|
+
基于用户消息中预计算的 indicator_summary,用中文综述当前技术环境:
|
|
61
|
+
- 趋势:解读 5m/1h/1d 三周期 EMA 排列是否共振(EMA5/EMA20/EMA60 方向是否一致),有无周期分化信号
|
|
62
|
+
- 动能:MACD DIF/DEA 关系 + 柱状图方向,结合 RSI 是否进入极端区间(>70 或 <30),重点关注 5m 级别短线动能转折
|
|
63
|
+
- 波动率:布林带价格位置与带宽方向,结合 ATR% 和对数收益率波动率判断当前波动率环境(高波动/低波动/正常)
|
|
64
|
+
- 量价关系:近 3 根相对均量的倍数,判断放量/缩量/量平;结合精简 K 线量价配合做二次确认,5m 放量是短线方向有效性的关键信号
|
|
65
|
+
- Z-Score:价格偏离 SMA20 的程度,辅助判断超买超卖的统计极端性
|
|
66
|
+
综合判定当前趋势阶段:强势上涨 / 强势下跌 / 弱势盘整 / 即将变盘`
|
|
67
|
+
: `### 1. 常规技术指标(analysis.indicators — 字符串,非对象)
|
|
20
68
|
综合多周期 K 线数据,分析以下指标并给出文字摘要:
|
|
21
69
|
- 趋势:EMA/MA 排列方向,日线/1h/5m 多周期共振程度
|
|
22
70
|
- 动能:MACD 柱高度变化、DIF/DEA 穿越、背离
|
|
23
71
|
- 超买超卖:RSI 数值及是否进入极端区间
|
|
24
72
|
- 波动率:布林带开合程度,价格所处带位
|
|
25
73
|
- 量价关系(如有成交量数据)
|
|
26
|
-
综合判断当前趋势状态:强势上涨 / 强势下跌 / 弱势盘整 /
|
|
74
|
+
综合判断当前趋势状态:强势上涨 / 强势下跌 / 弱势盘整 / 即将变盘`}
|
|
27
75
|
|
|
28
|
-
### 2. 波浪理论(analysis.elliott_wave
|
|
76
|
+
### 2. 波浪理论(analysis.elliott_wave — 字符串,非对象)
|
|
29
77
|
对当前价格走势进行波浪标注:
|
|
30
78
|
- 判断当前所处浪级(推动浪 i~v 或调整浪 A/B/C)
|
|
31
79
|
- 说明前一完整浪形的起止价格,以及当前浪的起点位置
|
|
32
80
|
- 预测下一浪的方向与典型目标位(参考黄金比例 0.618 / 1.0 / 1.618 扩展)
|
|
33
81
|
- 若判断不确定,说明多空两个情景下的浪形路径
|
|
34
82
|
|
|
35
|
-
### 3. 缠论(analysis.chan_theory
|
|
83
|
+
### 3. 缠论(analysis.chan_theory — 字符串,非对象)
|
|
36
84
|
从缠论角度分析结构:
|
|
37
85
|
- 识别近期的笔(BI)和线段(Duan)方向
|
|
38
86
|
- 判断当前中枢位置(震荡区间上下界)
|
|
@@ -49,30 +97,134 @@ ${p.tradingStyleNotes ? `- 备注:${p.tradingStyleNotes}` : ""}
|
|
|
49
97
|
### 5. 时间维度(analysis.time_horizon)
|
|
50
98
|
基于分析给出本次策略的建议持仓时长,如"4-8小时"、"1-2天"
|
|
51
99
|
|
|
100
|
+
### 6. 15–30 分钟乐观区间(analysis.range_15_30m,可选)
|
|
101
|
+
当策略为短期埋伏时填写:
|
|
102
|
+
- low / high: 预期震荡或目标区间
|
|
103
|
+
- optimistic_side: buy|sell — 区间内更可能先触达的方向
|
|
104
|
+
- confidence: 0~1(可选)
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 多周期联立与冲突处理
|
|
109
|
+
|
|
110
|
+
各周期角色:**日线定趋势背景与长期目标位**,**1h 定当前结构与关键支撑阻力**,**5m 定精确入场时点与短期区间**。
|
|
111
|
+
|
|
112
|
+
信号一致性决定仓位和信心:
|
|
113
|
+
|
|
114
|
+
| 场景 | 处理规则 |
|
|
115
|
+
|------|---------|
|
|
116
|
+
| **三周期共振**(日线+1h+5m 方向一致) | 标准仓位、标准信心阈值、正常持仓周期 |
|
|
117
|
+
| **仅 5m 异动**(1h+日线一致,5m 反向) | 视为短期噪音或回调,等 5m 顺向确认后再入场,不改变方向判断 |
|
|
118
|
+
| **日线与小周期冲突**(日线多但 1h+5m 空,或日线空但 1h+5m 多) | 见下方按 risk 偏好处理 |
|
|
119
|
+
|
|
120
|
+
日线/小周期冲突时的处理:
|
|
121
|
+
|
|
122
|
+
- **conservative**:**日线优先**。小周期反向信号仅用于推迟入场或收紧止损,不对抗日线方向开仓。若日线趋势明确(EMA60 连续定向),即使 1h+5m 放量反向,也只可 flat 等回调至日线支撑/阻力位再顺向入场。
|
|
123
|
+
- **balanced**:**可顺小周期参与,但降低暴露**。仓位降至标准 50%~60%,信心阈值 +0.1(需更确信),止损收紧至 1.3×ATR%,持仓周期不超过日线时间窗的一半。若日线无方向(盘整),则以 1h 为主要参考。
|
|
124
|
+
- **aggressive**:**小周期优先**。日线仅作背景参考,以 1h+5m 信号决定方向与入场。逆日线开仓须在 price_targets 中显式标注日线反向风险位作为硬止盈参考。
|
|
125
|
+
|
|
126
|
+
**量价权重**:若 1h+5m 双周期放量且方向一致,即使与缩量日线冲突,其置信度也高于无量日线信号(缩量单边趋势可能是假突破)。反之,若日线放量 + 小周期缩量反向,则日线优先。
|
|
127
|
+
|
|
128
|
+
在 reason 中简述多周期一致性,如「日线多头排列+1h 回调至支撑+5m 底分型放量 → 三周期共振做多」,或「日线多头但 1h 放量跌穿中枢 → balanced 等日线支撑确认后再参与」。
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 输出格式(双槽位,analysis 必填)
|
|
133
|
+
|
|
134
|
+
**先完成 §§1–6 完整分析,写入 analysis 字段,再分别给出 scalp 和 ambush 的决策。** analysis 必须包含 indicators、elliott_wave、chan_theory 三段中文字符串和 price_targets、time_horizon。
|
|
135
|
+
|
|
136
|
+
JSON 格式:
|
|
137
|
+
|
|
138
|
+
{
|
|
139
|
+
"analysis": { "indicators": "…技术指标综述…", "elliott_wave": "…波浪标注…", "chan_theory": "…缠论分析…", "price_targets": [...], "time_horizon": "…" },
|
|
140
|
+
"scalp": { "action": "wait", "reason": "…", "confidence": 0.7 },
|
|
141
|
+
"ambush": { "action": "place_limit_ambush", "side": "sell", "limit_px": 92.5, "sz": 25, "tp_px": 88.6, "sl_px": 92.9, "expires_in_min": 20, "is_market": false, "protection_limit_px": 92.5, "reason": "…", "confidence": 0.75 }
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
每个槽位独立决策,可以同时 wait、同时行动、或一个 wait 一个行动。两个策略互不干扰。
|
|
145
|
+
|
|
52
146
|
---
|
|
53
147
|
|
|
54
|
-
##
|
|
148
|
+
## scalp 策略(超短线、市价进出)
|
|
149
|
+
|
|
150
|
+
**定位**:5m 级别信号驱动,市价成交,分钟级持仓,赚小波段。
|
|
151
|
+
|
|
152
|
+
**参数**:is_market=true 市价入场,SL = 0.5~1×ATR₅m(窄止损),TP = 1.5~2×ATR₅m(小止盈),R:R = 1.5~2:1,持仓 5-30 分钟,仓位 = 标准 50%~70%。
|
|
153
|
+
|
|
154
|
+
**适用条件**(全部满足才打,否则 scalp 槽位填 wait):
|
|
155
|
+
1. 日线非单边强趋势(|Z-Score₅m| < 2,布林带宽 > 3%)
|
|
156
|
+
2. 5m 级别有明确信号:RSI₅m >65 或 <35 + MACD₅m 柱转向 + 5m 放量 ≥ 1.2×均量
|
|
157
|
+
3. 1h EMA5 方向与 scalp 方向一致
|
|
158
|
+
|
|
159
|
+
**禁止 scalp**:日线 Z-Score > 2.5、5m 无量、重大消息面。
|
|
160
|
+
|
|
161
|
+
**策略隔离(硬规则)**:
|
|
162
|
+
- 仅关注 strategy="scalp" 的持仓和挂单。strategy≠"scalp" 的仓位视为不存在(不分析、不因它 wait/close)。
|
|
163
|
+
- scalp 最多同时持有一个仓位,无 scalp 仓位时视为空仓直接评估开仓。
|
|
164
|
+
- scalp 盈亏自行推算:entry_limit_px vs 当前 mid。
|
|
165
|
+
|
|
166
|
+
**退场**:TP/SL 触发由 reconcile 自动处理;入场 30min 未触发 → close_position(time-stop)。
|
|
167
|
+
|
|
168
|
+
**仓位轮换**:已有 scalp 仓位且浮盈时,若新机会 R:R×confidence 明显优于当前仓剩余空间,可 close_position 后下次再 open_with_bracket。reason 中简述轮换依据。
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## ambush 策略(限价埋伏、结构交易)
|
|
173
|
+
|
|
174
|
+
**定位**:1h 结构位驱动,挂限价等回调成交,小时到天级持仓,做大结构。
|
|
175
|
+
|
|
176
|
+
**允许动作**:wait / place_limit_ambush / close_position / cancel_all。
|
|
177
|
+
|
|
178
|
+
**参数**:limit_px 挂限价入场,expires_in_min 建议 15-30,SL 挂 1h 结构支撑/阻力位,TP 挂趋势目标位,R:R ≥ 2:1。
|
|
179
|
+
|
|
180
|
+
**策略隔离(硬规则)**:
|
|
181
|
+
- 仅关注 strategy="ambush" 或无 strategy 的持仓和挂单。strategy="scalp" 的仓位视为不存在。
|
|
182
|
+
- pending_ambush_intents 仅列 ambush 策略的待处理意图。
|
|
183
|
+
|
|
184
|
+
**埋伏 / 持仓纪律**:
|
|
185
|
+
1. 无持仓且看 15-30m 区间 → 优先 place_limit_ambush
|
|
186
|
+
2. 已有 pending 埋伏(见 pending_ambush_intents)→ 估计未变则 wait;偏离大用 place_limit_ambush 替换
|
|
187
|
+
3. 持仓中 active_position_plan 存在且 strategy≠"scalp" → protection_pending 时 wait;protection_active 时小浮亏 wait,trend_toward_tp 时 wait
|
|
188
|
+
4. 仅当 time_horizon 已过、无保护单、|浮盈/亏| 达阈值、或 SL 逻辑失效时 close_position
|
|
189
|
+
5. 不要用 cancel_all 清理未过期埋伏
|
|
190
|
+
|
|
191
|
+
---
|
|
55
192
|
|
|
56
|
-
|
|
57
|
-
- "wait":包含 reason(中文)、confidence
|
|
58
|
-
- "open_with_bracket":side buy|sell,limit_px,sz,tp_px,sl_px,is_market boolean;若 is_market 为 false,需设置 protection_limit_px(TP/SL 触发后的跟随限价);reason(中文)、confidence,risk_flags 可选数组
|
|
59
|
-
- "close_position":method "market"|"limit";若为 limit,需设置 limit_px;reason(中文)、confidence
|
|
60
|
-
- "cancel_all":撤销本地 state 中所有挂单 — 仅需 reason(中文)
|
|
193
|
+
## 通用规则
|
|
61
194
|
|
|
62
|
-
|
|
63
|
-
tp_px / sl_px
|
|
195
|
+
仓位大小单位为币种单位。Hyperliquid 单笔最低名义价值 **${HL_MIN_ORDER_NOTIONAL_USD} USDC**(limit_px × sz)。open_with_bracket / place_limit_ambush 的 sz 必须同时满足:① HL 名义价值下限;② profile 中的 defaultMinSz / minSzByCoin。置信度低时保守操作;不确定时优先 wait。
|
|
196
|
+
tp_px / sl_px 必须与 analysis.price_targets 中的结构位一致:**SL 取近端 invalidation(距离小),TP 取趋势延伸目标(距离大)**;勿用 mid±等距对称价。`;
|
|
64
197
|
}
|
|
65
|
-
export function formatFirstUserPayload(snapshot) {
|
|
66
|
-
|
|
198
|
+
export function formatFirstUserPayload(snapshot, extras) {
|
|
199
|
+
const atr1h = computeAtr(parseCandlesFromSnapshot(snapshot.kline_1h));
|
|
200
|
+
const base = {
|
|
67
201
|
coin: snapshot.coin,
|
|
68
202
|
network: snapshot.network,
|
|
69
203
|
now_ms: snapshot.now_ms,
|
|
70
204
|
mid: snapshot.mid,
|
|
71
205
|
positions: snapshot.positions,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
206
|
+
pending_ambush_intents: extras?.pendingAmbushIntents ?? [],
|
|
207
|
+
active_position_plan: extras?.activePositionPlan ?? null,
|
|
208
|
+
volatility_hints: {
|
|
209
|
+
atr_1h: atr1h,
|
|
210
|
+
default_horizon_hours: 6,
|
|
211
|
+
note: snapshot.context_version === "precomputed_indicators"
|
|
212
|
+
? "指标已预计算(见 indicator_summary);SL触及概率 open_with_bracket 执行前校验"
|
|
213
|
+
: "open_with_bracket 执行前会校验 sl_touch_prob / sl_sweep_prob;place_limit_ambush 仅记录 touch-prob 日志",
|
|
214
|
+
},
|
|
75
215
|
user_note: snapshot.user_note,
|
|
76
|
-
}
|
|
216
|
+
};
|
|
217
|
+
if (snapshot.context_version === "precomputed_indicators") {
|
|
218
|
+
base.indicator_summary = snapshot.indicator_summary ?? null;
|
|
219
|
+
base.kline_5m_compact = snapshot.kline_5m_compact ?? [];
|
|
220
|
+
base.kline_1h_compact = snapshot.kline_1h_compact ?? [];
|
|
221
|
+
base.kline_1d_compact = snapshot.kline_1d_compact ?? [];
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
base.kline_5m = snapshot.kline_5m;
|
|
225
|
+
base.kline_1h = snapshot.kline_1h;
|
|
226
|
+
base.kline_1d = snapshot.kline_1d;
|
|
227
|
+
}
|
|
228
|
+
return JSON.stringify(base, null, 2);
|
|
77
229
|
}
|
|
78
230
|
//# sourceMappingURL=promptTemplate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promptTemplate.js","sourceRoot":"","sources":["../../src/advisor/promptTemplate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"promptTemplate.js","sourceRoot":"","sources":["../../src/advisor/promptTemplate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { JsonValue } from "../core/hyperliquid/types.js";
|
|
2
|
+
import type { UserProfile } from "../core/state/schema.js";
|
|
3
|
+
import type { AdvisorAnalysis } from "./actionSchema.js";
|
|
4
|
+
import type { AdvisorBracketOpenAction } from "./actionSchema.js";
|
|
5
|
+
export type ParsedCandle = {
|
|
6
|
+
h: number;
|
|
7
|
+
l: number;
|
|
8
|
+
c: number;
|
|
9
|
+
};
|
|
10
|
+
export type BracketTouchProbabilities = {
|
|
11
|
+
horizon_hours: number;
|
|
12
|
+
atr_1h: number | null;
|
|
13
|
+
sigma_move: number | null;
|
|
14
|
+
entry_touch_prob: number | null;
|
|
15
|
+
sl_touch_prob: number | null;
|
|
16
|
+
sl_sweep_prob: number | null;
|
|
17
|
+
liquidity_multiplier: number;
|
|
18
|
+
};
|
|
19
|
+
export declare function parseCandlesFromSnapshot(raw: JsonValue): ParsedCandle[];
|
|
20
|
+
/** Build flat-range 1h candles with ~fixed TR for unit tests. */
|
|
21
|
+
export declare function syntheticCandlesForTest(bars: number, center: number, tr: number): JsonValue;
|
|
22
|
+
/** Wilder-style ATR using the last `period` true-range bars. */
|
|
23
|
+
export declare function computeAtr(candles: ParsedCandle[], period?: number): number | null;
|
|
24
|
+
/** Best-effort parse of analysis.time_horizon (e.g. "4-8小时", "1-2天"). */
|
|
25
|
+
export declare function parseTimeHorizonHours(raw: string | undefined, fallback?: number): number;
|
|
26
|
+
/** Standard normal CDF (Abramowitz & Stegun approximation). */
|
|
27
|
+
export declare function normalCdf(x: number): number;
|
|
28
|
+
/** P(min price within horizon reaches L) from above, drift≈0, diffusion σ_move. */
|
|
29
|
+
export declare function lowerBarrierTouchProb(spot: number, level: number, sigmaMove: number): number | null;
|
|
30
|
+
/** P(max price within horizon reaches H) from below. */
|
|
31
|
+
export declare function upperBarrierTouchProb(spot: number, level: number, sigmaMove: number): number | null;
|
|
32
|
+
export declare function resolveSlSweepLiquidityMultiplier(profile: UserProfile | undefined): number;
|
|
33
|
+
export declare function resolveMaxSlTouchProb(profile: UserProfile | undefined): number;
|
|
34
|
+
export declare function resolveMaxSlSweepProb(profile: UserProfile | undefined): number;
|
|
35
|
+
export declare function resolveSlAntiSweepAtrFactor(profile: UserProfile | undefined): number;
|
|
36
|
+
export declare function sigmaMoveFromAtr(atr1h: number, horizonHours: number): number;
|
|
37
|
+
export declare function computeBracketTouchProbabilities(params: {
|
|
38
|
+
action: Pick<AdvisorBracketOpenAction, "side" | "limit_px" | "sl_px">;
|
|
39
|
+
spot: number | null;
|
|
40
|
+
kline1h: JsonValue;
|
|
41
|
+
analysis?: AdvisorAnalysis;
|
|
42
|
+
profile?: UserProfile;
|
|
43
|
+
horizonHoursFallback?: number;
|
|
44
|
+
}): BracketTouchProbabilities;
|
|
45
|
+
export declare function formatTouchProbNote(probs: BracketTouchProbabilities): string;
|
|
46
|
+
/**
|
|
47
|
+
* Move SL away from obvious structure (buy: lower SL, sell: raise SL) by factor×ATR₁h,
|
|
48
|
+
* then widen TP by the same reward:risk ratio so bracket geometry is preserved.
|
|
49
|
+
*/
|
|
50
|
+
export declare function applyAntiSweepSlOffset(action: AdvisorBracketOpenAction, atr1h: number | null, factor: number, szDecimals?: number): {
|
|
51
|
+
action: AdvisorBracketOpenAction;
|
|
52
|
+
notes: string[];
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=touchProbability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"touchProbability.d.ts","sourceRoot":"","sources":["../../src/advisor/touchProbability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { roundHyperliquidPerpPrice } from "../core/hyperliquid/rounding.js";
|
|
2
|
+
import { mergeUserProfileDefaults } from "../core/state/profileStore.js";
|
|
3
|
+
export function parseCandlesFromSnapshot(raw) {
|
|
4
|
+
if (!Array.isArray(raw)) {
|
|
5
|
+
return [];
|
|
6
|
+
}
|
|
7
|
+
const out = [];
|
|
8
|
+
for (const row of raw) {
|
|
9
|
+
if (typeof row !== "object" || row === null) {
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
const o = row;
|
|
13
|
+
const h = Number(o.h);
|
|
14
|
+
const l = Number(o.l);
|
|
15
|
+
const c = Number(o.c);
|
|
16
|
+
if (Number.isFinite(h) && Number.isFinite(l) && Number.isFinite(c) && h >= l) {
|
|
17
|
+
out.push({ h, l, c });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
/** Build flat-range 1h candles with ~fixed TR for unit tests. */
|
|
23
|
+
export function syntheticCandlesForTest(bars, center, tr) {
|
|
24
|
+
const half = tr / 2;
|
|
25
|
+
const rows = [];
|
|
26
|
+
for (let i = 0; i < bars; i++) {
|
|
27
|
+
rows.push({ h: center + half, l: center - half, o: center, c: center });
|
|
28
|
+
}
|
|
29
|
+
return rows;
|
|
30
|
+
}
|
|
31
|
+
/** Wilder-style ATR using the last `period` true-range bars. */
|
|
32
|
+
export function computeAtr(candles, period = 14) {
|
|
33
|
+
if (candles.length < period + 1 || period <= 0) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const trs = [];
|
|
37
|
+
for (let i = 1; i < candles.length; i++) {
|
|
38
|
+
const prev = candles[i - 1];
|
|
39
|
+
const cur = candles[i];
|
|
40
|
+
trs.push(Math.max(cur.h - cur.l, Math.abs(cur.h - prev.c), Math.abs(cur.l - prev.c)));
|
|
41
|
+
}
|
|
42
|
+
const recent = trs.slice(-period);
|
|
43
|
+
if (recent.length === 0) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
return recent.reduce((sum, tr) => sum + tr, 0) / recent.length;
|
|
47
|
+
}
|
|
48
|
+
/** Best-effort parse of analysis.time_horizon (e.g. "4-8小时", "1-2天"). */
|
|
49
|
+
export function parseTimeHorizonHours(raw, fallback = 6) {
|
|
50
|
+
if (!raw || !raw.trim()) {
|
|
51
|
+
return fallback;
|
|
52
|
+
}
|
|
53
|
+
const s = raw.trim();
|
|
54
|
+
const hRange = /([\d.]+)\s*[-~~]\s*([\d.]+)\s*小时/u.exec(s);
|
|
55
|
+
if (hRange) {
|
|
56
|
+
return (Number(hRange[1]) + Number(hRange[2])) / 2;
|
|
57
|
+
}
|
|
58
|
+
const hSingle = /([\d.]+)\s*小时/u.exec(s);
|
|
59
|
+
if (hSingle) {
|
|
60
|
+
return Number(hSingle[1]);
|
|
61
|
+
}
|
|
62
|
+
const dRange = /([\d.]+)\s*[-~~]\s*([\d.]+)\s*天/u.exec(s);
|
|
63
|
+
if (dRange) {
|
|
64
|
+
return ((Number(dRange[1]) + Number(dRange[2])) / 2) * 24;
|
|
65
|
+
}
|
|
66
|
+
const dSingle = /([\d.]+)\s*天/u.exec(s);
|
|
67
|
+
if (dSingle) {
|
|
68
|
+
return Number(dSingle[1]) * 24;
|
|
69
|
+
}
|
|
70
|
+
return fallback;
|
|
71
|
+
}
|
|
72
|
+
/** Standard normal CDF (Abramowitz & Stegun approximation). */
|
|
73
|
+
export function normalCdf(x) {
|
|
74
|
+
const ax = Math.abs(x);
|
|
75
|
+
const t = 1 / (1 + 0.2316419 * ax);
|
|
76
|
+
const d = 0.3989423 * Math.exp((-ax * ax) / 2);
|
|
77
|
+
const p = d *
|
|
78
|
+
t *
|
|
79
|
+
(0.3193815 +
|
|
80
|
+
t * (-0.3565638 + t * (1.781478 + t * (-1.821256 + t * 1.330274))));
|
|
81
|
+
return x >= 0 ? 1 - p : p;
|
|
82
|
+
}
|
|
83
|
+
/** P(min price within horizon reaches L) from above, drift≈0, diffusion σ_move. */
|
|
84
|
+
export function lowerBarrierTouchProb(spot, level, sigmaMove) {
|
|
85
|
+
if (!Number.isFinite(spot) || !Number.isFinite(level) || !Number.isFinite(sigmaMove)) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
if (sigmaMove <= 0) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
if (spot <= level) {
|
|
92
|
+
return 1;
|
|
93
|
+
}
|
|
94
|
+
const z = (spot - level) / sigmaMove;
|
|
95
|
+
return Math.min(1, Math.max(0, 2 * normalCdf(-z)));
|
|
96
|
+
}
|
|
97
|
+
/** P(max price within horizon reaches H) from below. */
|
|
98
|
+
export function upperBarrierTouchProb(spot, level, sigmaMove) {
|
|
99
|
+
if (!Number.isFinite(spot) || !Number.isFinite(level) || !Number.isFinite(sigmaMove)) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
if (sigmaMove <= 0) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
if (spot >= level) {
|
|
106
|
+
return 1;
|
|
107
|
+
}
|
|
108
|
+
const z = (level - spot) / sigmaMove;
|
|
109
|
+
return Math.min(1, Math.max(0, 2 * normalCdf(-z)));
|
|
110
|
+
}
|
|
111
|
+
export function resolveSlSweepLiquidityMultiplier(profile) {
|
|
112
|
+
const p = mergeUserProfileDefaults(profile);
|
|
113
|
+
return p.slSweepLiquidityMultiplier ?? 2;
|
|
114
|
+
}
|
|
115
|
+
export function resolveMaxSlTouchProb(profile) {
|
|
116
|
+
const p = mergeUserProfileDefaults(profile);
|
|
117
|
+
return p.maxSlTouchProb ?? 0.06;
|
|
118
|
+
}
|
|
119
|
+
export function resolveMaxSlSweepProb(profile) {
|
|
120
|
+
const p = mergeUserProfileDefaults(profile);
|
|
121
|
+
return p.maxSlSweepProb ?? 0.12;
|
|
122
|
+
}
|
|
123
|
+
export function resolveSlAntiSweepAtrFactor(profile) {
|
|
124
|
+
const p = mergeUserProfileDefaults(profile);
|
|
125
|
+
return p.slAntiSweepAtrFactor ?? 0.3;
|
|
126
|
+
}
|
|
127
|
+
export function sigmaMoveFromAtr(atr1h, horizonHours) {
|
|
128
|
+
return atr1h * Math.sqrt(Math.max(horizonHours, 0.25));
|
|
129
|
+
}
|
|
130
|
+
function levelTouchProb(side, spot, level, sigmaMove) {
|
|
131
|
+
if (side === "buy") {
|
|
132
|
+
return lowerBarrierTouchProb(spot, level, sigmaMove);
|
|
133
|
+
}
|
|
134
|
+
return upperBarrierTouchProb(spot, level, sigmaMove);
|
|
135
|
+
}
|
|
136
|
+
export function computeBracketTouchProbabilities(params) {
|
|
137
|
+
const liquidityMultiplier = resolveSlSweepLiquidityMultiplier(params.profile);
|
|
138
|
+
const horizonHours = parseTimeHorizonHours(params.analysis?.time_horizon, params.horizonHoursFallback ?? 6);
|
|
139
|
+
const candles = parseCandlesFromSnapshot(params.kline1h);
|
|
140
|
+
const atr1h = computeAtr(candles);
|
|
141
|
+
const sigmaMove = atr1h !== null ? sigmaMoveFromAtr(atr1h, horizonHours) : null;
|
|
142
|
+
if (params.spot === null || params.spot <= 0 || sigmaMove === null) {
|
|
143
|
+
return {
|
|
144
|
+
horizon_hours: horizonHours,
|
|
145
|
+
atr_1h: atr1h,
|
|
146
|
+
sigma_move: sigmaMove,
|
|
147
|
+
entry_touch_prob: null,
|
|
148
|
+
sl_touch_prob: null,
|
|
149
|
+
sl_sweep_prob: null,
|
|
150
|
+
liquidity_multiplier: liquidityMultiplier,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const entryTouch = levelTouchProb(params.action.side, params.spot, params.action.limit_px, sigmaMove);
|
|
154
|
+
const slTouch = levelTouchProb(params.action.side, params.spot, params.action.sl_px, sigmaMove);
|
|
155
|
+
const slSweep = slTouch !== null ? Math.min(1, slTouch * liquidityMultiplier) : null;
|
|
156
|
+
return {
|
|
157
|
+
horizon_hours: horizonHours,
|
|
158
|
+
atr_1h: atr1h,
|
|
159
|
+
sigma_move: sigmaMove,
|
|
160
|
+
entry_touch_prob: entryTouch,
|
|
161
|
+
sl_touch_prob: slTouch,
|
|
162
|
+
sl_sweep_prob: slSweep,
|
|
163
|
+
liquidity_multiplier: liquidityMultiplier,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export function formatTouchProbNote(probs) {
|
|
167
|
+
const pct = (v) => v === null ? "?" : `${(v * 100).toFixed(1)}%`;
|
|
168
|
+
return (`touch-prob (${probs.horizon_hours.toFixed(1)}h, ATR₁h ${probs.atr_1h?.toFixed(3) ?? "?"}): ` +
|
|
169
|
+
`entry ${pct(probs.entry_touch_prob)}, SL ${pct(probs.sl_touch_prob)}, ` +
|
|
170
|
+
`SL×${probs.liquidity_multiplier} sweep ${pct(probs.sl_sweep_prob)}`);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Move SL away from obvious structure (buy: lower SL, sell: raise SL) by factor×ATR₁h,
|
|
174
|
+
* then widen TP by the same reward:risk ratio so bracket geometry is preserved.
|
|
175
|
+
*/
|
|
176
|
+
export function applyAntiSweepSlOffset(action, atr1h, factor, szDecimals) {
|
|
177
|
+
if (!Number.isFinite(factor) || factor <= 0 || atr1h === null || atr1h <= 0) {
|
|
178
|
+
return { action, notes: [] };
|
|
179
|
+
}
|
|
180
|
+
const offset = atr1h * factor;
|
|
181
|
+
const roundPx = (px) => szDecimals !== undefined ? roundHyperliquidPerpPrice(px, szDecimals) : px;
|
|
182
|
+
const { side, limit_px: entry, tp_px: tp, sl_px: sl } = action;
|
|
183
|
+
const slDist = side === "buy" ? entry - sl : sl - entry;
|
|
184
|
+
const tpDist = side === "buy" ? tp - entry : entry - tp;
|
|
185
|
+
if (slDist <= 0 || tpDist <= 0) {
|
|
186
|
+
return { action, notes: [] };
|
|
187
|
+
}
|
|
188
|
+
const rewardRiskRatio = tpDist / slDist;
|
|
189
|
+
const newSl = side === "buy" ? roundPx(sl - offset) : roundPx(sl + offset);
|
|
190
|
+
const newSlDist = side === "buy" ? entry - newSl : newSl - entry;
|
|
191
|
+
if (newSlDist <= 0) {
|
|
192
|
+
return { action, notes: [] };
|
|
193
|
+
}
|
|
194
|
+
const newTpDist = rewardRiskRatio * newSlDist;
|
|
195
|
+
const newTp = roundPx(side === "buy" ? entry + newTpDist : entry - newTpDist);
|
|
196
|
+
if (side === "buy") {
|
|
197
|
+
if (!(newSl < entry && entry < newTp)) {
|
|
198
|
+
return { action, notes: [] };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else if (!(newTp < entry && entry < newSl)) {
|
|
202
|
+
return { action, notes: [] };
|
|
203
|
+
}
|
|
204
|
+
const notes = [
|
|
205
|
+
`anti-sweep SL ${sl}→${newSl} (${side === "buy" ? "-" : "+"}${factor}×ATR₁h ${atr1h.toFixed(3)})`,
|
|
206
|
+
];
|
|
207
|
+
if (newTp !== tp) {
|
|
208
|
+
notes.push(`anti-sweep TP ${tp}→${newTp} (preserve ${rewardRiskRatio.toFixed(2)}:1 R:R)`);
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
action: { ...action, sl_px: newSl, tp_px: newTp },
|
|
212
|
+
notes,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=touchProbability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"touchProbability.js","sourceRoot":"","sources":["../../src/advisor/touchProbability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { UserProfile } from "../core/state/schema.js";
|
|
2
|
+
import type { AdvisorBracketOpenAction } from "./actionSchema.js";
|
|
3
|
+
import { type BracketTouchProbabilities } from "./touchProbability.js";
|
|
4
|
+
export type BracketLegDistances = {
|
|
5
|
+
slDist: number;
|
|
6
|
+
tpDist: number;
|
|
7
|
+
rewardRiskRatio: number;
|
|
8
|
+
slPctFromEntry: number;
|
|
9
|
+
tpPctFromEntry: number;
|
|
10
|
+
};
|
|
11
|
+
/** Min TP distance / SL distance from entry (profile override, else by risk style). */
|
|
12
|
+
export declare function resolveMinRewardRiskRatio(profile: UserProfile | undefined): number;
|
|
13
|
+
/** Max SL distance from entry as fraction of entry px (profile override, else by risk style). */
|
|
14
|
+
export declare function resolveMaxSlPctFromEntry(profile: UserProfile | undefined): number;
|
|
15
|
+
export declare function computeBracketLegDistances(action: Pick<AdvisorBracketOpenAction, "side" | "limit_px" | "tp_px" | "sl_px">): BracketLegDistances;
|
|
16
|
+
/**
|
|
17
|
+
* Hard bracket geometry: asymmetric TP/SL from entry, max SL width, trend-aware entry when SL is wide.
|
|
18
|
+
*/
|
|
19
|
+
export declare function assertBracketTpslGeometry(action: AdvisorBracketOpenAction, profile: UserProfile | undefined, mid: number | null, atr1h?: number | null): void;
|
|
20
|
+
/** Reject bracket when SL touch / sweep probability is too high (anti stop-hunt). Skips when ATR unavailable. */
|
|
21
|
+
export declare function assertBracketTouchProbability(action: AdvisorBracketOpenAction, probs: BracketTouchProbabilities, profile: UserProfile | undefined): void;
|
|
22
|
+
//# sourceMappingURL=tpslPolicy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tpslPolicy.d.ts","sourceRoot":"","sources":["../../src/advisor/tpslPolicy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EACL,KAAK,yBAAyB,EAM/B,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,uFAAuF;AACvF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAalF;AAED,iGAAiG;AACjG,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAajF;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC,GAC9E,mBAAmB,CAarB;AAMD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,wBAAwB,EAChC,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB,IAAI,CA8EN;AAED,iHAAiH;AACjH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,wBAAwB,EAChC,KAAK,EAAE,yBAAyB,EAChC,OAAO,EAAE,WAAW,GAAG,SAAS,GAC/B,IAAI,CAeN"}
|