jcc_hyper_tool 0.1.4 → 0.1.6

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.
Files changed (179) hide show
  1. package/README.md +159 -21
  2. package/dist/advisor/actionRunner.d.ts +35 -0
  3. package/dist/advisor/actionRunner.d.ts.map +1 -0
  4. package/dist/advisor/actionRunner.js +194 -0
  5. package/dist/advisor/actionRunner.js.map +1 -0
  6. package/dist/advisor/actionSchema.d.ts +1551 -0
  7. package/dist/advisor/actionSchema.d.ts.map +1 -0
  8. package/dist/advisor/actionSchema.js +202 -0
  9. package/dist/advisor/actionSchema.js.map +1 -0
  10. package/dist/advisor/adviseDisplay.d.ts +26 -0
  11. package/dist/advisor/adviseDisplay.d.ts.map +1 -0
  12. package/dist/advisor/adviseDisplay.js +174 -0
  13. package/dist/advisor/adviseDisplay.js.map +1 -0
  14. package/dist/advisor/adviseEngine.d.ts +53 -0
  15. package/dist/advisor/adviseEngine.d.ts.map +1 -0
  16. package/dist/advisor/adviseEngine.js +172 -0
  17. package/dist/advisor/adviseEngine.js.map +1 -0
  18. package/dist/advisor/ambushPolicy.d.ts +47 -0
  19. package/dist/advisor/ambushPolicy.d.ts.map +1 -0
  20. package/dist/advisor/ambushPolicy.js +161 -0
  21. package/dist/advisor/ambushPolicy.js.map +1 -0
  22. package/dist/advisor/contextBuilder.d.ts +51 -0
  23. package/dist/advisor/contextBuilder.d.ts.map +1 -0
  24. package/dist/advisor/contextBuilder.js +153 -0
  25. package/dist/advisor/contextBuilder.js.map +1 -0
  26. package/dist/advisor/deepseekClient.d.ts +26 -0
  27. package/dist/advisor/deepseekClient.d.ts.map +1 -0
  28. package/dist/advisor/deepseekClient.js +96 -0
  29. package/dist/advisor/deepseekClient.js.map +1 -0
  30. package/dist/advisor/executionPolicy.d.ts +92 -0
  31. package/dist/advisor/executionPolicy.d.ts.map +1 -0
  32. package/dist/advisor/executionPolicy.js +273 -0
  33. package/dist/advisor/executionPolicy.js.map +1 -0
  34. package/dist/advisor/guards.d.ts +31 -0
  35. package/dist/advisor/guards.d.ts.map +1 -0
  36. package/dist/advisor/guards.js +198 -0
  37. package/dist/advisor/guards.js.map +1 -0
  38. package/dist/advisor/indicatorCompute.d.ts +45 -0
  39. package/dist/advisor/indicatorCompute.d.ts.map +1 -0
  40. package/dist/advisor/indicatorCompute.js +259 -0
  41. package/dist/advisor/indicatorCompute.js.map +1 -0
  42. package/dist/advisor/positionPlan.d.ts +33 -0
  43. package/dist/advisor/positionPlan.d.ts.map +1 -0
  44. package/dist/advisor/positionPlan.js +118 -0
  45. package/dist/advisor/positionPlan.js.map +1 -0
  46. package/dist/advisor/promptTemplate.d.ts +11 -0
  47. package/dist/advisor/promptTemplate.d.ts.map +1 -0
  48. package/dist/advisor/promptTemplate.js +230 -0
  49. package/dist/advisor/promptTemplate.js.map +1 -0
  50. package/dist/advisor/sessionLog.d.ts +41 -0
  51. package/dist/advisor/sessionLog.d.ts.map +1 -0
  52. package/dist/advisor/sessionLog.js +7 -0
  53. package/dist/advisor/sessionLog.js.map +1 -0
  54. package/dist/advisor/touchProbability.d.ts +54 -0
  55. package/dist/advisor/touchProbability.d.ts.map +1 -0
  56. package/dist/advisor/touchProbability.js +215 -0
  57. package/dist/advisor/touchProbability.js.map +1 -0
  58. package/dist/advisor/tpslPolicy.d.ts +22 -0
  59. package/dist/advisor/tpslPolicy.d.ts.map +1 -0
  60. package/dist/advisor/tpslPolicy.js +120 -0
  61. package/dist/advisor/tpslPolicy.js.map +1 -0
  62. package/dist/cli/advisorCli.d.ts +3 -0
  63. package/dist/cli/advisorCli.d.ts.map +1 -0
  64. package/dist/cli/advisorCli.js +706 -0
  65. package/dist/cli/advisorCli.js.map +1 -0
  66. package/dist/cli/index.js +6 -2
  67. package/dist/cli/index.js.map +1 -1
  68. package/dist/cli/riskCli.d.ts +3 -0
  69. package/dist/cli/riskCli.d.ts.map +1 -0
  70. package/dist/cli/riskCli.js +120 -0
  71. package/dist/cli/riskCli.js.map +1 -0
  72. package/dist/cli/strategyCli.d.ts.map +1 -1
  73. package/dist/cli/strategyCli.js +4 -2
  74. package/dist/cli/strategyCli.js.map +1 -1
  75. package/dist/cli/tradingCli.d.ts.map +1 -1
  76. package/dist/cli/tradingCli.js +34 -2
  77. package/dist/cli/tradingCli.js.map +1 -1
  78. package/dist/core/cliBin.d.ts +8 -0
  79. package/dist/core/cliBin.d.ts.map +1 -0
  80. package/dist/core/cliBin.js +15 -0
  81. package/dist/core/cliBin.js.map +1 -0
  82. package/dist/core/errorFormat.d.ts +7 -0
  83. package/dist/core/errorFormat.d.ts.map +1 -0
  84. package/dist/core/errorFormat.js +59 -0
  85. package/dist/core/errorFormat.js.map +1 -0
  86. package/dist/core/errors.d.ts +2 -1
  87. package/dist/core/errors.d.ts.map +1 -1
  88. package/dist/core/errors.js +3 -1
  89. package/dist/core/errors.js.map +1 -1
  90. package/dist/core/hyperliquid/asset.d.ts +2 -0
  91. package/dist/core/hyperliquid/asset.d.ts.map +1 -1
  92. package/dist/core/hyperliquid/asset.js +25 -0
  93. package/dist/core/hyperliquid/asset.js.map +1 -1
  94. package/dist/core/hyperliquid/client.d.ts +3 -0
  95. package/dist/core/hyperliquid/client.d.ts.map +1 -1
  96. package/dist/core/hyperliquid/client.js +31 -21
  97. package/dist/core/hyperliquid/client.js.map +1 -1
  98. package/dist/core/hyperliquid/exchange.d.ts +3 -0
  99. package/dist/core/hyperliquid/exchange.d.ts.map +1 -1
  100. package/dist/core/hyperliquid/exchange.js +31 -21
  101. package/dist/core/hyperliquid/exchange.js.map +1 -1
  102. package/dist/core/hyperliquid/exchangeParse.d.ts +3 -0
  103. package/dist/core/hyperliquid/exchangeParse.d.ts.map +1 -1
  104. package/dist/core/hyperliquid/exchangeParse.js +62 -0
  105. package/dist/core/hyperliquid/exchangeParse.js.map +1 -1
  106. package/dist/core/hyperliquid/httpRequest.d.ts +36 -0
  107. package/dist/core/hyperliquid/httpRequest.d.ts.map +1 -0
  108. package/dist/core/hyperliquid/httpRequest.js +171 -0
  109. package/dist/core/hyperliquid/httpRequest.js.map +1 -0
  110. package/dist/core/hyperliquid/orders.d.ts +5 -0
  111. package/dist/core/hyperliquid/orders.d.ts.map +1 -1
  112. package/dist/core/hyperliquid/orders.js +15 -5
  113. package/dist/core/hyperliquid/orders.js.map +1 -1
  114. package/dist/core/hyperliquid/rounding.d.ts +23 -0
  115. package/dist/core/hyperliquid/rounding.d.ts.map +1 -0
  116. package/dist/core/hyperliquid/rounding.js +53 -0
  117. package/dist/core/hyperliquid/rounding.js.map +1 -0
  118. package/dist/core/risk/isolatedTopUp.d.ts +112 -0
  119. package/dist/core/risk/isolatedTopUp.d.ts.map +1 -0
  120. package/dist/core/risk/isolatedTopUp.js +209 -0
  121. package/dist/core/risk/isolatedTopUp.js.map +1 -0
  122. package/dist/core/risk/isolatedTopUpHistory.d.ts +7 -0
  123. package/dist/core/risk/isolatedTopUpHistory.d.ts.map +1 -0
  124. package/dist/core/risk/isolatedTopUpHistory.js +26 -0
  125. package/dist/core/risk/isolatedTopUpHistory.js.map +1 -0
  126. package/dist/core/risk/isolatedTopUpParse.d.ts +16 -0
  127. package/dist/core/risk/isolatedTopUpParse.d.ts.map +1 -0
  128. package/dist/core/risk/isolatedTopUpParse.js +78 -0
  129. package/dist/core/risk/isolatedTopUpParse.js.map +1 -0
  130. package/dist/core/risk/runIsolatedTopUpReconcile.d.ts +28 -0
  131. package/dist/core/risk/runIsolatedTopUpReconcile.d.ts.map +1 -0
  132. package/dist/core/risk/runIsolatedTopUpReconcile.js +184 -0
  133. package/dist/core/risk/runIsolatedTopUpReconcile.js.map +1 -0
  134. package/dist/core/state/gcTradeState.js +1 -1
  135. package/dist/core/state/gcTradeState.js.map +1 -1
  136. package/dist/core/state/gridReconcile.d.ts +2 -0
  137. package/dist/core/state/gridReconcile.d.ts.map +1 -1
  138. package/dist/core/state/gridReconcile.js +42 -2
  139. package/dist/core/state/gridReconcile.js.map +1 -1
  140. package/dist/core/state/intentFactory.d.ts +1 -0
  141. package/dist/core/state/intentFactory.d.ts.map +1 -1
  142. package/dist/core/state/intentFactory.js +1 -0
  143. package/dist/core/state/intentFactory.js.map +1 -1
  144. package/dist/core/state/profileStore.d.ts +6 -0
  145. package/dist/core/state/profileStore.d.ts.map +1 -0
  146. package/dist/core/state/profileStore.js +26 -0
  147. package/dist/core/state/profileStore.js.map +1 -0
  148. package/dist/core/state/runReconcile.d.ts.map +1 -1
  149. package/dist/core/state/runReconcile.js +92 -30
  150. package/dist/core/state/runReconcile.js.map +1 -1
  151. package/dist/core/state/schema.d.ts +565 -124
  152. package/dist/core/state/schema.d.ts.map +1 -1
  153. package/dist/core/state/schema.js +62 -0
  154. package/dist/core/state/schema.js.map +1 -1
  155. package/dist/core/state/snapshot.d.ts +13 -0
  156. package/dist/core/state/snapshot.d.ts.map +1 -1
  157. package/dist/core/state/snapshot.js +36 -0
  158. package/dist/core/state/snapshot.js.map +1 -1
  159. package/dist/core/state/statePaths.d.ts +1 -0
  160. package/dist/core/state/statePaths.d.ts.map +1 -1
  161. package/dist/core/state/statePaths.js +4 -0
  162. package/dist/core/state/statePaths.js.map +1 -1
  163. package/dist/core/state/store.d.ts +21 -3
  164. package/dist/core/state/store.d.ts.map +1 -1
  165. package/dist/core/state/store.js +123 -14
  166. package/dist/core/state/store.js.map +1 -1
  167. package/dist/core/state/types.d.ts +13 -0
  168. package/dist/core/state/types.d.ts.map +1 -1
  169. package/dist/daemon/index.js +50 -5
  170. package/dist/daemon/index.js.map +1 -1
  171. package/dist/daemon/validateChild.d.ts +13 -0
  172. package/dist/daemon/validateChild.d.ts.map +1 -0
  173. package/dist/daemon/validateChild.js +77 -0
  174. package/dist/daemon/validateChild.js.map +1 -0
  175. package/dist/strategies/grid.d.ts +1 -0
  176. package/dist/strategies/grid.d.ts.map +1 -1
  177. package/dist/strategies/grid.js +1 -0
  178. package/dist/strategies/grid.js.map +1 -1
  179. package/package.json +3 -1
