bfxsentry-agent 0.1.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.
Files changed (187) hide show
  1. package/config/default.yaml +137 -0
  2. package/config/phase1-safety.yaml +24 -0
  3. package/dist/bin/sentry.d.ts +3 -0
  4. package/dist/bin/sentry.d.ts.map +1 -0
  5. package/dist/bin/sentry.js +124 -0
  6. package/dist/bin/sentry.js.map +1 -0
  7. package/dist/src/backtest/fill-simulator.d.ts +5 -0
  8. package/dist/src/backtest/fill-simulator.d.ts.map +1 -0
  9. package/dist/src/backtest/fill-simulator.js +43 -0
  10. package/dist/src/backtest/fill-simulator.js.map +1 -0
  11. package/dist/src/backtest/report.d.ts +3 -0
  12. package/dist/src/backtest/report.d.ts.map +1 -0
  13. package/dist/src/backtest/report.js +43 -0
  14. package/dist/src/backtest/report.js.map +1 -0
  15. package/dist/src/backtest/runner.d.ts +34 -0
  16. package/dist/src/backtest/runner.d.ts.map +1 -0
  17. package/dist/src/backtest/runner.js +132 -0
  18. package/dist/src/backtest/runner.js.map +1 -0
  19. package/dist/src/collector/basis-monitor.d.ts +9 -0
  20. package/dist/src/collector/basis-monitor.d.ts.map +1 -0
  21. package/dist/src/collector/basis-monitor.js +52 -0
  22. package/dist/src/collector/basis-monitor.js.map +1 -0
  23. package/dist/src/collector/bitfinex-rest.d.ts +20 -0
  24. package/dist/src/collector/bitfinex-rest.d.ts.map +1 -0
  25. package/dist/src/collector/bitfinex-rest.js +350 -0
  26. package/dist/src/collector/bitfinex-rest.js.map +1 -0
  27. package/dist/src/collector/event-detector.d.ts +3 -0
  28. package/dist/src/collector/event-detector.d.ts.map +1 -0
  29. package/dist/src/collector/event-detector.js +41 -0
  30. package/dist/src/collector/event-detector.js.map +1 -0
  31. package/dist/src/collector/polymarket.d.ts +32 -0
  32. package/dist/src/collector/polymarket.d.ts.map +1 -0
  33. package/dist/src/collector/polymarket.js +89 -0
  34. package/dist/src/collector/polymarket.js.map +1 -0
  35. package/dist/src/collector/types.d.ts +114 -0
  36. package/dist/src/collector/types.d.ts.map +1 -0
  37. package/dist/src/collector/types.js +2 -0
  38. package/dist/src/collector/types.js.map +1 -0
  39. package/dist/src/core/config.d.ts +67 -0
  40. package/dist/src/core/config.d.ts.map +1 -0
  41. package/dist/src/core/config.js +27 -0
  42. package/dist/src/core/config.js.map +1 -0
  43. package/dist/src/core/decision-log.d.ts +7 -0
  44. package/dist/src/core/decision-log.d.ts.map +1 -0
  45. package/dist/src/core/decision-log.js +69 -0
  46. package/dist/src/core/decision-log.js.map +1 -0
  47. package/dist/src/core/engine.d.ts +19 -0
  48. package/dist/src/core/engine.d.ts.map +1 -0
  49. package/dist/src/core/engine.js +148 -0
  50. package/dist/src/core/engine.js.map +1 -0
  51. package/dist/src/core/event-bus.d.ts +12 -0
  52. package/dist/src/core/event-bus.d.ts.map +1 -0
  53. package/dist/src/core/event-bus.js +21 -0
  54. package/dist/src/core/event-bus.js.map +1 -0
  55. package/dist/src/core/logger.d.ts +4 -0
  56. package/dist/src/core/logger.d.ts.map +1 -0
  57. package/dist/src/core/logger.js +22 -0
  58. package/dist/src/core/logger.js.map +1 -0
  59. package/dist/src/core/recorder.d.ts +7 -0
  60. package/dist/src/core/recorder.d.ts.map +1 -0
  61. package/dist/src/core/recorder.js +42 -0
  62. package/dist/src/core/recorder.js.map +1 -0
  63. package/dist/src/executor/bitfinex-trader.d.ts +3 -0
  64. package/dist/src/executor/bitfinex-trader.d.ts.map +1 -0
  65. package/dist/src/executor/bitfinex-trader.js +119 -0
  66. package/dist/src/executor/bitfinex-trader.js.map +1 -0
  67. package/dist/src/executor/dry-run.d.ts +4 -0
  68. package/dist/src/executor/dry-run.d.ts.map +1 -0
  69. package/dist/src/executor/dry-run.js +39 -0
  70. package/dist/src/executor/dry-run.js.map +1 -0
  71. package/dist/src/executor/order-id.d.ts +5 -0
  72. package/dist/src/executor/order-id.d.ts.map +1 -0
  73. package/dist/src/executor/order-id.js +20 -0
  74. package/dist/src/executor/order-id.js.map +1 -0
  75. package/dist/src/executor/reconciler.d.ts +8 -0
  76. package/dist/src/executor/reconciler.d.ts.map +1 -0
  77. package/dist/src/executor/reconciler.js +44 -0
  78. package/dist/src/executor/reconciler.js.map +1 -0
  79. package/dist/src/executor/types.d.ts +19 -0
  80. package/dist/src/executor/types.d.ts.map +1 -0
  81. package/dist/src/executor/types.js +2 -0
  82. package/dist/src/executor/types.js.map +1 -0
  83. package/dist/src/risk/cooldown.d.ts +8 -0
  84. package/dist/src/risk/cooldown.d.ts.map +1 -0
  85. package/dist/src/risk/cooldown.js +30 -0
  86. package/dist/src/risk/cooldown.js.map +1 -0
  87. package/dist/src/risk/portfolio-filter.d.ts +9 -0
  88. package/dist/src/risk/portfolio-filter.d.ts.map +1 -0
  89. package/dist/src/risk/portfolio-filter.js +58 -0
  90. package/dist/src/risk/portfolio-filter.js.map +1 -0
  91. package/dist/src/risk/position-manager.d.ts +19 -0
  92. package/dist/src/risk/position-manager.d.ts.map +1 -0
  93. package/dist/src/risk/position-manager.js +171 -0
  94. package/dist/src/risk/position-manager.js.map +1 -0
  95. package/dist/src/risk/strategy-filter.d.ts +8 -0
  96. package/dist/src/risk/strategy-filter.d.ts.map +1 -0
  97. package/dist/src/risk/strategy-filter.js +40 -0
  98. package/dist/src/risk/strategy-filter.js.map +1 -0
  99. package/dist/src/risk/var-calculator.d.ts +10 -0
  100. package/dist/src/risk/var-calculator.d.ts.map +1 -0
  101. package/dist/src/risk/var-calculator.js +38 -0
  102. package/dist/src/risk/var-calculator.js.map +1 -0
  103. package/dist/src/signal/funding-radar.d.ts +4 -0
  104. package/dist/src/signal/funding-radar.d.ts.map +1 -0
  105. package/dist/src/signal/funding-radar.js +92 -0
  106. package/dist/src/signal/funding-radar.js.map +1 -0
  107. package/dist/src/signal/index.d.ts +12 -0
  108. package/dist/src/signal/index.d.ts.map +1 -0
  109. package/dist/src/signal/index.js +37 -0
  110. package/dist/src/signal/index.js.map +1 -0
  111. package/dist/src/signal/liquidation.d.ts +4 -0
  112. package/dist/src/signal/liquidation.d.ts.map +1 -0
  113. package/dist/src/signal/liquidation.js +83 -0
  114. package/dist/src/signal/liquidation.js.map +1 -0
  115. package/dist/src/signal/orderbook.d.ts +4 -0
  116. package/dist/src/signal/orderbook.d.ts.map +1 -0
  117. package/dist/src/signal/orderbook.js +100 -0
  118. package/dist/src/signal/orderbook.js.map +1 -0
  119. package/dist/src/signal/smart-money.d.ts +4 -0
  120. package/dist/src/signal/smart-money.d.ts.map +1 -0
  121. package/dist/src/signal/smart-money.js +39 -0
  122. package/dist/src/signal/smart-money.js.map +1 -0
  123. package/dist/src/signal/types.d.ts +13 -0
  124. package/dist/src/signal/types.d.ts.map +1 -0
  125. package/dist/src/signal/types.js +2 -0
  126. package/dist/src/signal/types.js.map +1 -0
  127. package/dist/src/skill/backtest.d.ts +5 -0
  128. package/dist/src/skill/backtest.d.ts.map +1 -0
  129. package/dist/src/skill/backtest.js +14 -0
  130. package/dist/src/skill/backtest.js.map +1 -0
  131. package/dist/src/skill/config.d.ts +4 -0
  132. package/dist/src/skill/config.d.ts.map +1 -0
  133. package/dist/src/skill/config.js +35 -0
  134. package/dist/src/skill/config.js.map +1 -0
  135. package/dist/src/skill/logs.d.ts +5 -0
  136. package/dist/src/skill/logs.d.ts.map +1 -0
  137. package/dist/src/skill/logs.js +37 -0
  138. package/dist/src/skill/logs.js.map +1 -0
  139. package/dist/src/skill/scan.d.ts +5 -0
  140. package/dist/src/skill/scan.d.ts.map +1 -0
  141. package/dist/src/skill/scan.js +75 -0
  142. package/dist/src/skill/scan.js.map +1 -0
  143. package/dist/src/skill/signal.d.ts +4 -0
  144. package/dist/src/skill/signal.d.ts.map +1 -0
  145. package/dist/src/skill/signal.js +63 -0
  146. package/dist/src/skill/signal.js.map +1 -0
  147. package/dist/src/skill/status.d.ts +2 -0
  148. package/dist/src/skill/status.d.ts.map +1 -0
  149. package/dist/src/skill/status.js +58 -0
  150. package/dist/src/skill/status.js.map +1 -0
  151. package/dist/src/skill/strategy.d.ts +4 -0
  152. package/dist/src/skill/strategy.d.ts.map +1 -0
  153. package/dist/src/skill/strategy.js +44 -0
  154. package/dist/src/skill/strategy.js.map +1 -0
  155. package/dist/src/skill/trade.d.ts +6 -0
  156. package/dist/src/skill/trade.d.ts.map +1 -0
  157. package/dist/src/skill/trade.js +58 -0
  158. package/dist/src/skill/trade.js.map +1 -0
  159. package/dist/src/strategy/funding-arb.d.ts +6 -0
  160. package/dist/src/strategy/funding-arb.d.ts.map +1 -0
  161. package/dist/src/strategy/funding-arb.js +57 -0
  162. package/dist/src/strategy/funding-arb.js.map +1 -0
  163. package/dist/src/strategy/index.d.ts +7 -0
  164. package/dist/src/strategy/index.d.ts.map +1 -0
  165. package/dist/src/strategy/index.js +27 -0
  166. package/dist/src/strategy/index.js.map +1 -0
  167. package/dist/src/strategy/liq-hunter.d.ts +6 -0
  168. package/dist/src/strategy/liq-hunter.d.ts.map +1 -0
  169. package/dist/src/strategy/liq-hunter.js +61 -0
  170. package/dist/src/strategy/liq-hunter.js.map +1 -0
  171. package/dist/src/strategy/ob-sniper.d.ts +6 -0
  172. package/dist/src/strategy/ob-sniper.d.ts.map +1 -0
  173. package/dist/src/strategy/ob-sniper.js +47 -0
  174. package/dist/src/strategy/ob-sniper.js.map +1 -0
  175. package/dist/src/strategy/pm-hedge.d.ts +6 -0
  176. package/dist/src/strategy/pm-hedge.d.ts.map +1 -0
  177. package/dist/src/strategy/pm-hedge.js +55 -0
  178. package/dist/src/strategy/pm-hedge.js.map +1 -0
  179. package/dist/src/strategy/smart-follow.d.ts +6 -0
  180. package/dist/src/strategy/smart-follow.d.ts.map +1 -0
  181. package/dist/src/strategy/smart-follow.js +44 -0
  182. package/dist/src/strategy/smart-follow.js.map +1 -0
  183. package/dist/src/strategy/types.d.ts +58 -0
  184. package/dist/src/strategy/types.d.ts.map +1 -0
  185. package/dist/src/strategy/types.js +2 -0
  186. package/dist/src/strategy/types.js.map +1 -0
  187. package/package.json +54 -0
