hedgequantx 2.6.161 → 2.6.163

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 (57) hide show
  1. package/package.json +1 -1
  2. package/src/menus/ai-agent-connect.js +181 -0
  3. package/src/menus/ai-agent-models.js +219 -0
  4. package/src/menus/ai-agent-oauth.js +292 -0
  5. package/src/menus/ai-agent-ui.js +141 -0
  6. package/src/menus/ai-agent.js +88 -1489
  7. package/src/pages/algo/copy-engine.js +449 -0
  8. package/src/pages/algo/copy-trading.js +11 -543
  9. package/src/pages/algo/smart-logs-data.js +218 -0
  10. package/src/pages/algo/smart-logs.js +9 -214
  11. package/src/pages/algo/ui-constants.js +144 -0
  12. package/src/pages/algo/ui-summary.js +184 -0
  13. package/src/pages/algo/ui.js +42 -526
  14. package/src/pages/stats-calculations.js +191 -0
  15. package/src/pages/stats-ui.js +381 -0
  16. package/src/pages/stats.js +14 -507
  17. package/src/services/ai/client-analysis.js +194 -0
  18. package/src/services/ai/client-models.js +333 -0
  19. package/src/services/ai/client.js +6 -489
  20. package/src/services/ai/index.js +2 -257
  21. package/src/services/ai/providers/direct-providers.js +323 -0
  22. package/src/services/ai/providers/index.js +8 -472
  23. package/src/services/ai/providers/other-providers.js +104 -0
  24. package/src/services/ai/proxy-install.js +249 -0
  25. package/src/services/ai/proxy-manager.js +29 -411
  26. package/src/services/ai/proxy-remote.js +161 -0
  27. package/src/services/ai/supervisor-optimize.js +215 -0
  28. package/src/services/ai/supervisor-sync.js +178 -0
  29. package/src/services/ai/supervisor.js +50 -515
  30. package/src/services/ai/validation.js +250 -0
  31. package/src/services/hqx-server-events.js +110 -0
  32. package/src/services/hqx-server-handlers.js +217 -0
  33. package/src/services/hqx-server-latency.js +136 -0
  34. package/src/services/hqx-server.js +51 -403
  35. package/src/services/position-constants.js +28 -0
  36. package/src/services/position-exit-logic.js +174 -0
  37. package/src/services/position-manager.js +90 -629
  38. package/src/services/position-momentum.js +206 -0
  39. package/src/services/projectx/accounts.js +142 -0
  40. package/src/services/projectx/index.js +40 -289
  41. package/src/services/projectx/trading.js +180 -0
  42. package/src/services/rithmic/contracts.js +218 -0
  43. package/src/services/rithmic/handlers.js +2 -208
  44. package/src/services/rithmic/index.js +28 -712
  45. package/src/services/rithmic/latency-tracker.js +182 -0
  46. package/src/services/rithmic/market-data-decoders.js +229 -0
  47. package/src/services/rithmic/market-data.js +1 -278
  48. package/src/services/rithmic/orders-fast.js +246 -0
  49. package/src/services/rithmic/orders.js +1 -251
  50. package/src/services/rithmic/proto-decoders.js +403 -0
  51. package/src/services/rithmic/protobuf.js +7 -443
  52. package/src/services/rithmic/specs.js +146 -0
  53. package/src/services/rithmic/trade-history.js +254 -0
  54. package/src/services/strategy/hft-signal-calc.js +147 -0
  55. package/src/services/strategy/hft-tick.js +33 -133
  56. package/src/services/tradovate/index.js +6 -119
  57. package/src/services/tradovate/orders.js +145 -0
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Position Exit Logic
3
+ * @module services/position-exit-logic
4
+ *
5
+ * Exit condition evaluation for fast scalping positions
6
+ */
7
+
8
+ const { FAST_SCALPING } = require('../config/settings');
9
+ const { MOMENTUM, WEIGHTS } = require('./position-constants');
10
+ const { calculateMomentum, getVPIN } = require('./position-momentum');
11
+ const { logger } = require('../utils/logger');
12
+
13
+ const log = logger.scope('PositionExit');
14
+
15
+ /**
16
+ * Check all exit conditions for a position
17
+ * @param {Object} params
18
+ * @param {Object} params.position - Position data
19
+ * @param {number} params.currentPrice - Current market price
20
+ * @param {number} params.pnlTicks - Current P&L in ticks
21
+ * @param {number} params.holdDuration - Time held in ms
22
+ * @param {Object} params.strategy - Strategy instance
23
+ * @param {Function} params.getTickSize - Function to get tick size
24
+ * @param {Map} params.latestPrices - Latest prices map
25
+ * @returns {Object|null} - Exit reason or null
26
+ */
27
+ function checkExitConditions({
28
+ position,
29
+ currentPrice,
30
+ pnlTicks,
31
+ holdDuration,
32
+ strategy,
33
+ getTickSize,
34
+ latestPrices,
35
+ }) {
36
+ if (pnlTicks === null) return null;
37
+
38
+ const targetTicks = FAST_SCALPING.TARGET_TICKS;
39
+ const stopTicks = FAST_SCALPING.STOP_TICKS;
40
+
41
+ // 1. TARGET HIT
42
+ if (pnlTicks >= targetTicks) {
43
+ return { type: 'target', reason: 'Target reached', pnlTicks };
44
+ }
45
+
46
+ // 2. BREAKEVEN CHECK
47
+ if (position.breakevenActive && position.breakevenPrice !== null) {
48
+ const tickSize = getTickSize(position);
49
+ if (tickSize) {
50
+ if (position.side === 0 && currentPrice <= position.breakevenPrice) {
51
+ return { type: 'breakeven', reason: 'Breakeven stop hit', pnlTicks };
52
+ } else if (position.side === 1 && currentPrice >= position.breakevenPrice) {
53
+ return { type: 'breakeven', reason: 'Breakeven stop hit', pnlTicks };
54
+ }
55
+ }
56
+ }
57
+
58
+ // 3. STOP HIT (only if BE not active)
59
+ if (!position.breakevenActive && pnlTicks <= -stopTicks) {
60
+ return { type: 'stop', reason: 'Stop loss hit', pnlTicks };
61
+ }
62
+
63
+ // 4. VPIN DANGER
64
+ const vpin = getVPIN(strategy, position.contractId || position.symbol);
65
+ if (vpin !== null && vpin > MOMENTUM.VPIN_DANGER) {
66
+ return { type: 'vpin', reason: `VPIN spike ${(vpin * 100).toFixed(0)}% - informed traders`, pnlTicks, vpin };
67
+ }
68
+
69
+ // 5. TRAILING STOP
70
+ if (pnlTicks >= FAST_SCALPING.TRAILING_ACTIVATION_TICKS) {
71
+ const trailingPnl = calculateTrailingPnl(position, currentPrice, getTickSize);
72
+ if (trailingPnl !== null && trailingPnl <= -FAST_SCALPING.TRAILING_DISTANCE_TICKS) {
73
+ return { type: 'trailing', reason: 'Trailing stop triggered', pnlTicks, trailingPnl };
74
+ }
75
+ }
76
+
77
+ // 6. MOMENTUM-BASED EXIT
78
+ const momentum = calculateMomentum({
79
+ strategy: strategy,
80
+ contractId: position.contractId || position.symbol,
81
+ side: position.side,
82
+ currentPrice: latestPrices.get(position.symbol),
83
+ tickSize: getTickSize(position),
84
+ });
85
+
86
+ if (momentum !== null) {
87
+ if (momentum > MOMENTUM.STRONG_FAVORABLE && pnlTicks > 4) {
88
+ return null; // Don't exit - momentum is strong
89
+ }
90
+
91
+ if (momentum < MOMENTUM.WEAK_THRESHOLD && pnlTicks > 0) {
92
+ return { type: 'momentum_weak', reason: 'Weak momentum - securing profit', pnlTicks, momentum };
93
+ }
94
+
95
+ if (momentum < MOMENTUM.ADVERSE_THRESHOLD) {
96
+ return { type: 'momentum_adverse', reason: 'Adverse momentum detected', pnlTicks, momentum };
97
+ }
98
+ }
99
+
100
+ return null;
101
+ }
102
+
103
+ /**
104
+ * Check and activate breakeven if conditions met
105
+ * @param {Object} position
106
+ * @param {number} pnlTicks
107
+ * @param {Function} getTickSize
108
+ * @returns {Object|null} - Breakeven activation info or null
109
+ */
110
+ function checkBreakevenActivation(position, pnlTicks, getTickSize) {
111
+ if (position.breakevenActive) return null;
112
+ if (pnlTicks < FAST_SCALPING.BREAKEVEN_ACTIVATION_TICKS) return null;
113
+
114
+ const tickSize = getTickSize(position);
115
+ if (!tickSize || !position.entryPrice) return null;
116
+
117
+ const offset = FAST_SCALPING.BREAKEVEN_OFFSET_TICKS * tickSize;
118
+ const breakevenPrice = position.side === 0
119
+ ? position.entryPrice + offset
120
+ : position.entryPrice - offset;
121
+
122
+ return {
123
+ breakevenPrice,
124
+ pnlTicks,
125
+ };
126
+ }
127
+
128
+ /**
129
+ * Calculate trailing P&L from high/low water mark
130
+ * @param {Object} position
131
+ * @param {number} currentPrice
132
+ * @param {Function} getTickSize
133
+ * @returns {number|null}
134
+ */
135
+ function calculateTrailingPnl(position, currentPrice, getTickSize) {
136
+ const tickSize = getTickSize(position);
137
+ if (tickSize === null) return null;
138
+
139
+ if (position.side === 0) {
140
+ if (position.highWaterMark === null) return null;
141
+ const dropFromHigh = position.highWaterMark - currentPrice;
142
+ return -Math.round(dropFromHigh / tickSize);
143
+ } else {
144
+ if (position.lowWaterMark === null) return null;
145
+ const riseFromLow = currentPrice - position.lowWaterMark;
146
+ return -Math.round(riseFromLow / tickSize);
147
+ }
148
+ }
149
+
150
+ /**
151
+ * Calculate P&L in ticks
152
+ * @param {Object} position
153
+ * @param {number} currentPrice
154
+ * @param {Function} getTickSize
155
+ * @returns {number|null}
156
+ */
157
+ function calculatePnlTicks(position, currentPrice, getTickSize) {
158
+ if (position.entryPrice === null || currentPrice === null) return null;
159
+
160
+ const tickSize = getTickSize(position);
161
+ if (tickSize === null) return null;
162
+
163
+ const priceDiff = currentPrice - position.entryPrice;
164
+ const signedDiff = position.side === 0 ? priceDiff : -priceDiff;
165
+
166
+ return Math.round(signedDiff / tickSize);
167
+ }
168
+
169
+ module.exports = {
170
+ checkExitConditions,
171
+ checkBreakevenActivation,
172
+ calculateTrailingPnl,
173
+ calculatePnlTicks,
174
+ };