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.
- package/package.json +1 -1
- package/src/menus/ai-agent-connect.js +181 -0
- package/src/menus/ai-agent-models.js +219 -0
- package/src/menus/ai-agent-oauth.js +292 -0
- package/src/menus/ai-agent-ui.js +141 -0
- package/src/menus/ai-agent.js +88 -1489
- package/src/pages/algo/copy-engine.js +449 -0
- package/src/pages/algo/copy-trading.js +11 -543
- package/src/pages/algo/smart-logs-data.js +218 -0
- package/src/pages/algo/smart-logs.js +9 -214
- package/src/pages/algo/ui-constants.js +144 -0
- package/src/pages/algo/ui-summary.js +184 -0
- package/src/pages/algo/ui.js +42 -526
- package/src/pages/stats-calculations.js +191 -0
- package/src/pages/stats-ui.js +381 -0
- package/src/pages/stats.js +14 -507
- package/src/services/ai/client-analysis.js +194 -0
- package/src/services/ai/client-models.js +333 -0
- package/src/services/ai/client.js +6 -489
- package/src/services/ai/index.js +2 -257
- package/src/services/ai/providers/direct-providers.js +323 -0
- package/src/services/ai/providers/index.js +8 -472
- package/src/services/ai/providers/other-providers.js +104 -0
- package/src/services/ai/proxy-install.js +249 -0
- package/src/services/ai/proxy-manager.js +29 -411
- package/src/services/ai/proxy-remote.js +161 -0
- package/src/services/ai/supervisor-optimize.js +215 -0
- package/src/services/ai/supervisor-sync.js +178 -0
- package/src/services/ai/supervisor.js +50 -515
- package/src/services/ai/validation.js +250 -0
- package/src/services/hqx-server-events.js +110 -0
- package/src/services/hqx-server-handlers.js +217 -0
- package/src/services/hqx-server-latency.js +136 -0
- package/src/services/hqx-server.js +51 -403
- package/src/services/position-constants.js +28 -0
- package/src/services/position-exit-logic.js +174 -0
- package/src/services/position-manager.js +90 -629
- package/src/services/position-momentum.js +206 -0
- package/src/services/projectx/accounts.js +142 -0
- package/src/services/projectx/index.js +40 -289
- package/src/services/projectx/trading.js +180 -0
- package/src/services/rithmic/contracts.js +218 -0
- package/src/services/rithmic/handlers.js +2 -208
- package/src/services/rithmic/index.js +28 -712
- package/src/services/rithmic/latency-tracker.js +182 -0
- package/src/services/rithmic/market-data-decoders.js +229 -0
- package/src/services/rithmic/market-data.js +1 -278
- package/src/services/rithmic/orders-fast.js +246 -0
- package/src/services/rithmic/orders.js +1 -251
- package/src/services/rithmic/proto-decoders.js +403 -0
- package/src/services/rithmic/protobuf.js +7 -443
- package/src/services/rithmic/specs.js +146 -0
- package/src/services/rithmic/trade-history.js +254 -0
- package/src/services/strategy/hft-signal-calc.js +147 -0
- package/src/services/strategy/hft-tick.js +33 -133
- package/src/services/tradovate/index.js +6 -119
- 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
|
+
};
|