hedgequantx 2.9.93 → 2.9.95
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/dist/lib/m/hqx-2b.js +1 -845
- package/dist/lib/m/ultra-scalping.js +1 -705
- package/package.json +1 -1
- package/src/lib/m/hqx-2b.js +1 -1
- package/src/pages/algo/algo-executor.js +1 -2
|
@@ -1,705 +1 @@
|
|
|
1
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
2
|
-
var __commonJS = (cb, mod) => function __require() {
|
|
3
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
// ultra-scalping/config.js
|
|
7
|
-
var require_config = __commonJS({
|
|
8
|
-
"ultra-scalping/config.js"(exports2, module2) {
|
|
9
|
-
var DEFAULT_CONFIG = {
|
|
10
|
-
// Model Parameters
|
|
11
|
-
zscoreEntryThreshold: 1.5,
|
|
12
|
-
// Live trading threshold (backtest: 2.5)
|
|
13
|
-
zscoreExitThreshold: 0.5,
|
|
14
|
-
vpinWindow: 50,
|
|
15
|
-
vpinToxicThreshold: 0.7,
|
|
16
|
-
// Skip if VPIN > 0.7
|
|
17
|
-
volatilityLookback: 100,
|
|
18
|
-
ofiLookback: 20,
|
|
19
|
-
// Trade Parameters
|
|
20
|
-
baseStopTicks: 8,
|
|
21
|
-
// $40
|
|
22
|
-
baseTargetTicks: 16,
|
|
23
|
-
// $80
|
|
24
|
-
breakevenTicks: 4,
|
|
25
|
-
// Move to BE at +4 ticks
|
|
26
|
-
profitLockPct: 0.5,
|
|
27
|
-
// Lock 50% of profit
|
|
28
|
-
minConfidence: 0.55,
|
|
29
|
-
// Minimum composite confidence
|
|
30
|
-
cooldownMs: 3e4,
|
|
31
|
-
// 30 seconds between signals
|
|
32
|
-
minHoldTimeMs: 1e4,
|
|
33
|
-
// Minimum 10 seconds hold
|
|
34
|
-
// Model Weights (from Python backtest)
|
|
35
|
-
weights: {
|
|
36
|
-
zscore: 0.3,
|
|
37
|
-
// 30%
|
|
38
|
-
ofi: 0.2,
|
|
39
|
-
// 20%
|
|
40
|
-
vpin: 0.15,
|
|
41
|
-
// 15%
|
|
42
|
-
kalman: 0.15,
|
|
43
|
-
// 15%
|
|
44
|
-
kyleLambda: 0.1,
|
|
45
|
-
// 10%
|
|
46
|
-
volatility: 0.1
|
|
47
|
-
// 10%
|
|
48
|
-
},
|
|
49
|
-
// Session (Futures Market Hours - Sunday 18:00 to Friday 17:00 EST)
|
|
50
|
-
session: {
|
|
51
|
-
enabled: false,
|
|
52
|
-
// Trade anytime markets are open
|
|
53
|
-
timezone: "America/New_York"
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
module2.exports = { DEFAULT_CONFIG };
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
// common/types.js
|
|
61
|
-
var require_types = __commonJS({
|
|
62
|
-
"common/types.js"(exports2, module2) {
|
|
63
|
-
var OrderSide2 = { BID: 0, ASK: 1 };
|
|
64
|
-
var SignalStrength2 = { WEAK: 1, MODERATE: 2, STRONG: 3, VERY_STRONG: 4 };
|
|
65
|
-
module2.exports = { OrderSide: OrderSide2, SignalStrength: SignalStrength2 };
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
// ultra-scalping/signal.js
|
|
70
|
-
var require_signal = __commonJS({
|
|
71
|
-
"ultra-scalping/signal.js"(exports2, module2) {
|
|
72
|
-
var { v4: uuidv4 } = require("uuid");
|
|
73
|
-
var { OrderSide: OrderSide2, SignalStrength: SignalStrength2 } = require_types();
|
|
74
|
-
function generateSignal(params) {
|
|
75
|
-
const {
|
|
76
|
-
contractId,
|
|
77
|
-
currentPrice,
|
|
78
|
-
zscore,
|
|
79
|
-
vpin,
|
|
80
|
-
kyleLambda,
|
|
81
|
-
kalmanEstimate,
|
|
82
|
-
regime,
|
|
83
|
-
volParams,
|
|
84
|
-
ofi,
|
|
85
|
-
config,
|
|
86
|
-
tickSize
|
|
87
|
-
} = params;
|
|
88
|
-
const absZscore = Math.abs(zscore);
|
|
89
|
-
if (absZscore < volParams.zscoreThreshold) {
|
|
90
|
-
return null;
|
|
91
|
-
}
|
|
92
|
-
if (vpin > config.vpinToxicThreshold) {
|
|
93
|
-
return null;
|
|
94
|
-
}
|
|
95
|
-
let direction;
|
|
96
|
-
if (zscore < -volParams.zscoreThreshold) {
|
|
97
|
-
direction = "long";
|
|
98
|
-
} else if (zscore > volParams.zscoreThreshold) {
|
|
99
|
-
direction = "short";
|
|
100
|
-
} else {
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
const ofiConfirms = direction === "long" && ofi > 0.1 || direction === "short" && ofi < -0.1;
|
|
104
|
-
const kalmanDiff = currentPrice - kalmanEstimate;
|
|
105
|
-
const kalmanConfirms = direction === "long" && kalmanDiff < 0 || direction === "short" && kalmanDiff > 0;
|
|
106
|
-
const scores = {
|
|
107
|
-
zscore: Math.min(1, absZscore / 4),
|
|
108
|
-
// Normalize to 0-1
|
|
109
|
-
vpin: 1 - vpin,
|
|
110
|
-
// Lower VPIN = better
|
|
111
|
-
kyleLambda: kyleLambda > 1e-3 ? 0.5 : 0.8,
|
|
112
|
-
// Moderate lambda is good
|
|
113
|
-
kalman: kalmanConfirms ? 0.8 : 0.4,
|
|
114
|
-
volatility: regime === "normal" ? 0.8 : regime === "low" ? 0.7 : 0.6,
|
|
115
|
-
ofi: ofiConfirms ? 0.9 : 0.5,
|
|
116
|
-
composite: 0
|
|
117
|
-
// Calculated below
|
|
118
|
-
};
|
|
119
|
-
scores.composite = scores.zscore * config.weights.zscore + // 30%
|
|
120
|
-
scores.vpin * config.weights.vpin + // 15%
|
|
121
|
-
scores.kyleLambda * config.weights.kyleLambda + // 10%
|
|
122
|
-
scores.kalman * config.weights.kalman + // 15%
|
|
123
|
-
scores.volatility * config.weights.volatility + // 10%
|
|
124
|
-
scores.ofi * config.weights.ofi;
|
|
125
|
-
const confidence = Math.min(1, scores.composite + volParams.confidenceBonus);
|
|
126
|
-
if (confidence < config.minConfidence) {
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
const stopTicks = Math.round(config.baseStopTicks * volParams.stopMultiplier);
|
|
130
|
-
const targetTicks = Math.round(config.baseTargetTicks * volParams.targetMultiplier);
|
|
131
|
-
const actualStopTicks = Math.max(6, Math.min(12, stopTicks));
|
|
132
|
-
const actualTargetTicks = Math.max(actualStopTicks * 1.5, Math.min(24, targetTicks));
|
|
133
|
-
let stopLoss, takeProfit, beBreakeven, profitLockLevel;
|
|
134
|
-
if (direction === "long") {
|
|
135
|
-
stopLoss = currentPrice - actualStopTicks * tickSize;
|
|
136
|
-
takeProfit = currentPrice + actualTargetTicks * tickSize;
|
|
137
|
-
beBreakeven = currentPrice + config.breakevenTicks * tickSize;
|
|
138
|
-
profitLockLevel = currentPrice + actualTargetTicks * config.profitLockPct * tickSize;
|
|
139
|
-
} else {
|
|
140
|
-
stopLoss = currentPrice + actualStopTicks * tickSize;
|
|
141
|
-
takeProfit = currentPrice - actualTargetTicks * tickSize;
|
|
142
|
-
beBreakeven = currentPrice - config.breakevenTicks * tickSize;
|
|
143
|
-
profitLockLevel = currentPrice - actualTargetTicks * config.profitLockPct * tickSize;
|
|
144
|
-
}
|
|
145
|
-
const riskReward = actualTargetTicks / actualStopTicks;
|
|
146
|
-
const trailTriggerTicks = Math.round(actualTargetTicks * 0.5);
|
|
147
|
-
const trailDistanceTicks = Math.round(actualStopTicks * 0.4);
|
|
148
|
-
let strength = SignalStrength2.MODERATE;
|
|
149
|
-
if (confidence >= 0.85) strength = SignalStrength2.VERY_STRONG;
|
|
150
|
-
else if (confidence >= 0.75) strength = SignalStrength2.STRONG;
|
|
151
|
-
else if (confidence < 0.6) strength = SignalStrength2.WEAK;
|
|
152
|
-
const winProb = 0.5 + (confidence - 0.5) * 0.4;
|
|
153
|
-
const edge = winProb * Math.abs(takeProfit - currentPrice) - (1 - winProb) * Math.abs(currentPrice - stopLoss);
|
|
154
|
-
return {
|
|
155
|
-
id: uuidv4(),
|
|
156
|
-
timestamp: Date.now(),
|
|
157
|
-
symbol: contractId.split(".")[0] || contractId,
|
|
158
|
-
contractId,
|
|
159
|
-
side: direction === "long" ? OrderSide2.BID : OrderSide2.ASK,
|
|
160
|
-
direction,
|
|
161
|
-
strategy: "HQX_ULTRA_SCALPING_6MODELS",
|
|
162
|
-
strength,
|
|
163
|
-
edge,
|
|
164
|
-
confidence,
|
|
165
|
-
entry: currentPrice,
|
|
166
|
-
entryPrice: currentPrice,
|
|
167
|
-
stopLoss,
|
|
168
|
-
takeProfit,
|
|
169
|
-
riskReward,
|
|
170
|
-
stopTicks: actualStopTicks,
|
|
171
|
-
targetTicks: actualTargetTicks,
|
|
172
|
-
trailTriggerTicks,
|
|
173
|
-
trailDistanceTicks,
|
|
174
|
-
beBreakeven,
|
|
175
|
-
profitLockLevel,
|
|
176
|
-
// Model values for debugging/monitoring
|
|
177
|
-
zScore: zscore,
|
|
178
|
-
zScoreExit: config.zscoreExitThreshold,
|
|
179
|
-
vpinValue: vpin,
|
|
180
|
-
kyleLambda,
|
|
181
|
-
kalmanEstimate,
|
|
182
|
-
volatilityRegime: regime,
|
|
183
|
-
ofiValue: ofi,
|
|
184
|
-
models: scores,
|
|
185
|
-
// Order flow confirmation flag
|
|
186
|
-
orderFlowConfirmed: ofiConfirms,
|
|
187
|
-
kalmanConfirmed: kalmanConfirms,
|
|
188
|
-
expires: Date.now() + 6e4
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
module2.exports = { generateSignal };
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
// ultra-scalping/models/zscore.js
|
|
196
|
-
var require_zscore = __commonJS({
|
|
197
|
-
"ultra-scalping/models/zscore.js"(exports2, module2) {
|
|
198
|
-
function computeZScore(prices, window = 50) {
|
|
199
|
-
if (prices.length < window) return 0;
|
|
200
|
-
const recentPrices = prices.slice(-window);
|
|
201
|
-
const mean = recentPrices.reduce((a, b) => a + b, 0) / window;
|
|
202
|
-
const variance = recentPrices.reduce((sum, p) => sum + Math.pow(p - mean, 2), 0) / window;
|
|
203
|
-
const std = Math.sqrt(variance);
|
|
204
|
-
if (std < 1e-4) return 0;
|
|
205
|
-
const currentPrice = prices[prices.length - 1];
|
|
206
|
-
return (currentPrice - mean) / std;
|
|
207
|
-
}
|
|
208
|
-
module2.exports = { computeZScore };
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
// ultra-scalping/models/vpin.js
|
|
213
|
-
var require_vpin = __commonJS({
|
|
214
|
-
"ultra-scalping/models/vpin.js"(exports2, module2) {
|
|
215
|
-
function computeVPIN(volumes, vpinWindow = 50) {
|
|
216
|
-
if (volumes.length < vpinWindow) return 0.5;
|
|
217
|
-
const recentVolumes = volumes.slice(-vpinWindow);
|
|
218
|
-
let totalBuy = 0;
|
|
219
|
-
let totalSell = 0;
|
|
220
|
-
for (const v of recentVolumes) {
|
|
221
|
-
totalBuy += v.buy;
|
|
222
|
-
totalSell += v.sell;
|
|
223
|
-
}
|
|
224
|
-
const totalVolume = totalBuy + totalSell;
|
|
225
|
-
if (totalVolume < 1) return 0.5;
|
|
226
|
-
return Math.abs(totalBuy - totalSell) / totalVolume;
|
|
227
|
-
}
|
|
228
|
-
module2.exports = { computeVPIN };
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
// ultra-scalping/models/kyle.js
|
|
233
|
-
var require_kyle = __commonJS({
|
|
234
|
-
"ultra-scalping/models/kyle.js"(exports2, module2) {
|
|
235
|
-
function computeKyleLambda(bars) {
|
|
236
|
-
if (bars.length < 20) return 0;
|
|
237
|
-
const recentBars = bars.slice(-20);
|
|
238
|
-
const priceChanges = [];
|
|
239
|
-
const volumes = [];
|
|
240
|
-
for (let i = 1; i < recentBars.length; i++) {
|
|
241
|
-
priceChanges.push(recentBars[i].close - recentBars[i - 1].close);
|
|
242
|
-
volumes.push(recentBars[i].volume);
|
|
243
|
-
}
|
|
244
|
-
const meanPrice = priceChanges.reduce((a, b) => a + b, 0) / priceChanges.length;
|
|
245
|
-
const meanVol = volumes.reduce((a, b) => a + b, 0) / volumes.length;
|
|
246
|
-
let covariance = 0;
|
|
247
|
-
let varianceVol = 0;
|
|
248
|
-
for (let i = 0; i < priceChanges.length; i++) {
|
|
249
|
-
covariance += (priceChanges[i] - meanPrice) * (volumes[i] - meanVol);
|
|
250
|
-
varianceVol += Math.pow(volumes[i] - meanVol, 2);
|
|
251
|
-
}
|
|
252
|
-
covariance /= priceChanges.length;
|
|
253
|
-
varianceVol /= priceChanges.length;
|
|
254
|
-
if (varianceVol < 1e-4) return 0;
|
|
255
|
-
return Math.abs(covariance / varianceVol);
|
|
256
|
-
}
|
|
257
|
-
module2.exports = { computeKyleLambda };
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
// ultra-scalping/models/kalman.js
|
|
262
|
-
var require_kalman = __commonJS({
|
|
263
|
-
"ultra-scalping/models/kalman.js"(exports2, module2) {
|
|
264
|
-
var KALMAN_PROCESS_NOISE = 0.01;
|
|
265
|
-
var KALMAN_MEASUREMENT_NOISE = 0.1;
|
|
266
|
-
function applyKalmanFilter(state, measurement) {
|
|
267
|
-
if (!state || state.estimate === 0) {
|
|
268
|
-
return {
|
|
269
|
-
estimate: measurement,
|
|
270
|
-
errorCovariance: 1,
|
|
271
|
-
newEstimate: measurement
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
const predictedEstimate = state.estimate;
|
|
275
|
-
const predictedCovariance = state.errorCovariance + KALMAN_PROCESS_NOISE;
|
|
276
|
-
const kalmanGain = predictedCovariance / (predictedCovariance + KALMAN_MEASUREMENT_NOISE);
|
|
277
|
-
const newEstimate = predictedEstimate + kalmanGain * (measurement - predictedEstimate);
|
|
278
|
-
const newCovariance = (1 - kalmanGain) * predictedCovariance;
|
|
279
|
-
return {
|
|
280
|
-
estimate: newEstimate,
|
|
281
|
-
errorCovariance: newCovariance,
|
|
282
|
-
newEstimate
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
function createKalmanState() {
|
|
286
|
-
return {
|
|
287
|
-
estimate: 0,
|
|
288
|
-
errorCovariance: 1
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
module2.exports = {
|
|
292
|
-
applyKalmanFilter,
|
|
293
|
-
createKalmanState,
|
|
294
|
-
KALMAN_PROCESS_NOISE,
|
|
295
|
-
KALMAN_MEASUREMENT_NOISE
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
// ultra-scalping/models/volatility.js
|
|
301
|
-
var require_volatility = __commonJS({
|
|
302
|
-
"ultra-scalping/models/volatility.js"(exports2, module2) {
|
|
303
|
-
function calculateATR(bars, period = 14) {
|
|
304
|
-
if (bars.length < period + 1) return 2.5;
|
|
305
|
-
const trValues = [];
|
|
306
|
-
for (let i = bars.length - period; i < bars.length; i++) {
|
|
307
|
-
const bar = bars[i];
|
|
308
|
-
const prevClose = bars[i - 1].close;
|
|
309
|
-
const tr = Math.max(
|
|
310
|
-
bar.high - bar.low,
|
|
311
|
-
Math.abs(bar.high - prevClose),
|
|
312
|
-
Math.abs(bar.low - prevClose)
|
|
313
|
-
);
|
|
314
|
-
trValues.push(tr);
|
|
315
|
-
}
|
|
316
|
-
return trValues.reduce((a, b) => a + b, 0) / trValues.length;
|
|
317
|
-
}
|
|
318
|
-
function detectVolatilityRegime(atr, atrHistory, tickSize) {
|
|
319
|
-
let atrPercentile = 0.5;
|
|
320
|
-
if (atrHistory.length >= 20) {
|
|
321
|
-
atrPercentile = atrHistory.filter((a) => a <= atr).length / atrHistory.length;
|
|
322
|
-
}
|
|
323
|
-
let regime, params;
|
|
324
|
-
if (atrPercentile < 0.25) {
|
|
325
|
-
regime = "low";
|
|
326
|
-
params = {
|
|
327
|
-
stopMultiplier: 0.8,
|
|
328
|
-
targetMultiplier: 0.9,
|
|
329
|
-
zscoreThreshold: 1.2,
|
|
330
|
-
confidenceBonus: 0.05
|
|
331
|
-
};
|
|
332
|
-
} else if (atrPercentile < 0.75) {
|
|
333
|
-
regime = "normal";
|
|
334
|
-
params = {
|
|
335
|
-
stopMultiplier: 1,
|
|
336
|
-
targetMultiplier: 1,
|
|
337
|
-
zscoreThreshold: 1.5,
|
|
338
|
-
confidenceBonus: 0
|
|
339
|
-
};
|
|
340
|
-
} else {
|
|
341
|
-
regime = "high";
|
|
342
|
-
params = {
|
|
343
|
-
stopMultiplier: 1.3,
|
|
344
|
-
targetMultiplier: 1.2,
|
|
345
|
-
zscoreThreshold: 2,
|
|
346
|
-
confidenceBonus: -0.05
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
return { regime, params, atrPercentile };
|
|
350
|
-
}
|
|
351
|
-
module2.exports = { calculateATR, detectVolatilityRegime };
|
|
352
|
-
}
|
|
353
|
-
});
|
|
354
|
-
|
|
355
|
-
// ultra-scalping/models/ofi.js
|
|
356
|
-
var require_ofi = __commonJS({
|
|
357
|
-
"ultra-scalping/models/ofi.js"(exports2, module2) {
|
|
358
|
-
function computeOrderFlowImbalance(bars, lookback = 20) {
|
|
359
|
-
if (bars.length < lookback) return 0;
|
|
360
|
-
const recentBars = bars.slice(-lookback);
|
|
361
|
-
let totalBuyPressure = 0;
|
|
362
|
-
let totalSellPressure = 0;
|
|
363
|
-
for (const bar of recentBars) {
|
|
364
|
-
const barRange = bar.high - bar.low;
|
|
365
|
-
if (barRange > 0) {
|
|
366
|
-
const closePosition = (bar.close - bar.low) / barRange;
|
|
367
|
-
totalBuyPressure += closePosition * bar.volume;
|
|
368
|
-
totalSellPressure += (1 - closePosition) * bar.volume;
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
const totalPressure = totalBuyPressure + totalSellPressure;
|
|
372
|
-
if (totalPressure < 1) return 0;
|
|
373
|
-
return (totalBuyPressure - totalSellPressure) / totalPressure;
|
|
374
|
-
}
|
|
375
|
-
module2.exports = { computeOrderFlowImbalance };
|
|
376
|
-
}
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
// ultra-scalping/models/index.js
|
|
380
|
-
var require_models = __commonJS({
|
|
381
|
-
"ultra-scalping/models/index.js"(exports2, module2) {
|
|
382
|
-
var { computeZScore } = require_zscore();
|
|
383
|
-
var { computeVPIN } = require_vpin();
|
|
384
|
-
var { computeKyleLambda } = require_kyle();
|
|
385
|
-
var { applyKalmanFilter, createKalmanState } = require_kalman();
|
|
386
|
-
var { calculateATR, detectVolatilityRegime } = require_volatility();
|
|
387
|
-
var { computeOrderFlowImbalance } = require_ofi();
|
|
388
|
-
module2.exports = {
|
|
389
|
-
computeZScore,
|
|
390
|
-
computeVPIN,
|
|
391
|
-
computeKyleLambda,
|
|
392
|
-
applyKalmanFilter,
|
|
393
|
-
createKalmanState,
|
|
394
|
-
calculateATR,
|
|
395
|
-
detectVolatilityRegime,
|
|
396
|
-
computeOrderFlowImbalance
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
// ultra-scalping/core.js
|
|
402
|
-
var require_core = __commonJS({
|
|
403
|
-
"ultra-scalping/core.js"(exports2, module2) {
|
|
404
|
-
var EventEmitter2 = require("events");
|
|
405
|
-
var { DEFAULT_CONFIG } = require_config();
|
|
406
|
-
var { generateSignal } = require_signal();
|
|
407
|
-
var {
|
|
408
|
-
computeZScore,
|
|
409
|
-
computeVPIN,
|
|
410
|
-
computeKyleLambda,
|
|
411
|
-
applyKalmanFilter,
|
|
412
|
-
createKalmanState,
|
|
413
|
-
calculateATR,
|
|
414
|
-
detectVolatilityRegime,
|
|
415
|
-
computeOrderFlowImbalance
|
|
416
|
-
} = require_models();
|
|
417
|
-
var HQXUltraScalping2 = class extends EventEmitter2 {
|
|
418
|
-
constructor(config = {}) {
|
|
419
|
-
super();
|
|
420
|
-
this.tickSize = config.tickSize || 0.25;
|
|
421
|
-
this.tickValue = config.tickValue || 5;
|
|
422
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
423
|
-
this.barHistory = /* @__PURE__ */ new Map();
|
|
424
|
-
this.priceBuffer = /* @__PURE__ */ new Map();
|
|
425
|
-
this.volumeBuffer = /* @__PURE__ */ new Map();
|
|
426
|
-
this.kalmanStates = /* @__PURE__ */ new Map();
|
|
427
|
-
this.atrHistory = /* @__PURE__ */ new Map();
|
|
428
|
-
this.recentTrades = [];
|
|
429
|
-
this.winStreak = 0;
|
|
430
|
-
this.lossStreak = 0;
|
|
431
|
-
this.lastSignalTime = 0;
|
|
432
|
-
this.stats = { signals: 0, trades: 0, wins: 0, losses: 0, pnl: 0 };
|
|
433
|
-
}
|
|
434
|
-
initialize(contractId, tickSize = 0.25, tickValue = 5) {
|
|
435
|
-
this.tickSize = tickSize;
|
|
436
|
-
this.tickValue = tickValue;
|
|
437
|
-
this.barHistory.set(contractId, []);
|
|
438
|
-
this.priceBuffer.set(contractId, []);
|
|
439
|
-
this.volumeBuffer.set(contractId, []);
|
|
440
|
-
this.atrHistory.set(contractId, []);
|
|
441
|
-
this.kalmanStates.set(contractId, createKalmanState());
|
|
442
|
-
this.emit("log", {
|
|
443
|
-
type: "info",
|
|
444
|
-
message: `[HQX-UltraScalping] Initialized for ${contractId}: tick=${tickSize}, value=${tickValue}`
|
|
445
|
-
});
|
|
446
|
-
this.emit("log", {
|
|
447
|
-
type: "info",
|
|
448
|
-
message: `[HQX-UltraScalping] 6 Models: Z-Score(30%), OFI(20%), VPIN(15%), Kalman(15%), Kyle(10%), Vol(10%)`
|
|
449
|
-
});
|
|
450
|
-
}
|
|
451
|
-
processTick(tick) {
|
|
452
|
-
const { contractId, price, volume, timestamp } = tick;
|
|
453
|
-
const bar = {
|
|
454
|
-
timestamp: timestamp || Date.now(),
|
|
455
|
-
open: price,
|
|
456
|
-
high: price,
|
|
457
|
-
low: price,
|
|
458
|
-
close: price,
|
|
459
|
-
volume: volume || 1
|
|
460
|
-
};
|
|
461
|
-
return this.processBar(contractId, bar);
|
|
462
|
-
}
|
|
463
|
-
onTick(tick) {
|
|
464
|
-
return this.processTick(tick);
|
|
465
|
-
}
|
|
466
|
-
onTrade(trade) {
|
|
467
|
-
return this.processTick({
|
|
468
|
-
contractId: trade.contractId || trade.symbol,
|
|
469
|
-
price: trade.price,
|
|
470
|
-
volume: trade.size || trade.volume || 1,
|
|
471
|
-
side: trade.side,
|
|
472
|
-
timestamp: trade.timestamp || Date.now()
|
|
473
|
-
});
|
|
474
|
-
}
|
|
475
|
-
processBar(contractId, bar) {
|
|
476
|
-
let bars = this.barHistory.get(contractId);
|
|
477
|
-
if (!bars) {
|
|
478
|
-
this.initialize(contractId);
|
|
479
|
-
bars = this.barHistory.get(contractId);
|
|
480
|
-
}
|
|
481
|
-
bars.push(bar);
|
|
482
|
-
if (bars.length > 500) bars.shift();
|
|
483
|
-
const prices = this.priceBuffer.get(contractId);
|
|
484
|
-
prices.push(bar.close);
|
|
485
|
-
if (prices.length > 200) prices.shift();
|
|
486
|
-
const volumes = this.volumeBuffer.get(contractId);
|
|
487
|
-
const barRange = bar.high - bar.low;
|
|
488
|
-
let buyVol = bar.volume * 0.5;
|
|
489
|
-
let sellVol = bar.volume * 0.5;
|
|
490
|
-
if (barRange > 0) {
|
|
491
|
-
const closePosition = (bar.close - bar.low) / barRange;
|
|
492
|
-
buyVol = bar.volume * closePosition;
|
|
493
|
-
sellVol = bar.volume * (1 - closePosition);
|
|
494
|
-
}
|
|
495
|
-
volumes.push({ buy: buyVol, sell: sellVol });
|
|
496
|
-
if (volumes.length > 100) volumes.shift();
|
|
497
|
-
if (bars.length < 50) return null;
|
|
498
|
-
const zscore = computeZScore(prices);
|
|
499
|
-
const vpin = computeVPIN(volumes, this.config.vpinWindow);
|
|
500
|
-
const kyleLambda = computeKyleLambda(bars);
|
|
501
|
-
const kalmanState = this.kalmanStates.get(contractId);
|
|
502
|
-
const kalmanResult = applyKalmanFilter(kalmanState, bar.close);
|
|
503
|
-
this.kalmanStates.set(contractId, {
|
|
504
|
-
estimate: kalmanResult.estimate,
|
|
505
|
-
errorCovariance: kalmanResult.errorCovariance
|
|
506
|
-
});
|
|
507
|
-
const kalmanEstimate = kalmanResult.newEstimate;
|
|
508
|
-
const atr = calculateATR(bars);
|
|
509
|
-
const atrHist = this.atrHistory.get(contractId);
|
|
510
|
-
atrHist.push(atr);
|
|
511
|
-
if (atrHist.length > 500) atrHist.shift();
|
|
512
|
-
const { regime, params: volParams } = detectVolatilityRegime(atr, atrHist, this.tickSize);
|
|
513
|
-
const ofi = computeOrderFlowImbalance(bars, this.config.ofiLookback);
|
|
514
|
-
if (Date.now() - this.lastSignalTime < this.config.cooldownMs) {
|
|
515
|
-
return null;
|
|
516
|
-
}
|
|
517
|
-
const signal = generateSignal({
|
|
518
|
-
contractId,
|
|
519
|
-
currentPrice: bar.close,
|
|
520
|
-
zscore,
|
|
521
|
-
vpin,
|
|
522
|
-
kyleLambda,
|
|
523
|
-
kalmanEstimate,
|
|
524
|
-
regime,
|
|
525
|
-
volParams,
|
|
526
|
-
ofi,
|
|
527
|
-
config: this.config,
|
|
528
|
-
tickSize: this.tickSize
|
|
529
|
-
});
|
|
530
|
-
if (signal) {
|
|
531
|
-
this.lastSignalTime = Date.now();
|
|
532
|
-
this.stats.signals++;
|
|
533
|
-
this.emit("signal", {
|
|
534
|
-
side: signal.direction === "long" ? "buy" : "sell",
|
|
535
|
-
action: "open",
|
|
536
|
-
reason: `Z=${zscore.toFixed(2)}, VPIN=${(vpin * 100).toFixed(0)}%, OFI=${(ofi * 100).toFixed(0)}%, cf=${(signal.confidence * 100).toFixed(0)}%`,
|
|
537
|
-
...signal
|
|
538
|
-
});
|
|
539
|
-
this.emit("log", {
|
|
540
|
-
type: "info",
|
|
541
|
-
message: `[HQX] SIGNAL: ${signal.direction.toUpperCase()} @ ${bar.close.toFixed(2)} | Z:${zscore.toFixed(2)} VPIN:${(vpin * 100).toFixed(0)}% OFI:${(ofi * 100).toFixed(0)}% Kyle:${kyleLambda.toFixed(5)} Regime:${regime} | Conf:${(signal.confidence * 100).toFixed(0)}%`
|
|
542
|
-
});
|
|
543
|
-
}
|
|
544
|
-
return signal;
|
|
545
|
-
}
|
|
546
|
-
shouldExitByZScore(contractId) {
|
|
547
|
-
const prices = this.priceBuffer.get(contractId);
|
|
548
|
-
if (!prices || prices.length < 50) return false;
|
|
549
|
-
const zscore = computeZScore(prices);
|
|
550
|
-
return Math.abs(zscore) < this.config.zscoreExitThreshold;
|
|
551
|
-
}
|
|
552
|
-
getModelValues(contractId) {
|
|
553
|
-
const prices = this.priceBuffer.get(contractId);
|
|
554
|
-
const volumes = this.volumeBuffer.get(contractId);
|
|
555
|
-
const bars = this.barHistory.get(contractId);
|
|
556
|
-
if (!prices || !volumes || !bars || bars.length < 50) {
|
|
557
|
-
return null;
|
|
558
|
-
}
|
|
559
|
-
const zscore = computeZScore(prices);
|
|
560
|
-
const vpin = computeVPIN(volumes, this.config.vpinWindow);
|
|
561
|
-
const kyleLambda = computeKyleLambda(bars);
|
|
562
|
-
const ofi = computeOrderFlowImbalance(bars, this.config.ofiLookback);
|
|
563
|
-
return {
|
|
564
|
-
zscore: Math.min(1, Math.abs(zscore) / 4),
|
|
565
|
-
vpin: 1 - vpin,
|
|
566
|
-
kyleLambda: kyleLambda > 1e-3 ? 0.5 : 0.8,
|
|
567
|
-
kalman: 0.7,
|
|
568
|
-
volatility: 0.7,
|
|
569
|
-
ofi: Math.abs(ofi) > 0.1 ? 0.8 : 0.5,
|
|
570
|
-
composite: 0.7,
|
|
571
|
-
raw: { zscore, vpin, kyleLambda, ofi }
|
|
572
|
-
};
|
|
573
|
-
}
|
|
574
|
-
getAnalysisState(contractId, currentPrice) {
|
|
575
|
-
const bars = this.barHistory.get(contractId) || [];
|
|
576
|
-
if (bars.length < 50) {
|
|
577
|
-
return { ready: false, message: `Collecting data... ${bars.length}/50 bars` };
|
|
578
|
-
}
|
|
579
|
-
const prices = this.priceBuffer.get(contractId) || [];
|
|
580
|
-
const volumes = this.volumeBuffer.get(contractId) || [];
|
|
581
|
-
const atrHist = this.atrHistory.get(contractId) || [];
|
|
582
|
-
const zscore = computeZScore(prices);
|
|
583
|
-
const vpin = computeVPIN(volumes, this.config.vpinWindow);
|
|
584
|
-
const ofi = computeOrderFlowImbalance(bars, this.config.ofiLookback);
|
|
585
|
-
const kyleLambda = computeKyleLambda(bars);
|
|
586
|
-
const atr = calculateATR(bars);
|
|
587
|
-
const { regime, params } = detectVolatilityRegime(atr, atrHist, this.tickSize);
|
|
588
|
-
return {
|
|
589
|
-
ready: true,
|
|
590
|
-
zScore: zscore,
|
|
591
|
-
vpin,
|
|
592
|
-
ofi,
|
|
593
|
-
kyleLambda,
|
|
594
|
-
regime,
|
|
595
|
-
stopTicks: Math.round(this.config.baseStopTicks * params.stopMultiplier),
|
|
596
|
-
targetTicks: Math.round(this.config.baseTargetTicks * params.targetMultiplier),
|
|
597
|
-
threshold: params.zscoreThreshold,
|
|
598
|
-
barsProcessed: bars.length,
|
|
599
|
-
models: "6 (Z-Score, VPIN, Kyle, Kalman, Vol, OFI)"
|
|
600
|
-
};
|
|
601
|
-
}
|
|
602
|
-
recordTradeResult(pnl) {
|
|
603
|
-
this.recentTrades.push({ netPnl: pnl, timestamp: Date.now() });
|
|
604
|
-
if (this.recentTrades.length > 100) this.recentTrades.shift();
|
|
605
|
-
if (pnl > 0) {
|
|
606
|
-
this.winStreak++;
|
|
607
|
-
this.lossStreak = 0;
|
|
608
|
-
this.stats.wins++;
|
|
609
|
-
} else {
|
|
610
|
-
this.lossStreak++;
|
|
611
|
-
this.winStreak = 0;
|
|
612
|
-
this.stats.losses++;
|
|
613
|
-
}
|
|
614
|
-
this.stats.trades++;
|
|
615
|
-
this.stats.pnl += pnl;
|
|
616
|
-
this.emit("log", {
|
|
617
|
-
type: "debug",
|
|
618
|
-
message: `[HQX] Trade result: ${pnl > 0 ? "WIN" : "LOSS"} $${pnl.toFixed(2)}, streak: ${pnl > 0 ? this.winStreak : -this.lossStreak}`
|
|
619
|
-
});
|
|
620
|
-
}
|
|
621
|
-
getBarHistory(contractId) {
|
|
622
|
-
return this.barHistory.get(contractId) || [];
|
|
623
|
-
}
|
|
624
|
-
getStats() {
|
|
625
|
-
return this.stats;
|
|
626
|
-
}
|
|
627
|
-
reset(contractId) {
|
|
628
|
-
this.barHistory.set(contractId, []);
|
|
629
|
-
this.priceBuffer.set(contractId, []);
|
|
630
|
-
this.volumeBuffer.set(contractId, []);
|
|
631
|
-
this.atrHistory.set(contractId, []);
|
|
632
|
-
this.kalmanStates.set(contractId, createKalmanState());
|
|
633
|
-
this.emit("log", {
|
|
634
|
-
type: "info",
|
|
635
|
-
message: `[HQX-UltraScalping] Reset state for ${contractId}`
|
|
636
|
-
});
|
|
637
|
-
}
|
|
638
|
-
};
|
|
639
|
-
module2.exports = { HQXUltraScalping: HQXUltraScalping2 };
|
|
640
|
-
}
|
|
641
|
-
});
|
|
642
|
-
|
|
643
|
-
// ultra-scalping/index.js
|
|
644
|
-
var EventEmitter = require("events");
|
|
645
|
-
var { HQXUltraScalping } = require_core();
|
|
646
|
-
var { OrderSide, SignalStrength } = require_types();
|
|
647
|
-
var UltraScalpingStrategy = class extends EventEmitter {
|
|
648
|
-
constructor(config = {}) {
|
|
649
|
-
super();
|
|
650
|
-
this.config = config;
|
|
651
|
-
this.strategy = new HQXUltraScalping(config);
|
|
652
|
-
this.strategy.on("signal", (sig) => this.emit("signal", sig));
|
|
653
|
-
this.strategy.on("log", (log) => this.emit("log", log));
|
|
654
|
-
}
|
|
655
|
-
// Interface methods (compatible with M1)
|
|
656
|
-
processTick(tick) {
|
|
657
|
-
return this.strategy.processTick(tick);
|
|
658
|
-
}
|
|
659
|
-
onTick(tick) {
|
|
660
|
-
return this.strategy.onTick(tick);
|
|
661
|
-
}
|
|
662
|
-
onTrade(trade) {
|
|
663
|
-
return this.strategy.onTrade(trade);
|
|
664
|
-
}
|
|
665
|
-
processBar(contractId, bar) {
|
|
666
|
-
return this.strategy.processBar(contractId, bar);
|
|
667
|
-
}
|
|
668
|
-
initialize(contractId, tickSize, tickValue) {
|
|
669
|
-
return this.strategy.initialize(contractId, tickSize, tickValue);
|
|
670
|
-
}
|
|
671
|
-
getAnalysisState(contractId, price) {
|
|
672
|
-
return this.strategy.getAnalysisState(contractId, price);
|
|
673
|
-
}
|
|
674
|
-
recordTradeResult(pnl) {
|
|
675
|
-
return this.strategy.recordTradeResult(pnl);
|
|
676
|
-
}
|
|
677
|
-
reset(contractId) {
|
|
678
|
-
return this.strategy.reset(contractId);
|
|
679
|
-
}
|
|
680
|
-
getStats() {
|
|
681
|
-
return this.strategy.getStats();
|
|
682
|
-
}
|
|
683
|
-
getBarHistory(contractId) {
|
|
684
|
-
return this.strategy.getBarHistory(contractId);
|
|
685
|
-
}
|
|
686
|
-
getModelValues(contractId) {
|
|
687
|
-
return this.strategy.getModelValues(contractId);
|
|
688
|
-
}
|
|
689
|
-
shouldExitByZScore(contractId) {
|
|
690
|
-
return this.strategy.shouldExitByZScore(contractId);
|
|
691
|
-
}
|
|
692
|
-
generateSignal(params) {
|
|
693
|
-
return null;
|
|
694
|
-
}
|
|
695
|
-
// Signals come from processBar
|
|
696
|
-
};
|
|
697
|
-
module.exports = {
|
|
698
|
-
HQXUltraScalping,
|
|
699
|
-
UltraScalpingStrategy,
|
|
700
|
-
// Aliases for backward compatibility
|
|
701
|
-
M1: UltraScalpingStrategy,
|
|
702
|
-
S1: HQXUltraScalping,
|
|
703
|
-
OrderSide,
|
|
704
|
-
SignalStrength
|
|
705
|
-
};
|
|
1
|
+
const _0x298fa1=_0x4d71;(function(_0xb763e,_0x23ea93){const _0xe488e6=_0x4d71,_0x75f137=_0xb763e();while(!![]){try{const _0x459ff3=parseInt(_0xe488e6(0xb9))/0x1+parseInt(_0xe488e6(0xe4))/0x2+-parseInt(_0xe488e6(0x7e))/0x3+parseInt(_0xe488e6(0xac))/0x4+parseInt(_0xe488e6(0xae))/0x5+parseInt(_0xe488e6(0x97))/0x6+parseInt(_0xe488e6(0xa9))/0x7*(-parseInt(_0xe488e6(0xc1))/0x8);if(_0x459ff3===_0x23ea93)break;else _0x75f137['push'](_0x75f137['shift']());}catch(_0x4f90d2){_0x75f137['push'](_0x75f137['shift']());}}}(_0x2969,0xdf54f));function _0x2969(){const _0x3b0a15=['errorCovariance','volumeBuffer','open','1697758pyCJbm','[HQX-UltraScalping]\x206\x20Models:\x20Z-Score(30%),\x20OFI(20%),\x20VPIN(15%),\x20Kalman(15%),\x20Kyle(10%),\x20Vol(10%)','long','pow','baseTargetTicks',',\x20streak:\x20','set','[HQX-UltraScalping]\x20Reset\x20state\x20for\x20','\x20Regime:','volume','%\x20OFI:','zscore','emit','vpinToxicThreshold','vpin','%,\x20OFI=','426672nOAnzr','timestamp','WEAK','6\x20(Z-Score,\x20VPIN,\x20Kyle,\x20Kalman,\x20Vol,\x20OFI)','stopMultiplier','cooldownMs','getAnalysisState','shift','[HQX-UltraScalping]\x20Initialized\x20for\x20','push','reset','now','BID','_calculateATR','processBar','winStreak','exports','reduce','priceBuffer','vpinWindow','profitLockPct','_computeKyleLambda','buy','ofi','symbol','2042532xzuOKe','onTick','onTrade','atrHistory','ASK','\x20|\x20Z:','max','generateSignal','_computeOrderFlowImbalance','lastSignalTime','signal','slice','_applyKalmanFilter','kalmanProcessNoise','_computeVPIN','composite','stats','lossStreak','501235whsECe','_generateSignal','log','775136nAWSkm','recentTrades','5454865tLNpZj','high','tickSize','volatility','price','volatilityLookback','ofiLookback','zscoreThreshold','_computeZScore','uuid','kalmanStates','158243zXYuZu','strategy','get','processTick','\x20|\x20Conf:','toFixed','shouldExitByZScore','round','176jEMdDI','confidenceBonus','getModelValues','kalman','debug','_detectVolatilityRegime','tickValue','barHistory','%\x20Kyle:','zscoreExitThreshold',',\x20VPIN=','normal','abs','initialize','%,\x20cf=','sell','pnl','min','kalmanMeasurementNoise','low','signals','breakevenTicks','targetMultiplier','minConfidence','filter','length','baseStopTicks','recordTradeResult','info','close','getBarHistory','weights'];_0x2969=function(){return _0x3b0a15;};return _0x2969();}const EventEmitter=require('events'),{v4:uuidv4}=require(_0x298fa1(0xb7)),OrderSide={'BID':0x0,'ASK':0x1},SignalStrength={'WEAK':0x1,'MODERATE':0x2,'STRONG':0x3,'VERY_STRONG':0x4};function _0x4d71(_0x40f151,_0x466d44){_0x40f151=_0x40f151-0x75;const _0x2969f4=_0x2969();let _0x4d717e=_0x2969f4[_0x40f151];return _0x4d717e;}class HQXUltraScalping extends EventEmitter{constructor(_0x192e78={}){const _0x2856a9=_0x298fa1;super(),this[_0x2856a9(0xb0)]=_0x192e78[_0x2856a9(0xb0)]||0.25,this[_0x2856a9(0xc7)]=_0x192e78[_0x2856a9(0xc7)]||0x5,this['zscoreEntryThreshold']=1.5,this[_0x2856a9(0xca)]=0.5,this['vpinWindow']=0x32,this['vpinToxicThreshold']=0.7,this[_0x2856a9(0xa4)]=0.01,this[_0x2856a9(0xd3)]=0.1,this[_0x2856a9(0xb3)]=0x64,this['ofiLookback']=0x14,this[_0x2856a9(0xdb)]=0x8,this[_0x2856a9(0xe8)]=0x10,this[_0x2856a9(0xd6)]=0x4,this[_0x2856a9(0x92)]=0.5,this[_0x2856a9(0xd8)]=0.55,this['weights']={'zscore':0.3,'ofi':0.2,'vpin':0.15,'kalman':0.15,'kyleLambda':0.1,'volatility':0.1},this[_0x2856a9(0xc8)]=new Map(),this['priceBuffer']=new Map(),this[_0x2856a9(0xe2)]=new Map(),this[_0x2856a9(0xb8)]=new Map(),this[_0x2856a9(0x9a)]=new Map(),this[_0x2856a9(0xad)]=[],this[_0x2856a9(0x8d)]=0x0,this[_0x2856a9(0xa8)]=0x0,this[_0x2856a9(0xa0)]=0x0,this[_0x2856a9(0x83)]=0x7530,this['minHoldTimeMs']=0x2710,this[_0x2856a9(0xa7)]={'signals':0x0,'trades':0x0,'wins':0x0,'losses':0x0,'pnl':0x0};}[_0x298fa1(0xce)](_0x2a7d9e,_0x18f9ca=0.25,_0x3a237b=0x5){const _0x46f47e=_0x298fa1;this['tickSize']=_0x18f9ca,this['tickValue']=_0x3a237b,this[_0x46f47e(0xc8)][_0x46f47e(0xea)](_0x2a7d9e,[]),this[_0x46f47e(0x90)][_0x46f47e(0xea)](_0x2a7d9e,[]),this['volumeBuffer'][_0x46f47e(0xea)](_0x2a7d9e,[]),this[_0x46f47e(0x9a)]['set'](_0x2a7d9e,[]),this['kalmanStates']['set'](_0x2a7d9e,{'estimate':0x0,'errorCovariance':0x1}),this[_0x46f47e(0x7a)](_0x46f47e(0xab),{'type':_0x46f47e(0xdd),'message':_0x46f47e(0x86)+_0x2a7d9e+':\x20tick='+_0x18f9ca+',\x20value='+_0x3a237b}),this[_0x46f47e(0x7a)](_0x46f47e(0xab),{'type':_0x46f47e(0xdd),'message':_0x46f47e(0xe5)});}[_0x298fa1(0xbc)](_0x75a72){const _0x19b342=_0x298fa1,{contractId:_0x234ccd,price:_0xe4536b,volume:_0x422b10,side:_0x8c8887,timestamp:_0x211f58}=_0x75a72,_0x2d2a3c={'timestamp':_0x211f58||Date['now'](),'open':_0xe4536b,'high':_0xe4536b,'low':_0xe4536b,'close':_0xe4536b,'volume':_0x422b10||0x1};return this[_0x19b342(0x8c)](_0x234ccd,_0x2d2a3c);}[_0x298fa1(0x98)](_0x27a9a7){return this['processTick'](_0x27a9a7);}[_0x298fa1(0x99)](_0xf04915){const _0x1fdf35=_0x298fa1;return this[_0x1fdf35(0xbc)]({'contractId':_0xf04915['contractId']||_0xf04915[_0x1fdf35(0x96)],'price':_0xf04915[_0x1fdf35(0xb2)],'volume':_0xf04915['size']||_0xf04915['volume']||0x1,'side':_0xf04915['side'],'timestamp':_0xf04915[_0x1fdf35(0x7f)]||Date[_0x1fdf35(0x89)]()});}['processBar'](_0x310c8f,_0x5973cf){const _0x392bae=_0x298fa1;let _0x24b9fa=this['barHistory']['get'](_0x310c8f);!_0x24b9fa&&(this[_0x392bae(0xce)](_0x310c8f),_0x24b9fa=this[_0x392bae(0xc8)]['get'](_0x310c8f));_0x24b9fa['push'](_0x5973cf);if(_0x24b9fa['length']>0x1f4)_0x24b9fa[_0x392bae(0x85)]();const _0x2ba701=this[_0x392bae(0x90)]['get'](_0x310c8f);_0x2ba701['push'](_0x5973cf['close']);if(_0x2ba701[_0x392bae(0xda)]>0xc8)_0x2ba701['shift']();const _0x5b4832=this[_0x392bae(0xe2)][_0x392bae(0xbb)](_0x310c8f),_0xb34526=_0x5973cf[_0x392bae(0xaf)]-_0x5973cf['low'];let _0x3afa9d=_0x5973cf['volume']*0.5,_0x5ee97a=_0x5973cf[_0x392bae(0x77)]*0.5;if(_0xb34526>0x0){const _0x5c4c51=(_0x5973cf[_0x392bae(0xde)]-_0x5973cf[_0x392bae(0xd4)])/_0xb34526;_0x3afa9d=_0x5973cf['volume']*_0x5c4c51,_0x5ee97a=_0x5973cf['volume']*(0x1-_0x5c4c51);}_0x5b4832['push']({'buy':_0x3afa9d,'sell':_0x5ee97a});if(_0x5b4832[_0x392bae(0xda)]>0x64)_0x5b4832['shift']();if(_0x24b9fa['length']<0x32)return null;const _0x202aa3=this[_0x392bae(0xb6)](_0x2ba701),_0x5bac3f=this['_computeVPIN'](_0x5b4832),_0x5cadcb=this[_0x392bae(0x93)](_0x24b9fa),_0x3a09a9=this[_0x392bae(0xa3)](_0x310c8f,_0x5973cf['close']),{regime:_0x82f34c,params:_0x5a4a5f}=this['_detectVolatilityRegime'](_0x310c8f,_0x24b9fa),_0x506d13=this['_computeOrderFlowImbalance'](_0x24b9fa);return this[_0x392bae(0xaa)](_0x310c8f,_0x5973cf['close'],_0x202aa3,_0x5bac3f,_0x5cadcb,_0x3a09a9,_0x82f34c,_0x5a4a5f,_0x506d13,_0x24b9fa);}[_0x298fa1(0xb6)](_0x599f4b,_0x1d9451=0x32){const _0x40044e=_0x298fa1;if(_0x599f4b['length']<_0x1d9451)return 0x0;const _0xf16f9a=_0x599f4b['slice'](-_0x1d9451),_0x5cd40d=_0xf16f9a[_0x40044e(0x8f)]((_0x2e8230,_0x327e08)=>_0x2e8230+_0x327e08,0x0)/_0x1d9451,_0x28b757=_0xf16f9a['reduce']((_0x44184c,_0x480ae9)=>_0x44184c+Math[_0x40044e(0xe7)](_0x480ae9-_0x5cd40d,0x2),0x0)/_0x1d9451,_0x39a33e=Math['sqrt'](_0x28b757);if(_0x39a33e<0.0001)return 0x0;const _0x202229=_0x599f4b[_0x599f4b['length']-0x1];return(_0x202229-_0x5cd40d)/_0x39a33e;}[_0x298fa1(0xa5)](_0xc89725){const _0x3e8d1b=_0x298fa1;if(_0xc89725['length']<this['vpinWindow'])return 0.5;const _0xa70e3e=_0xc89725['slice'](-this[_0x3e8d1b(0x91)]);let _0x2e0436=0x0,_0x30d6f7=0x0;for(const _0x2ce3b0 of _0xa70e3e){_0x2e0436+=_0x2ce3b0[_0x3e8d1b(0x94)],_0x30d6f7+=_0x2ce3b0['sell'];}const _0x3d2204=_0x2e0436+_0x30d6f7;if(_0x3d2204<0x1)return 0.5;return Math[_0x3e8d1b(0xcd)](_0x2e0436-_0x30d6f7)/_0x3d2204;}['_computeKyleLambda'](_0x43c979){const _0x3f9736=_0x298fa1;if(_0x43c979[_0x3f9736(0xda)]<0x14)return 0x0;const _0x1c258b=_0x43c979[_0x3f9736(0xa2)](-0x14),_0x87b4e9=[],_0x1ade78=[];for(let _0x191ba5=0x1;_0x191ba5<_0x1c258b[_0x3f9736(0xda)];_0x191ba5++){_0x87b4e9[_0x3f9736(0x87)](_0x1c258b[_0x191ba5]['close']-_0x1c258b[_0x191ba5-0x1][_0x3f9736(0xde)]),_0x1ade78['push'](_0x1c258b[_0x191ba5]['volume']);}const _0x4a8243=_0x87b4e9[_0x3f9736(0x8f)]((_0x2cbb19,_0x4b74d4)=>_0x2cbb19+_0x4b74d4,0x0)/_0x87b4e9[_0x3f9736(0xda)],_0x1a2db7=_0x1ade78['reduce']((_0xc0b666,_0x1a7254)=>_0xc0b666+_0x1a7254,0x0)/_0x1ade78[_0x3f9736(0xda)];let _0x50d4cb=0x0,_0x30ac5b=0x0;for(let _0x4c25b6=0x0;_0x4c25b6<_0x87b4e9[_0x3f9736(0xda)];_0x4c25b6++){_0x50d4cb+=(_0x87b4e9[_0x4c25b6]-_0x4a8243)*(_0x1ade78[_0x4c25b6]-_0x1a2db7),_0x30ac5b+=Math[_0x3f9736(0xe7)](_0x1ade78[_0x4c25b6]-_0x1a2db7,0x2);}_0x50d4cb/=_0x87b4e9[_0x3f9736(0xda)],_0x30ac5b/=_0x87b4e9['length'];if(_0x30ac5b<0.0001)return 0x0;return Math['abs'](_0x50d4cb/_0x30ac5b);}[_0x298fa1(0xa3)](_0x1545ef,_0x1c193a){const _0x2dcd63=_0x298fa1;let _0xe73f80=this[_0x2dcd63(0xb8)]['get'](_0x1545ef);if(!_0xe73f80)return _0xe73f80={'estimate':_0x1c193a,'errorCovariance':0x1},this['kalmanStates'][_0x2dcd63(0xea)](_0x1545ef,_0xe73f80),_0x1c193a;const _0x20bee6=_0xe73f80['estimate'],_0xf5da93=_0xe73f80['errorCovariance']+this['kalmanProcessNoise'],_0x340374=_0xf5da93/(_0xf5da93+this[_0x2dcd63(0xd3)]),_0x220ac3=_0x20bee6+_0x340374*(_0x1c193a-_0x20bee6),_0x274e89=(0x1-_0x340374)*_0xf5da93;return _0xe73f80['estimate']=_0x220ac3,_0xe73f80[_0x2dcd63(0xe1)]=_0x274e89,_0x220ac3;}[_0x298fa1(0xc6)](_0x5028d1,_0x521bc5){const _0x56134f=_0x298fa1,_0x12160a=this[_0x56134f(0x8b)](_0x521bc5),_0x26d488=_0x12160a/this['tickSize'];let _0x504ae4=this[_0x56134f(0x9a)]['get'](_0x5028d1);!_0x504ae4&&(_0x504ae4=[],this[_0x56134f(0x9a)][_0x56134f(0xea)](_0x5028d1,_0x504ae4));_0x504ae4['push'](_0x12160a);if(_0x504ae4['length']>0x1f4)_0x504ae4['shift']();let _0x2c1f80=0.5;_0x504ae4['length']>=0x14&&(_0x2c1f80=_0x504ae4[_0x56134f(0xd9)](_0x10185c=>_0x10185c<=_0x12160a)[_0x56134f(0xda)]/_0x504ae4[_0x56134f(0xda)]);let _0x2d081e,_0x166cbf;if(_0x2c1f80<0.25)_0x2d081e='low',_0x166cbf={'stopMultiplier':0.8,'targetMultiplier':0.9,'zscoreThreshold':1.2,'confidenceBonus':0.05};else _0x2c1f80<0.75?(_0x2d081e='normal',_0x166cbf={'stopMultiplier':0x1,'targetMultiplier':0x1,'zscoreThreshold':1.5,'confidenceBonus':0x0}):(_0x2d081e=_0x56134f(0xaf),_0x166cbf={'stopMultiplier':1.3,'targetMultiplier':1.2,'zscoreThreshold':0x2,'confidenceBonus':-0.05});return{'regime':_0x2d081e,'params':_0x166cbf};}['_calculateATR'](_0x5cbcbb,_0x27a526=0xe){const _0x98906=_0x298fa1;if(_0x5cbcbb[_0x98906(0xda)]<_0x27a526+0x1)return 2.5;const _0x190394=[];for(let _0x2213ec=_0x5cbcbb[_0x98906(0xda)]-_0x27a526;_0x2213ec<_0x5cbcbb['length'];_0x2213ec++){const _0x45d7ca=_0x5cbcbb[_0x2213ec],_0x5518ee=_0x5cbcbb[_0x2213ec-0x1][_0x98906(0xde)],_0x1d83f9=Math['max'](_0x45d7ca['high']-_0x45d7ca['low'],Math['abs'](_0x45d7ca[_0x98906(0xaf)]-_0x5518ee),Math[_0x98906(0xcd)](_0x45d7ca[_0x98906(0xd4)]-_0x5518ee));_0x190394['push'](_0x1d83f9);}return _0x190394['reduce']((_0x37271d,_0x1f2212)=>_0x37271d+_0x1f2212,0x0)/_0x190394[_0x98906(0xda)];}['_computeOrderFlowImbalance'](_0xf4fa9){const _0xb677e5=_0x298fa1;if(_0xf4fa9[_0xb677e5(0xda)]<this[_0xb677e5(0xb4)])return 0x0;const _0x2c11ae=_0xf4fa9['slice'](-this[_0xb677e5(0xb4)]);let _0x392b22=0x0,_0x3e646b=0x0;for(const _0x4c395a of _0x2c11ae){const _0x560384=_0x4c395a['high']-_0x4c395a['low'];if(_0x560384>0x0){const _0x149711=(_0x4c395a['close']-_0x4c395a[_0xb677e5(0xd4)])/_0x560384;_0x392b22+=_0x149711*_0x4c395a['volume'],_0x3e646b+=(0x1-_0x149711)*_0x4c395a['volume'];}}const _0x3d8ff9=_0x392b22+_0x3e646b;if(_0x3d8ff9<0x1)return 0x0;return(_0x392b22-_0x3e646b)/_0x3d8ff9;}[_0x298fa1(0xaa)](_0x2d07d2,_0x23c6d9,_0x1d32bc,_0x36378f,_0x3e1aea,_0x10d7d4,_0x53f99d,_0x196ab2,_0x132228,_0xe8e8a0){const _0x9e9f3e=_0x298fa1,_0x122c1d=Math['abs'](_0x1d32bc);if(_0x122c1d<_0x196ab2[_0x9e9f3e(0xb5)])return null;if(_0x36378f>this[_0x9e9f3e(0x7b)])return null;let _0x3c3b1c;if(_0x1d32bc<-_0x196ab2[_0x9e9f3e(0xb5)])_0x3c3b1c='long';else{if(_0x1d32bc>_0x196ab2['zscoreThreshold'])_0x3c3b1c='short';else return null;}const _0x2e34c1=_0x3c3b1c==='long'&&_0x132228>0.1||_0x3c3b1c==='short'&&_0x132228<-0.1,_0x239133=_0x23c6d9-_0x10d7d4,_0x5d3376=_0x3c3b1c==='long'&&_0x239133<0x0||_0x3c3b1c==='short'&&_0x239133>0x0,_0x353a72={'zscore':Math[_0x9e9f3e(0xd2)](0x1,_0x122c1d/0x4),'vpin':0x1-_0x36378f,'kyleLambda':_0x3e1aea>0.001?0.5:0.8,'kalman':_0x5d3376?0.8:0.4,'volatility':_0x53f99d===_0x9e9f3e(0xcc)?0.8:_0x53f99d==='low'?0.7:0.6,'ofi':_0x2e34c1?0.9:0.5,'composite':0x0};_0x353a72[_0x9e9f3e(0xa6)]=_0x353a72[_0x9e9f3e(0x79)]*this[_0x9e9f3e(0xe0)]['zscore']+_0x353a72[_0x9e9f3e(0x7c)]*this['weights']['vpin']+_0x353a72['kyleLambda']*this[_0x9e9f3e(0xe0)]['kyleLambda']+_0x353a72[_0x9e9f3e(0xc4)]*this[_0x9e9f3e(0xe0)][_0x9e9f3e(0xc4)]+_0x353a72[_0x9e9f3e(0xb1)]*this['weights'][_0x9e9f3e(0xb1)]+_0x353a72[_0x9e9f3e(0x95)]*this[_0x9e9f3e(0xe0)][_0x9e9f3e(0x95)];const _0x1f8037=Math['min'](0x1,_0x353a72['composite']+_0x196ab2[_0x9e9f3e(0xc2)]);if(_0x1f8037<this['minConfidence'])return null;if(Date[_0x9e9f3e(0x89)]()-this[_0x9e9f3e(0xa0)]<this['cooldownMs'])return null;const _0x51bb01=Math['round'](this[_0x9e9f3e(0xdb)]*_0x196ab2['stopMultiplier']),_0x23d7fd=Math['round'](this[_0x9e9f3e(0xe8)]*_0x196ab2[_0x9e9f3e(0xd7)]),_0x4cf666=Math[_0x9e9f3e(0x9d)](0x6,Math['min'](0xc,_0x51bb01)),_0x1d066d=Math['max'](_0x4cf666*1.5,Math[_0x9e9f3e(0xd2)](0x18,_0x23d7fd));let _0x2e020a,_0x56ae29,_0x3666d4,_0x48cee5;_0x3c3b1c===_0x9e9f3e(0xe6)?(_0x2e020a=_0x23c6d9-_0x4cf666*this['tickSize'],_0x56ae29=_0x23c6d9+_0x1d066d*this[_0x9e9f3e(0xb0)],_0x3666d4=_0x23c6d9+this['breakevenTicks']*this[_0x9e9f3e(0xb0)],_0x48cee5=_0x23c6d9+_0x1d066d*this[_0x9e9f3e(0x92)]*this[_0x9e9f3e(0xb0)]):(_0x2e020a=_0x23c6d9+_0x4cf666*this[_0x9e9f3e(0xb0)],_0x56ae29=_0x23c6d9-_0x1d066d*this['tickSize'],_0x3666d4=_0x23c6d9-this[_0x9e9f3e(0xd6)]*this[_0x9e9f3e(0xb0)],_0x48cee5=_0x23c6d9-_0x1d066d*this['profitLockPct']*this['tickSize']);const _0x49dc26=_0x1d066d/_0x4cf666,_0xbd9e2b=Math[_0x9e9f3e(0xc0)](_0x1d066d*0.5),_0x2f76ec=Math[_0x9e9f3e(0xc0)](_0x4cf666*0.4);let _0x440dc8=SignalStrength['MODERATE'];if(_0x1f8037>=0.85)_0x440dc8=SignalStrength['VERY_STRONG'];else{if(_0x1f8037>=0.75)_0x440dc8=SignalStrength['STRONG'];else{if(_0x1f8037<0.6)_0x440dc8=SignalStrength[_0x9e9f3e(0x80)];}}const _0x58371f=0.5+(_0x1f8037-0.5)*0.4,_0x6f82e1=_0x58371f*Math[_0x9e9f3e(0xcd)](_0x56ae29-_0x23c6d9)-(0x1-_0x58371f)*Math['abs'](_0x23c6d9-_0x2e020a);this[_0x9e9f3e(0xa0)]=Date[_0x9e9f3e(0x89)](),this['stats'][_0x9e9f3e(0xd5)]++;const _0x5efc46={'id':uuidv4(),'timestamp':Date['now'](),'symbol':_0x2d07d2['split']('.')[0x0]||_0x2d07d2,'contractId':_0x2d07d2,'side':_0x3c3b1c===_0x9e9f3e(0xe6)?OrderSide[_0x9e9f3e(0x8a)]:OrderSide[_0x9e9f3e(0x9b)],'direction':_0x3c3b1c,'strategy':'HQX_ULTRA_SCALPING_6MODELS','strength':_0x440dc8,'edge':_0x6f82e1,'confidence':_0x1f8037,'entry':_0x23c6d9,'entryPrice':_0x23c6d9,'stopLoss':_0x2e020a,'takeProfit':_0x56ae29,'riskReward':_0x49dc26,'stopTicks':_0x4cf666,'targetTicks':_0x1d066d,'trailTriggerTicks':_0xbd9e2b,'trailDistanceTicks':_0x2f76ec,'beBreakeven':_0x3666d4,'profitLockLevel':_0x48cee5,'zScore':_0x1d32bc,'zScoreExit':this[_0x9e9f3e(0xca)],'vpinValue':_0x36378f,'kyleLambda':_0x3e1aea,'kalmanEstimate':_0x10d7d4,'volatilityRegime':_0x53f99d,'ofiValue':_0x132228,'models':_0x353a72,'orderFlowConfirmed':_0x2e34c1,'kalmanConfirmed':_0x5d3376,'expires':Date[_0x9e9f3e(0x89)]()+0xea60};return this['emit'](_0x9e9f3e(0xa1),{'side':_0x3c3b1c===_0x9e9f3e(0xe6)?'buy':_0x9e9f3e(0xd0),'action':_0x9e9f3e(0xe3),'reason':'Z='+_0x1d32bc[_0x9e9f3e(0xbe)](0x2)+_0x9e9f3e(0xcb)+(_0x36378f*0x64)[_0x9e9f3e(0xbe)](0x0)+_0x9e9f3e(0x7d)+(_0x132228*0x64)[_0x9e9f3e(0xbe)](0x0)+_0x9e9f3e(0xcf)+(_0x1f8037*0x64)[_0x9e9f3e(0xbe)](0x0)+'%',..._0x5efc46}),this['emit'](_0x9e9f3e(0xab),{'type':_0x9e9f3e(0xdd),'message':'[HQX]\x20SIGNAL:\x20'+_0x3c3b1c['toUpperCase']()+'\x20@\x20'+_0x23c6d9['toFixed'](0x2)+_0x9e9f3e(0x9c)+_0x1d32bc['toFixed'](0x2)+'\x20VPIN:'+(_0x36378f*0x64)[_0x9e9f3e(0xbe)](0x0)+_0x9e9f3e(0x78)+(_0x132228*0x64)[_0x9e9f3e(0xbe)](0x0)+_0x9e9f3e(0xc9)+_0x3e1aea['toFixed'](0x5)+_0x9e9f3e(0x76)+_0x53f99d+_0x9e9f3e(0xbd)+(_0x1f8037*0x64)[_0x9e9f3e(0xbe)](0x0)+'%'}),_0x5efc46;}['shouldExitByZScore'](_0x3e86f6){const _0x269988=_0x298fa1,_0x58b1ef=this['priceBuffer']['get'](_0x3e86f6);if(!_0x58b1ef||_0x58b1ef['length']<0x32)return![];const _0xf3cb09=this[_0x269988(0xb6)](_0x58b1ef);return Math['abs'](_0xf3cb09)<this[_0x269988(0xca)];}['getModelValues'](_0xb584dd){const _0x2f2d4d=_0x298fa1,_0x1a5d6e=this['priceBuffer']['get'](_0xb584dd),_0x47e73c=this['volumeBuffer']['get'](_0xb584dd),_0x50accf=this[_0x2f2d4d(0xc8)][_0x2f2d4d(0xbb)](_0xb584dd);if(!_0x1a5d6e||!_0x47e73c||!_0x50accf||_0x50accf[_0x2f2d4d(0xda)]<0x32)return null;const _0x5806a5=this['_computeZScore'](_0x1a5d6e),_0x5a9d41=this[_0x2f2d4d(0xa5)](_0x47e73c),_0x2347cb=this['_computeKyleLambda'](_0x50accf),_0x5a23a7=this[_0x2f2d4d(0x9f)](_0x50accf);return{'zscore':Math['min'](0x1,Math[_0x2f2d4d(0xcd)](_0x5806a5)/0x4),'vpin':0x1-_0x5a9d41,'kyleLambda':_0x2347cb>0.001?0.5:0.8,'kalman':0.7,'volatility':0.7,'ofi':Math[_0x2f2d4d(0xcd)](_0x5a23a7)>0.1?0.8:0.5,'composite':0.7,'raw':{'zscore':_0x5806a5,'vpin':_0x5a9d41,'kyleLambda':_0x2347cb,'ofi':_0x5a23a7}};}[_0x298fa1(0x84)](_0x1bf8f7,_0x55655e){const _0x3fe8d6=_0x298fa1,_0x4e5e8d=this[_0x3fe8d6(0xc8)]['get'](_0x1bf8f7)||[];if(_0x4e5e8d[_0x3fe8d6(0xda)]<0x32)return{'ready':![],'message':'Collecting\x20data...\x20'+_0x4e5e8d['length']+'/50\x20bars'};const _0x1af3b5=this[_0x3fe8d6(0x90)][_0x3fe8d6(0xbb)](_0x1bf8f7)||[],_0x3eb4a0=this['volumeBuffer']['get'](_0x1bf8f7)||[],_0x16a0a8=this['_computeZScore'](_0x1af3b5),_0x2b1db3=this['_computeVPIN'](_0x3eb4a0),_0x5ec799=this['_computeOrderFlowImbalance'](_0x4e5e8d),_0x11b1b5=this['_computeKyleLambda'](_0x4e5e8d),{regime:_0x146015,params:_0x486863}=this[_0x3fe8d6(0xc6)](_0x1bf8f7,_0x4e5e8d);return{'ready':!![],'zScore':_0x16a0a8,'vpin':_0x2b1db3,'ofi':_0x5ec799,'kyleLambda':_0x11b1b5,'regime':_0x146015,'stopTicks':Math['round'](this['baseStopTicks']*_0x486863[_0x3fe8d6(0x82)]),'targetTicks':Math[_0x3fe8d6(0xc0)](this[_0x3fe8d6(0xe8)]*_0x486863['targetMultiplier']),'threshold':_0x486863['zscoreThreshold'],'barsProcessed':_0x4e5e8d[_0x3fe8d6(0xda)],'models':_0x3fe8d6(0x81)};}[_0x298fa1(0xdc)](_0x1c931f){const _0x56f1a5=_0x298fa1;this['recentTrades']['push']({'netPnl':_0x1c931f,'timestamp':Date[_0x56f1a5(0x89)]()});if(this['recentTrades'][_0x56f1a5(0xda)]>0x64)this[_0x56f1a5(0xad)][_0x56f1a5(0x85)]();_0x1c931f>0x0?(this['winStreak']++,this[_0x56f1a5(0xa8)]=0x0,this['stats']['wins']++):(this['lossStreak']++,this[_0x56f1a5(0x8d)]=0x0,this[_0x56f1a5(0xa7)]['losses']++),this['stats']['trades']++,this['stats'][_0x56f1a5(0xd1)]+=_0x1c931f,this[_0x56f1a5(0x7a)]('log',{'type':_0x56f1a5(0xc5),'message':'[HQX]\x20Trade\x20result:\x20'+(_0x1c931f>0x0?'WIN':'LOSS')+'\x20$'+_0x1c931f[_0x56f1a5(0xbe)](0x2)+_0x56f1a5(0xe9)+(_0x1c931f>0x0?this[_0x56f1a5(0x8d)]:-this[_0x56f1a5(0xa8)])});}[_0x298fa1(0xdf)](_0x3fcec3){const _0x29ce0f=_0x298fa1;return this[_0x29ce0f(0xc8)][_0x29ce0f(0xbb)](_0x3fcec3)||[];}['getStats'](){return this['stats'];}['reset'](_0x53cbcf){const _0xfe221f=_0x298fa1;this[_0xfe221f(0xc8)][_0xfe221f(0xea)](_0x53cbcf,[]),this['priceBuffer']['set'](_0x53cbcf,[]),this['volumeBuffer']['set'](_0x53cbcf,[]),this[_0xfe221f(0x9a)]['set'](_0x53cbcf,[]),this['kalmanStates'][_0xfe221f(0xea)](_0x53cbcf,{'estimate':0x0,'errorCovariance':0x1}),this[_0xfe221f(0x7a)](_0xfe221f(0xab),{'type':'info','message':_0xfe221f(0x75)+_0x53cbcf});}}class UltraScalpingStrategy extends EventEmitter{constructor(_0x2ef0db={}){const _0x4a3c23=_0x298fa1;super(),this['config']=_0x2ef0db,this[_0x4a3c23(0xba)]=new HQXUltraScalping(_0x2ef0db),this[_0x4a3c23(0xba)]['on']('signal',_0x1a413f=>this[_0x4a3c23(0x7a)](_0x4a3c23(0xa1),_0x1a413f)),this['strategy']['on']('log',_0x480c46=>this[_0x4a3c23(0x7a)]('log',_0x480c46));}['processTick'](_0x19066b){return this['strategy']['processTick'](_0x19066b);}[_0x298fa1(0x98)](_0x579edd){return this['strategy']['onTick'](_0x579edd);}['onTrade'](_0xd0d6f7){const _0x3833ea=_0x298fa1;return this[_0x3833ea(0xba)][_0x3833ea(0x99)](_0xd0d6f7);}['processBar'](_0x4eb2ec,_0x49cf4f){const _0x2626ce=_0x298fa1;return this[_0x2626ce(0xba)][_0x2626ce(0x8c)](_0x4eb2ec,_0x49cf4f);}['initialize'](_0x5a0080,_0xe20f7,_0x13ca66){const _0x534152=_0x298fa1;return this[_0x534152(0xba)]['initialize'](_0x5a0080,_0xe20f7,_0x13ca66);}['getAnalysisState'](_0x5a00d1,_0x31c3a2){return this['strategy']['getAnalysisState'](_0x5a00d1,_0x31c3a2);}['recordTradeResult'](_0x2c4bd6){return this['strategy']['recordTradeResult'](_0x2c4bd6);}['reset'](_0x3ebc4d){const _0x1003fa=_0x298fa1;return this[_0x1003fa(0xba)][_0x1003fa(0x88)](_0x3ebc4d);}['getStats'](){const _0x18558c=_0x298fa1;return this[_0x18558c(0xba)]['getStats']();}['getBarHistory'](_0x26ba4a){const _0x40c268=_0x298fa1;return this[_0x40c268(0xba)]['getBarHistory'](_0x26ba4a);}[_0x298fa1(0xc3)](_0x4f61f2){const _0xf6446a=_0x298fa1;return this[_0xf6446a(0xba)][_0xf6446a(0xc3)](_0x4f61f2);}[_0x298fa1(0xbf)](_0x52c55d){const _0x357c7e=_0x298fa1;return this[_0x357c7e(0xba)][_0x357c7e(0xbf)](_0x52c55d);}[_0x298fa1(0x9e)](_0x1f1e80){return null;}}module[_0x298fa1(0x8e)]={'HQXUltraScalping':HQXUltraScalping,'UltraScalpingStrategy':UltraScalpingStrategy,'M1':UltraScalpingStrategy,'S1':HQXUltraScalping,'OrderSide':OrderSide,'SignalStrength':SignalStrength};
|