@@ -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"}
@@ -0,0 +1,120 @@
1
+ import { ConfigError } from "../core/errors.js";
2
+ import { mergeUserProfileDefaults } from "../core/state/profileStore.js";
3
+ import { resolveMaxSlSweepProb, resolveMaxSlTouchProb, resolveSlAntiSweepAtrFactor, } from "./touchProbability.js";
4
+ /** Min TP distance / SL distance from entry (profile override, else by risk style). */
5
+ export function resolveMinRewardRiskRatio(profile) {
6
+ const p = mergeUserProfileDefaults(profile);
7
+ if (p.minRewardRiskRatio !== undefined) {
8
+ return p.minRewardRiskRatio;
9
+ }
10
+ switch (p.risk) {
11
+ case "conservative":
12
+ return 2.5;
13
+ case "aggressive":
14
+ return 1.5;
15
+ default:
16
+ return 2;
17
+ }
18
+ }
19
+ /** Max SL distance from entry as fraction of entry px (profile override, else by risk style). */
20
+ export function resolveMaxSlPctFromEntry(profile) {
21
+ const p = mergeUserProfileDefaults(profile);
22
+ if (p.maxSlPctFromEntry !== undefined) {
23
+ return p.maxSlPctFromEntry;
24
+ }
25
+ switch (p.risk) {
26
+ case "conservative":
27
+ return 0.012;
28
+ case "aggressive":
29
+ return 0.03;
30
+ default:
31
+ return 0.02;
32
+ }
33
+ }
34
+ export function computeBracketLegDistances(action) {
35
+ const entry = action.limit_px;
36
+ const { tp_px: tp, sl_px: sl, side } = action;
37
+ const slDist = side === "buy" ? entry - sl : sl - entry;
38
+ const tpDist = side === "buy" ? tp - entry : entry - tp;
39
+ const rewardRiskRatio = slDist > 0 ? tpDist / slDist : Number.POSITIVE_INFINITY;
40
+ return {
41
+ slDist,
42
+ tpDist,
43
+ rewardRiskRatio,
44
+ slPctFromEntry: slDist / entry,
45
+ tpPctFromEntry: tpDist / entry,
46
+ };
47
+ }
48
+ function fmtPct(fraction) {
49
+ return `${(fraction * 100).toFixed(2)}%`;
50
+ }
51
+ /**
52
+ * Hard bracket geometry: asymmetric TP/SL from entry, max SL width, trend-aware entry when SL is wide.
53
+ */
54
+ export function assertBracketTpslGeometry(action, profile, mid, atr1h) {
55
+ const minRr = resolveMinRewardRiskRatio(profile);
56
+ let maxSlPct = resolveMaxSlPctFromEntry(profile);
57
+ const antiSweepFactor = resolveSlAntiSweepAtrFactor(profile);
58
+ if (atr1h !== undefined && atr1h !== null && atr1h > 0 && antiSweepFactor > 0) {
59
+ const entry = action.limit_px;
60
+ maxSlPct += (antiSweepFactor * atr1h) / entry;
61
+ }
62
+ const { side, limit_px: entry, tp_px: tp, sl_px: sl } = action;
63
+ const legs = computeBracketLegDistances(action);
64
+ if (side === "buy") {
65
+ if (!(sl < entry && entry < tp)) {
66
+ throw new ConfigError(`advise: ${action.action} blocked: buy bracket requires sl_px < limit_px < tp_px (got sl ${sl}, entry ${entry}, tp ${tp}).`);
67
+ }
68
+ }
69
+ else if (!(tp < entry && entry < sl)) {
70
+ throw new ConfigError(`advise: ${action.action} blocked: sell bracket requires tp_px < limit_px < sl_px (got tp ${tp}, entry ${entry}, sl ${sl}).`);
71
+ }
72
+ if (legs.slDist <= 0 || legs.tpDist <= 0) {
73
+ throw new ConfigError(`advise: ${action.action} blocked: TP and SL must be strictly beyond entry (entry ${entry}, tp ${tp}, sl ${sl}).`);
74
+ }
75
+ if (legs.slPctFromEntry > maxSlPct) {
76
+ const trendHint = side === "buy"
77
+ ? "move limit_px lower toward support (pullback entry) or tighten sl_px to structure"
78
+ : "move limit_px higher toward resistance (pullback entry) or tighten sl_px to structure";
79
+ throw new ConfigError(`advise: ${action.action} blocked: SL distance ${fmtPct(legs.slPctFromEntry)} exceeds max ${fmtPct(maxSlPct)} from entry ${entry}; ${trendHint}.`);
80
+ }
81
+ if (legs.rewardRiskRatio + 1e-9 < minRr) {
82
+ const symmetric = Math.abs(legs.tpDist - legs.slDist) / Math.max(legs.tpDist, legs.slDist) < 0.12;
83
+ const symmetricNote = symmetric
84
+ ? " TP/SL are nearly equidistant from entry — use tighter SL and wider TP anchored to analysis.price_targets."
85
+ : "";
86
+ throw new ConfigError(`advise: ${action.action} blocked: reward:risk ${legs.rewardRiskRatio.toFixed(2)}:1 below min ${minRr.toFixed(2)}:1 (entry ${entry}, tp ${tp}, sl ${sl}; SL ${fmtPct(legs.slPctFromEntry)}, TP ${fmtPct(legs.tpPctFromEntry)}).${symmetricNote}`);
87
+ }
88
+ if (mid !== null && mid > 0) {
89
+ if (action.action !== "place_limit_ambush") {
90
+ const entryNearMid = Math.abs(entry - mid) / mid <= 0.006;
91
+ const midToTp = Math.abs(tp - mid);
92
+ const midToSl = Math.abs(mid - sl);
93
+ const midSymmetric = entryNearMid &&
94
+ Math.abs(midToTp - midToSl) / Math.max(midToTp, midToSl) < 0.12 &&
95
+ legs.rewardRiskRatio + 1e-9 < minRr + 0.25;
96
+ if (midSymmetric) {
97
+ throw new ConfigError(`advise: ${action.action} blocked: TP/SL nearly equidistant from mid ${mid} while entry at market — anchor SL to nearer structure (smaller) and TP to trend target (larger).`);
98
+ }
99
+ }
100
+ const wideSl = legs.slPctFromEntry > maxSlPct * 0.65;
101
+ if (wideSl && side === "buy" && entry > mid) {
102
+ throw new ConfigError(`advise: ${action.action} blocked: buy limit_px ${entry} above mid ${mid} with wide SL ${fmtPct(legs.slPctFromEntry)} — enter on pullback below mid or tighten sl_px.`);
103
+ }
104
+ if (wideSl && side === "sell" && entry < mid) {
105
+ throw new ConfigError(`advise: ${action.action} blocked: sell limit_px ${entry} below mid ${mid} with wide SL ${fmtPct(legs.slPctFromEntry)} — enter on pullback above mid or tighten sl_px.`);
106
+ }
107
+ }
108
+ }
109
+ /** Reject bracket when SL touch / sweep probability is too high (anti stop-hunt). Skips when ATR unavailable. */
110
+ export function assertBracketTouchProbability(action, probs, profile) {
111
+ const maxTouch = resolveMaxSlTouchProb(profile);
112
+ const maxSweep = resolveMaxSlSweepProb(profile);
113
+ if (probs.sl_touch_prob !== null && probs.sl_touch_prob > maxTouch) {
114
+ throw new ConfigError(`advise: ${action.action} blocked (SL touch ${(probs.sl_touch_prob * 100).toFixed(1)}% > max ${(maxTouch * 100).toFixed(1)}% over ${probs.horizon_hours.toFixed(1)}h): SL ${action.sl_px} too close vs mid — tighten structure SL or wait (ATR₁h ${probs.atr_1h?.toFixed(3) ?? "?"}).`);
115
+ }
116
+ if (probs.sl_sweep_prob !== null && probs.sl_sweep_prob > maxSweep) {
117
+ throw new ConfigError(`advise: ${action.action} blocked (SL sweep ${(probs.sl_sweep_prob * 100).toFixed(1)}% > max ${(maxSweep * 100).toFixed(1)}%, ×${probs.liquidity_multiplier} hunt factor): SL ${action.sl_px} likely stop-magnet — move SL beyond obvious level or use limit at SL (ATR₁h ${probs.atr_1h?.toFixed(3) ?? "?"}).`);
118
+ }
119
+ }
120
+ //# sourceMappingURL=tpslPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tpslPolicy.js","sourceRoot":"","sources":["../../src/advisor/tpslPolicy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function attachAdvisorCli(program: Command): void;
3
+ //# sourceMappingURL=advisorCli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advisorCli.d.ts","sourceRoot":"","sources":["../../src/cli/advisorCli.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgZzC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAofvD"}