@@ -0,0 +1,100 @@
1
+ export function generateOrderbookSignals(snapshot) {
2
+ const { orderbook, tradeFlow, ticker } = snapshot;
3
+ const now = snapshot.timestamp;
4
+ const signals = [];
5
+ const { bidDepth05, askDepth05, walls } = orderbook;
6
+ const imbalance05 = askDepth05 > 0 ? bidDepth05 / askDepth05 : 1;
7
+ // O1: 买盘失衡
8
+ if (imbalance05 >= 1.5 && tradeFlow.netFlow60s > 0) {
9
+ signals.push({
10
+ id: 'OB-1',
11
+ module: 'orderbook',
12
+ direction: 'long',
13
+ confidence: Math.min(80, 50 + (imbalance05 - 1.5) * 30),
14
+ level: 'yellow',
15
+ title: '买盘失衡',
16
+ summary: `Bid/Ask ${imbalance05.toFixed(2)}x (0.5%), 60s 净买入 ${tradeFlow.netFlow60s.toFixed(3)} BTC`,
17
+ details: {
18
+ imbalance: imbalance05,
19
+ bidDepth: bidDepth05,
20
+ askDepth: askDepth05,
21
+ netFlow: tradeFlow.netFlow60s,
22
+ buyRatio: tradeFlow.buyRatio60s,
23
+ },
24
+ ttlSec: 120,
25
+ timestamp: now,
26
+ });
27
+ }
28
+ // O2: 卖盘失衡
29
+ if (imbalance05 <= 0.67 && tradeFlow.netFlow60s < 0) {
30
+ signals.push({
31
+ id: 'OB-2',
32
+ module: 'orderbook',
33
+ direction: 'short',
34
+ confidence: Math.min(80, 50 + (1 / imbalance05 - 1.5) * 30),
35
+ level: 'yellow',
36
+ title: '卖盘失衡',
37
+ summary: `Bid/Ask ${imbalance05.toFixed(2)}x (0.5%), 60s 净卖出 ${Math.abs(tradeFlow.netFlow60s).toFixed(3)} BTC`,
38
+ details: {
39
+ imbalance: imbalance05,
40
+ bidDepth: bidDepth05,
41
+ askDepth: askDepth05,
42
+ netFlow: tradeFlow.netFlow60s,
43
+ buyRatio: tradeFlow.buyRatio60s,
44
+ },
45
+ ttlSec: 120,
46
+ timestamp: now,
47
+ });
48
+ }
49
+ // O3: Wall breaks (detected via event-detector, but also check current state)
50
+ const askWalls = walls.filter(w => w.side === 'ask');
51
+ const bidWalls = walls.filter(w => w.side === 'bid');
52
+ for (const w of askWalls) {
53
+ if (ticker.lastPrice >= w.price * 0.999) {
54
+ signals.push({
55
+ id: `OB-3a-${w.price.toFixed(0)}`,
56
+ module: 'orderbook',
57
+ direction: 'long',
58
+ confidence: 60,
59
+ level: 'yellow',
60
+ title: '上方墙突破',
61
+ summary: `价格逼近卖墙 $${w.price.toFixed(0)} (${w.multiplier.toFixed(1)}x 均量)`,
62
+ details: { wall: w, price: ticker.lastPrice },
63
+ ttlSec: 60,
64
+ timestamp: now,
65
+ });
66
+ }
67
+ }
68
+ for (const w of bidWalls) {
69
+ if (ticker.lastPrice <= w.price * 1.001) {
70
+ signals.push({
71
+ id: `OB-3b-${w.price.toFixed(0)}`,
72
+ module: 'orderbook',
73
+ direction: 'short',
74
+ confidence: 60,
75
+ level: 'yellow',
76
+ title: '下方墙击穿',
77
+ summary: `价格逼近买墙 $${w.price.toFixed(0)} (${w.multiplier.toFixed(1)}x 均量)`,
78
+ details: { wall: w, price: ticker.lastPrice },
79
+ ttlSec: 60,
80
+ timestamp: now,
81
+ });
82
+ }
83
+ }
84
+ // No signals = green
85
+ if (signals.length === 0) {
86
+ signals.push({
87
+ id: 'OB-0',
88
+ module: 'orderbook',
89
+ direction: 'neutral',
90
+ confidence: 20,
91
+ level: 'green',
92
+ title: '盘口正常',
93
+ summary: `Bid/Ask ${imbalance05.toFixed(2)}x, 墙 ${walls.length} 个`,
94
+ details: { imbalance: imbalance05, wallCount: walls.length },
95
+ timestamp: now,
96
+ });
97
+ }
98
+ return signals;
99
+ }
100
+ //# sourceMappingURL=orderbook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orderbook.js","sourceRoot":"","sources":["../../../src/signal/orderbook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { MarketSnapshot } from '../collector/types.js';
2
+ import type { Signal } from './types.js';
3
+ export declare function generateSmartMoneySignals(snapshot: MarketSnapshot): Signal[];
4
+ //# sourceMappingURL=smart-money.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-money.d.ts","sourceRoot":"","sources":["../../../src/signal/smart-money.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,EAAE,CAyC5E"}
@@ -0,0 +1,39 @@
1
+ export function generateSmartMoneySignals(snapshot) {
2
+ const { whales, whaleScore, whaleDirection, deriv } = snapshot;
3
+ const now = snapshot.timestamp;
4
+ if (whales.length === 0)
5
+ return [];
6
+ const longWhales = whales.filter(w => w.direction === 'long');
7
+ const shortWhales = whales.filter(w => w.direction === 'short');
8
+ const totalAligned = Math.max(longWhales.length, shortWhales.length);
9
+ const majorityDir = longWhales.length >= shortWhales.length ? 'long' : 'short';
10
+ // Funding dimension
11
+ const fr = deriv?.fundingRate ?? 0;
12
+ const annualized = Math.abs(fr * 3 * 365 * 100);
13
+ let fundingWarning = '';
14
+ if (annualized > 100)
15
+ fundingWarning = '资金费率过热';
16
+ const direction = whaleScore >= 60 ? 'long' : whaleScore <= 40 ? 'short' : 'neutral';
17
+ const signals = [{
18
+ id: 'SM-1',
19
+ module: 'smart-money',
20
+ direction: direction,
21
+ confidence: Math.min(95, whaleScore),
22
+ level: whaleScore >= 70 || whaleScore <= 30 ? 'red' : whaleScore >= 60 || whaleScore <= 40 ? 'yellow' : 'green',
23
+ title: `聪明钱 ${whaleDirection}`,
24
+ summary: `综合评分 ${whaleScore.toFixed(0)}/100, ${totalAligned} 鲸鱼${majorityDir === 'long' ? '做多' : '做空'}主导${fundingWarning ? `, ${fundingWarning}` : ''}`,
25
+ details: {
26
+ score: whaleScore,
27
+ longWhales: longWhales.length,
28
+ shortWhales: shortWhales.length,
29
+ hedgeWhales: whales.length - longWhales.length - shortWhales.length,
30
+ topPnl: whales.slice(0, 5).map(w => ({
31
+ username: w.username, pnl: w.pnl, direction: w.direction,
32
+ })),
33
+ fundingAnnualized: annualized,
34
+ },
35
+ timestamp: now,
36
+ }];
37
+ return signals;
38
+ }
39
+ //# sourceMappingURL=smart-money.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-money.js","sourceRoot":"","sources":["../../../src/signal/smart-money.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,yBAAyB,CAAC,QAAwB;IAChE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAA;IAC9D,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAA;IAE9B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAElC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAA;IAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,CAAA;IAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACpE,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;IAE9E,oBAAoB;IACpB,MAAM,EAAE,GAAG,KAAK,EAAE,WAAW,IAAI,CAAC,CAAA;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAA;IAC/C,IAAI,cAAc,GAAG,EAAE,CAAA;IACvB,IAAI,UAAU,GAAG,GAAG;QAAE,cAAc,GAAG,QAAQ,CAAA;IAE/C,MAAM,SAAS,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IAEpF,MAAM,OAAO,GAAa,CAAC;YACzB,EAAE,EAAE,MAAM;YACV,MAAM,EAAE,aAAa;YACrB,SAAS,EAAE,SAAgC;YAC3C,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC;YACpC,KAAK,EAAE,UAAU,IAAI,EAAE,IAAI,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,IAAI,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;YAC/G,KAAK,EAAE,OAAO,cAAc,EAAE;YAC9B,OAAO,EAAE,QAAQ,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,YAAY,MAAM,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,KAAK,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YACvJ,OAAO,EAAE;gBACP,KAAK,EAAE,UAAU;gBACjB,UAAU,EAAE,UAAU,CAAC,MAAM;gBAC7B,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM;gBACnE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACnC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS;iBACzD,CAAC,CAAC;gBACH,iBAAiB,EAAE,UAAU;aAC9B;YACD,SAAS,EAAE,GAAG;SACf,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface Signal {
2
+ id: string;
3
+ module: 'smart-money' | 'funding' | 'liquidation' | 'orderbook' | 'polymarket';
4
+ direction: 'long' | 'short' | 'neutral';
5
+ confidence: number;
6
+ level: 'green' | 'yellow' | 'red';
7
+ title: string;
8
+ summary: string;
9
+ details: Record<string, unknown>;
10
+ ttlSec?: number;
11
+ timestamp: number;
12
+ }
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/signal/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,YAAY,CAAA;IAC9E,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAA;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/signal/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export declare function backtestCommand(strategy: string | undefined, options: {
2
+ days?: string;
3
+ config?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=backtest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backtest.d.ts","sourceRoot":"","sources":["../../../src/skill/backtest.ts"],"names":[],"mappings":"AAMA,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,iBAU5C"}
@@ -0,0 +1,14 @@
1
+ import chalk from 'chalk';
2
+ import { loadConfig } from '../core/config.js';
3
+ import { initLogger } from '../core/logger.js';
4
+ import { runBacktest } from '../backtest/runner.js';
5
+ import { printBacktestReport } from '../backtest/report.js';
6
+ export async function backtestCommand(strategy, options) {
7
+ initLogger('warn');
8
+ const cfg = loadConfig(options.config);
9
+ const days = parseInt(options.days || '7');
10
+ console.log(chalk.dim(`\n 回测中... 策略: ${strategy || 'all'}, 天数: ${days}\n`));
11
+ const result = await runBacktest(cfg, strategy, days);
12
+ printBacktestReport(result);
13
+ }
14
+ //# sourceMappingURL=backtest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backtest.js","sourceRoot":"","sources":["../../../src/skill/backtest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAA4B,EAC5B,OAA2C;IAE3C,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,CAAA;IAE1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,QAAQ,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAA;IAE5E,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IACrD,mBAAmB,CAAC,MAAM,CAAC,CAAA;AAC7B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function configCommand(action: string, args?: string[], options?: {
2
+ config?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/skill/config.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,iBAsBjG"}
@@ -0,0 +1,35 @@
1
+ import chalk from 'chalk';
2
+ import { loadConfig } from '../core/config.js';
3
+ export async function configCommand(action, args, options) {
4
+ const cfg = loadConfig(options?.config);
5
+ if (action === 'show') {
6
+ console.log('');
7
+ console.log(chalk.bold.cyan(' BfxSentry · 当前配置'));
8
+ console.log('');
9
+ printObj(cfg, 2);
10
+ console.log('');
11
+ return;
12
+ }
13
+ if (action === 'set' && args && args.length >= 2) {
14
+ const path = args[0];
15
+ const value = args[1];
16
+ console.log(chalk.yellow(`\n 运行时配置修改: ${path} = ${value}`));
17
+ console.log(chalk.dim(' 注: 运行时修改不会持久化,重启后恢复默认\n'));
18
+ // In a full implementation, this would modify the in-memory config
19
+ return;
20
+ }
21
+ console.log(chalk.dim('\n 用法: sentry config show | sentry config set <path> <value>\n'));
22
+ }
23
+ function printObj(obj, indent) {
24
+ for (const [key, value] of Object.entries(obj)) {
25
+ const pad = ' '.repeat(indent);
26
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
27
+ console.log(`${pad}${chalk.bold(key)}:`);
28
+ printObj(value, indent + 2);
29
+ }
30
+ else {
31
+ console.log(`${pad}${chalk.dim(key)}: ${chalk.white(String(value))}`);
32
+ }
33
+ }
34
+ }
35
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/skill/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,IAAe,EAAE,OAA6B;IAChG,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAEvC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAA;QAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,QAAQ,CAAC,GAAyC,EAAE,CAAC,CAAC,CAAA;QACtD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAM;IACR,CAAC;IAED,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,IAAI,MAAM,KAAK,EAAE,CAAC,CAAC,CAAA;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAA;QACnD,mEAAmE;QACnE,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC,CAAA;AAC3F,CAAC;AAED,SAAS,QAAQ,CAAC,GAA4B,EAAE,MAAc;IAC5D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC9B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACxC,QAAQ,CAAC,KAAgC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAA;QACxD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function logsCommand(options: {
2
+ level?: string;
3
+ limit?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../src/skill/logs.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,iBAoC5E"}
@@ -0,0 +1,37 @@
1
+ import chalk from 'chalk';
2
+ import { getRecentDecisions } from '../core/decision-log.js';
3
+ export async function logsCommand(options) {
4
+ const limit = parseInt(options.limit || '20');
5
+ const decisions = getRecentDecisions(limit);
6
+ console.log('');
7
+ console.log(chalk.bold.cyan(' BfxSentry · 交易日志'));
8
+ console.log('');
9
+ if (decisions.length === 0) {
10
+ console.log(chalk.dim(' 暂无交易记录。运行 sentry start 后将自动记录。'));
11
+ console.log('');
12
+ return;
13
+ }
14
+ for (const d of decisions) {
15
+ const time = new Date(d.timestamp).toLocaleString();
16
+ const hasIntent = d.intent !== null;
17
+ const passed = d.riskFilterResult.passed;
18
+ let icon;
19
+ if (!hasIntent)
20
+ icon = chalk.dim('·');
21
+ else if (passed)
22
+ icon = chalk.green('V');
23
+ else
24
+ icon = chalk.red('X');
25
+ const dir = d.intent?.direction || '-';
26
+ const conf = d.intent ? `${d.intent.confidence.toFixed(0)}%` : '-';
27
+ const reason = !passed ? chalk.dim(d.riskFilterResult.reason || '') : '';
28
+ const pnl = d.pnlAtExit !== undefined
29
+ ? (d.pnlAtExit >= 0 ? chalk.green(`+$${d.pnlAtExit.toFixed(2)}`) : chalk.red(`$${d.pnlAtExit.toFixed(2)}`))
30
+ : '';
31
+ if (options.level === 'warn' && passed)
32
+ continue;
33
+ console.log(` ${icon} ${time} ${d.strategy.padEnd(14)} ${dir.padEnd(6)} ${conf.padEnd(5)} ${pnl} ${reason}`);
34
+ }
35
+ console.log('');
36
+ }
37
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/skill/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2C;IAC3E,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;IAC7C,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAE3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAA;IAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAEf,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAA;QAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAM;IACR,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAA;QACnD,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,CAAA;QACnC,MAAM,MAAM,GAAG,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAA;QAExC,IAAI,IAAY,CAAA;QAChB,IAAI,CAAC,SAAS;YAAE,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;aAChC,IAAI,MAAM;YAAE,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;;YACnC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAE1B,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,IAAI,GAAG,CAAA;QACtC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;QAClE,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACxE,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,KAAK,SAAS;YACnC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3G,CAAC,CAAC,EAAE,CAAA;QAEN,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,IAAI,MAAM;YAAE,SAAQ;QAEhD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC,CAAA;IAChH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACjB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function scanCommand(options: {
2
+ json?: boolean;
3
+ config?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/skill/scan.ts"],"names":[],"mappings":"AAiBA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,iBA8D7E"}
@@ -0,0 +1,75 @@
1
+ import chalk from 'chalk';
2
+ import { loadConfig } from '../core/config.js';
3
+ import { runOnce } from '../core/engine.js';
4
+ const LEVEL_ICON = {
5
+ red: '🔴',
6
+ yellow: '🟡',
7
+ green: '🟢',
8
+ };
9
+ const DIR_LABEL = {
10
+ long: '↑ 多',
11
+ short: '↓ 空',
12
+ neutral: '— 中性',
13
+ };
14
+ export async function scanCommand(options) {
15
+ const cfg = loadConfig(options.config);
16
+ let result;
17
+ try {
18
+ result = await runOnce(cfg);
19
+ }
20
+ catch (err) {
21
+ console.error(chalk.red(`\n 数据采集失败: ${err.message}`));
22
+ console.error(chalk.dim(' 请检查网络连接或代理设置 (Bitfinex API 可能需要代理)\n'));
23
+ process.exit(1);
24
+ }
25
+ const { snapshot, signals } = result;
26
+ if (options.json) {
27
+ console.log(JSON.stringify({ snapshot: { timestamp: snapshot.timestamp, price: snapshot.ticker.lastPrice }, signals }, null, 2));
28
+ return;
29
+ }
30
+ const price = snapshot.ticker.lastPrice;
31
+ const vol = snapshot.ticker.volume;
32
+ console.log('');
33
+ console.log(chalk.bold.cyan('═══════════════════════════════════════════════════'));
34
+ console.log(chalk.bold.cyan(' BfxSentry · 全市场扫描'));
35
+ console.log(chalk.bold.cyan('═══════════════════════════════════════════════════'));
36
+ console.log('');
37
+ console.log(` ${chalk.dim('BTC/USD')} ${chalk.bold.white('$' + price.toLocaleString())} ${chalk.dim('Vol')} ${vol.toFixed(1)} BTC ${chalk.dim(new Date().toLocaleTimeString())}`);
38
+ console.log('');
39
+ // Group by module
40
+ const modules = ['smart-money', 'funding', 'liquidation', 'orderbook'];
41
+ const moduleNames = {
42
+ 'smart-money': '聪明钱雷达',
43
+ 'funding': '融资雷达',
44
+ 'liquidation': '爆仓猎人',
45
+ 'orderbook': '盘口狙击',
46
+ };
47
+ for (const mod of modules) {
48
+ const modSignals = signals.filter(s => s.module === mod);
49
+ if (modSignals.length === 0)
50
+ continue;
51
+ console.log(chalk.bold(` ── ${moduleNames[mod]} ──`));
52
+ for (const s of modSignals) {
53
+ printSignal(s);
54
+ }
55
+ console.log('');
56
+ }
57
+ // Summary
58
+ const longSigs = signals.filter(s => s.direction === 'long');
59
+ const shortSigs = signals.filter(s => s.direction === 'short');
60
+ const strongSigs = signals.filter(s => s.confidence >= 60);
61
+ console.log(chalk.dim(' ─────────────────────────────────────────────────'));
62
+ console.log(` ${chalk.bold('综合判断')} 多 ${chalk.green(String(longSigs.length))} · 空 ${chalk.red(String(shortSigs.length))} · 强信号 ${chalk.yellow(String(strongSigs.length))}`);
63
+ if (strongSigs.length > 0) {
64
+ const top = strongSigs.sort((a, b) => b.confidence - a.confidence)[0];
65
+ console.log(` ${chalk.bold('最强信号')} ${LEVEL_ICON[top.level]} ${top.title} (${top.confidence.toFixed(0)}%)`);
66
+ }
67
+ console.log('');
68
+ }
69
+ function printSignal(s) {
70
+ const icon = LEVEL_ICON[s.level] || '⚪';
71
+ const dir = DIR_LABEL[s.direction] || s.direction;
72
+ const conf = s.confidence.toFixed(0).padStart(3);
73
+ console.log(` ${icon} ${chalk.bold(s.title.padEnd(14))} ${dir.padEnd(6)} ${chalk.dim('置信')} ${conf}% ${chalk.dim(s.summary)}`);
74
+ }
75
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/skill/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function signalCommand(module?: string, options?: {
2
+ config?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=signal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../../src/skill/signal.ts"],"names":[],"mappings":"AAaA,wBAAsB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,iBAyDjF"}
@@ -0,0 +1,63 @@
1
+ import chalk from 'chalk';
2
+ import { loadConfig } from '../core/config.js';
3
+ import { runOnce, getEngineState } from '../core/engine.js';
4
+ const MODULE_NAMES = {
5
+ 'smart-money': '聪明钱雷达',
6
+ 'funding': '融资雷达',
7
+ 'liquidation': '爆仓猎人',
8
+ 'orderbook': '盘口狙击',
9
+ 'polymarket': 'PM 雷达',
10
+ };
11
+ export async function signalCommand(module, options) {
12
+ const cfg = loadConfig(options?.config);
13
+ // Use cached state if available, otherwise fetch
14
+ let signals;
15
+ const state = getEngineState();
16
+ if (state.lastSignals.length > 0) {
17
+ signals = state.lastSignals;
18
+ }
19
+ else {
20
+ const result = await runOnce(cfg);
21
+ signals = result.signals;
22
+ }
23
+ if (module) {
24
+ signals = signals.filter(s => s.module === module);
25
+ if (signals.length === 0) {
26
+ console.log(chalk.yellow(` 没有找到模块 "${module}" 的信号`));
27
+ return;
28
+ }
29
+ }
30
+ console.log('');
31
+ console.log(chalk.bold.cyan(' BfxSentry · 信号详情'));
32
+ console.log(chalk.dim(` ${new Date().toLocaleString()}`));
33
+ console.log('');
34
+ const grouped = new Map();
35
+ for (const s of signals) {
36
+ const arr = grouped.get(s.module) || [];
37
+ arr.push(s);
38
+ grouped.set(s.module, arr);
39
+ }
40
+ for (const [mod, sigs] of grouped) {
41
+ console.log(chalk.bold(` ── ${MODULE_NAMES[mod] || mod} ──`));
42
+ console.log('');
43
+ for (const s of sigs) {
44
+ const levelColor = s.level === 'red' ? chalk.red : s.level === 'yellow' ? chalk.yellow : chalk.green;
45
+ const dirIcon = s.direction === 'long' ? '↑' : s.direction === 'short' ? '↓' : '—';
46
+ console.log(` ${levelColor('●')} ${chalk.bold(s.title)} [${s.id}]`);
47
+ console.log(` 方向: ${dirIcon} ${s.direction} | 置信度: ${s.confidence.toFixed(0)}% | 级别: ${s.level}`);
48
+ console.log(` ${chalk.dim(s.summary)}`);
49
+ // Print details
50
+ const entries = Object.entries(s.details);
51
+ if (entries.length > 0) {
52
+ const detailStr = entries
53
+ .filter(([, v]) => typeof v !== 'object')
54
+ .map(([k, v]) => `${k}: ${typeof v === 'number' ? v.toFixed(4) : v}`)
55
+ .join(' | ');
56
+ if (detailStr)
57
+ console.log(` ${chalk.dim(detailStr)}`);
58
+ }
59
+ console.log('');
60
+ }
61
+ }
62
+ }
63
+ //# sourceMappingURL=signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.js","sourceRoot":"","sources":["../../../src/skill/signal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function positionCommand(action?: string, id?: string): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/skill/status.ts"],"names":[],"mappings":"AAQA,wBAAsB,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,iBAgEjE"}
@@ -0,0 +1,58 @@
1
+ import chalk from 'chalk';
2
+ import { getPositions, getDailyPnl, getDailyTrades, getConsecutiveLosses, getTotalPositionUsd, closePosition, closeAllPositions, } from '../risk/position-manager.js';
3
+ import { getVarStats } from '../risk/var-calculator.js';
4
+ export async function positionCommand(action, id) {
5
+ if (action === 'close' && id) {
6
+ if (id === 'all' || id === '-all') {
7
+ // Need current price — use last known
8
+ const positions = getPositions();
9
+ if (positions.length === 0) {
10
+ console.log(chalk.yellow('\n 没有持仓\n'));
11
+ return;
12
+ }
13
+ const price = positions[0].currentPrice;
14
+ const pnl = closeAllPositions(price);
15
+ console.log(chalk.yellow(`\n 全部平仓完成, PnL: $${pnl.toFixed(2)}\n`));
16
+ return;
17
+ }
18
+ const positions = getPositions();
19
+ const pos = positions.find(p => p.id === id || p.id.startsWith(id));
20
+ if (!pos) {
21
+ console.log(chalk.red(`\n 找不到持仓 ${id}\n`));
22
+ return;
23
+ }
24
+ const pnl = closePosition(pos.id, pos.currentPrice, '手动平仓');
25
+ console.log(chalk.yellow(`\n 平仓 ${pos.id}, PnL: $${pnl.toFixed(2)}\n`));
26
+ return;
27
+ }
28
+ const positions = getPositions();
29
+ console.log('');
30
+ console.log(chalk.bold.cyan(' BfxSentry · 持仓状态'));
31
+ console.log('');
32
+ // Summary
33
+ const dailyPnl = getDailyPnl();
34
+ const pnlColor = dailyPnl >= 0 ? chalk.green : chalk.red;
35
+ console.log(` 日 PnL: ${pnlColor('$' + dailyPnl.toFixed(2))} | 交易: ${getDailyTrades()} | 连亏: ${getConsecutiveLosses()} | 总仓位: $${getTotalPositionUsd().toFixed(0)}`);
36
+ const varStats = getVarStats();
37
+ if (varStats.returnsCount > 0) {
38
+ console.log(` VaR(95%): $${varStats.var95.toFixed(2)} | 最差回报: ${(varStats.worstReturn * 100).toFixed(2)}%`);
39
+ }
40
+ console.log('');
41
+ if (positions.length === 0) {
42
+ console.log(chalk.dim(' 无持仓'));
43
+ console.log('');
44
+ return;
45
+ }
46
+ console.log(chalk.dim(' ID 策略 方向 入场 现价 PnL 止损 止盈'));
47
+ console.log(chalk.dim(' ──────────────────────────────────────────────────────────────────────────────────────────'));
48
+ for (const p of positions) {
49
+ const dir = p.direction === 'long' ? chalk.green('多') : chalk.red('空');
50
+ const pnl = p.unrealizedPnl >= 0
51
+ ? chalk.green(`+$${p.unrealizedPnl.toFixed(2)}`)
52
+ : chalk.red(`-$${Math.abs(p.unrealizedPnl).toFixed(2)}`);
53
+ const idShort = p.id.length > 20 ? p.id.slice(0, 20) + '..' : p.id.padEnd(22);
54
+ console.log(` ${idShort} ${p.strategy.padEnd(12)} ${dir} $${p.entryPrice.toFixed(0).padEnd(10)}$${p.currentPrice.toFixed(0).padEnd(10)}${pnl.padEnd(12)}$${p.stopLoss.toFixed(0).padEnd(10)}$${p.takeProfit.toFixed(0)}`);
55
+ }
56
+ console.log('');
57
+ }
58
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/skill/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EACL,YAAY,EAAE,WAAW,EAAE,cAAc,EACzC,oBAAoB,EAAE,mBAAmB,EACzC,aAAa,EAAE,iBAAiB,GACjC,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAe,EAAE,EAAW;IAChE,IAAI,MAAM,KAAK,OAAO,IAAI,EAAE,EAAE,CAAC;QAC7B,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;YAClC,sCAAsC;YACtC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;YAChC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAA;gBACvC,OAAM;YACR,CAAC;YACD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;YACvC,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;YAClE,OAAM;QACR,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;QAChC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAA;QACnE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAA;YAC3C,OAAM;QACR,CAAC;QACD,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QACxE,OAAM;IACR,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAEhC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAA;IAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAEf,UAAU;IACV,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAA;IACxD,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,cAAc,EAAE,YAAY,oBAAoB,EAAE,cAAc,mBAAmB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAE1K,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,IAAI,QAAQ,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAChH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAEf,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;QAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC,CAAA;IAC1G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8FAA8F,CAAC,CAAC,CAAA;IAEtH,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACtE,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC;YAC9B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAE1D,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC7E,OAAO,CAAC,GAAG,CACT,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAChN,CAAA;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACjB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function strategyCommand(name?: string, options?: {
2
+ config?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../../src/skill/strategy.ts"],"names":[],"mappings":"AAYA,wBAAsB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,iBAqCjF"}