hedgequantx 2.9.205 → 2.9.207

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hedgequantx",
3
- "version": "2.9.205",
3
+ "version": "2.9.207",
4
4
  "description": "HedgeQuantX - Prop Futures Trading CLI",
5
5
  "main": "src/app.js",
6
6
  "bin": {
@@ -38,6 +38,11 @@ class SmartLogsEngine {
38
38
  this.counter = 0;
39
39
  this.lastState = null;
40
40
  this.lastLogTime = 0;
41
+ // QUANT-specific state tracking for event detection
42
+ this.lastZRegime = null; // 'extreme' | 'high' | 'building' | 'neutral'
43
+ this.lastBias = null; // 'bullish' | 'bearish' | 'neutral'
44
+ this.lastVpinToxic = false; // true if VPIN > 0.6
45
+ this.warmupLogged = false; // Track if we logged warmup milestones
41
46
  }
42
47
 
43
48
  setSymbol(s) { this.symbolCode = s; }
@@ -169,72 +174,88 @@ class SmartLogsEngine {
169
174
  const events = this._detectEvents(state, this.lastState);
170
175
  this.lastState = { ...state };
171
176
 
172
- // For QUANT strategy: ALWAYS use rich QUANT-specific smart-logs with metrics
177
+ // For QUANT strategy: EVENT-DRIVEN logs based on regime changes
178
+ // Only log when something SIGNIFICANT changes - no repetitive messages
173
179
  if (this.strategyId === 'ultra-scalping') {
174
- const timeSinceLastLog = now - this.lastLogTime;
180
+ const ticks = state.tickCount || state.bars || 0;
181
+ const absZ = Math.abs(zScore);
182
+ const vpinToxic = vpin > 0.6;
175
183
 
176
- // Log every 5 seconds with quant metrics
177
- if (timeSinceLastLog >= CONFIG.LOG_INTERVAL_SECONDS * 1000) {
178
- this.lastLogTime = now;
179
-
180
- // Still warming up - use building messages from QUANT pool
181
- if (state.bars < 50) {
182
- const d = { sym, ticks: state.bars || 0, price };
183
- return {
184
- type: 'system',
185
- message: QUANT.building(d),
186
- logToSession: this.counter % CONFIG.SESSION_LOG_INTERVAL === 0
187
- };
188
- }
189
-
190
- // Ready - use rich QUANT context messages
191
- // Determine market context from QUANT metrics
192
- // zScore: mean reversion indicator (-3 to +3)
193
- // vpin: toxicity 0-1 (higher = more informed trading)
194
- // ofi: order flow imbalance -1 to +1 (positive = buying pressure)
195
- const absZ = Math.abs(zScore);
196
- const ofiAbs = Math.abs(ofi);
197
- const zScoreAbs = absZ.toFixed(1);
198
- const vpinPct = (vpin * 100).toFixed(0);
199
- const ofiPct = (ofi > 0 ? '+' : '') + (ofi * 100).toFixed(0) + '%';
200
-
201
- // Build data object for QUANT message pools
202
- const d = {
203
- sym, price,
204
- zScore: zScore.toFixed(1),
205
- zScoreAbs,
206
- rawZScore: zScore,
207
- vpin: vpinPct,
208
- ofi: ofiPct,
209
- ticks: state.bars || 0
210
- };
211
-
212
- let logType = 'analysis';
213
- let message;
214
-
215
- if (absZ >= 2.0) {
216
- // Strong signal zone - use bull/bear messages
184
+ // Determine current regimes
185
+ const zRegime = absZ >= 2.0 ? 'extreme' : absZ >= 1.5 ? 'high' : absZ >= 1.0 ? 'building' : 'neutral';
186
+ const bias = ofi > 0.15 ? 'bullish' : ofi < -0.15 ? 'bearish' : 'neutral';
187
+
188
+ // Build data object for messages
189
+ const zScoreAbs = absZ.toFixed(1);
190
+ const vpinPct = (vpin * 100).toFixed(0);
191
+ const ofiPct = (ofi > 0 ? '+' : '') + (ofi * 100).toFixed(0) + '%';
192
+ const d = {
193
+ sym, price,
194
+ zScore: zScore.toFixed(1),
195
+ zScoreAbs,
196
+ rawZScore: zScore,
197
+ vpin: vpinPct,
198
+ ofi: ofiPct,
199
+ ticks
200
+ };
201
+
202
+ let event = null;
203
+ let logType = 'analysis';
204
+ let message = null;
205
+
206
+ // EVENT 1: Warmup milestone (only log once at 250 ticks)
207
+ if (ticks >= 250 && !this.warmupLogged) {
208
+ this.warmupLogged = true;
209
+ event = 'warmup_complete';
210
+ message = QUANT.init({ sym, ticks, bars: ticks, swings: 0, zones: 0 });
211
+ logType = 'system';
212
+ }
213
+ // EVENT 2: Z-Score regime change (neutral → building → high → extreme)
214
+ else if (this.lastZRegime !== null && zRegime !== this.lastZRegime) {
215
+ event = 'z_regime_change';
216
+ if (zRegime === 'extreme') {
217
217
  logType = 'signal';
218
218
  message = zScore < 0 ? QUANT.bull(d) : QUANT.bear(d);
219
- } else if (absZ >= 1.5) {
220
- // Approaching threshold - use ready messages
219
+ } else if (zRegime === 'high') {
221
220
  logType = 'signal';
222
221
  message = QUANT.ready(d);
223
- } else if (absZ >= 1.0 || ofiAbs >= 0.2) {
224
- // Building edge - use zones messages
222
+ } else if (zRegime === 'building') {
225
223
  message = QUANT.zones(d);
226
224
  } else {
227
- // Normal market - use neutral messages
228
225
  message = QUANT.neutral(d);
229
226
  }
230
-
227
+ }
228
+ // EVENT 3: Bias flip (bullish ↔ bearish)
229
+ else if (this.lastBias !== null && bias !== this.lastBias && bias !== 'neutral' && this.lastBias !== 'neutral') {
230
+ event = 'bias_flip';
231
+ message = QUANT.biasFlip({ sym, from: this.lastBias, to: bias, delta: delta });
232
+ }
233
+ // EVENT 4: VPIN toxicity change
234
+ else if (this.lastVpinToxic !== null && vpinToxic !== this.lastVpinToxic) {
235
+ event = 'vpin_change';
236
+ if (vpinToxic) {
237
+ message = `[${sym}] ${price} | VPIN toxic (${vpinPct}%) - informed flow detected, caution`;
238
+ logType = 'risk';
239
+ } else {
240
+ message = `[${sym}] ${price} | VPIN normalized (${vpinPct}%) - flow clean`;
241
+ }
242
+ }
243
+
244
+ // Update state tracking
245
+ this.lastZRegime = zRegime;
246
+ this.lastBias = bias;
247
+ this.lastVpinToxic = vpinToxic;
248
+
249
+ // Only return if we have an event
250
+ if (event && message) {
231
251
  return {
232
252
  type: logType,
233
253
  message,
234
- logToSession: this.counter % CONFIG.SESSION_LOG_INTERVAL === 0
254
+ logToSession: event === 'z_regime_change' || event === 'bias_flip'
235
255
  };
236
256
  }
237
- return null;
257
+
258
+ return null; // No event = silence
238
259
  }
239
260
 
240
261
  // HQX-2B strategy: event-based logging
@@ -255,6 +276,11 @@ class SmartLogsEngine {
255
276
  this.lastState = null;
256
277
  this.counter = 0;
257
278
  this.lastLogTime = 0;
279
+ // Reset QUANT tracking
280
+ this.lastZRegime = null;
281
+ this.lastBias = null;
282
+ this.lastVpinToxic = false;
283
+ this.warmupLogged = false;
258
284
  }
259
285
  }
260
286