hedgequantx 2.9.124 → 2.9.125

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.124",
3
+ "version": "2.9.125",
4
4
  "description": "HedgeQuantX - Prop Futures Trading CLI",
5
5
  "main": "src/app.js",
6
6
  "bin": {
@@ -234,7 +234,9 @@ const executeAlgo = async ({ service, account, contract, config, strategy: strat
234
234
  let lastAsk = null;
235
235
  let ticksPerSecond = 0;
236
236
  let lastTickSecond = Math.floor(Date.now() / 1000);
237
- let lastLogSecond = 0;
237
+ let lastBiasLogSecond = 0;
238
+ let lastDebugLogSecond = 0;
239
+ let lastStateLogSecond = 0;
238
240
  let buyVolume = 0;
239
241
  let sellVolume = 0;
240
242
 
@@ -283,64 +285,66 @@ const executeAlgo = async ({ service, account, contract, config, strategy: strat
283
285
  }
284
286
 
285
287
  // Log tick count every 10 seconds to confirm data flow
286
- if (tickCount % 1000 === 0 || (currentSecond % 10 === 0 && currentSecond !== lastLogSecond)) {
288
+ if (currentSecond - lastDebugLogSecond >= 10) {
289
+ lastDebugLogSecond = currentSecond;
287
290
  const state = strategy.getAnalysisState?.(contractId, price);
288
291
  const bars = state?.barsProcessed || 0;
289
292
  ui.addLog('debug', `Ticks: ${tickCount} | Bars: ${bars} | Price: ${price?.toFixed(2)}`);
290
293
  }
291
294
 
292
295
  // === SMART LOGS - REDUCED FREQUENCY ===
293
- if (currentSecond !== lastLogSecond && tickCount > 1) {
294
- lastLogSecond = currentSecond;
296
+ // Log bias every 5 seconds
297
+ if (currentSecond - lastBiasLogSecond >= 5 && tickCount > 1) {
298
+ lastBiasLogSecond = currentSecond;
295
299
 
296
300
  const totalVol = buyVolume + sellVolume;
297
301
  const buyPressure = totalVol > 0 ? (buyVolume / totalVol) * 100 : 50;
298
302
  const delta = buyVolume - sellVolume;
299
303
 
300
304
  let bias = buyPressure > 55 ? 'LONG' : buyPressure < 45 ? 'SHORT' : 'FLAT';
301
- // Log bias every 5 seconds or when it changes
302
- if (bias !== lastBias || currentSecond % 5 === 0) {
303
- const biasLog = smartLogs.getMarketBiasLog(bias, delta, buyPressure);
304
- const biasType = bias === 'LONG' ? 'bullish' : bias === 'SHORT' ? 'bearish' : 'analysis';
305
- ui.addLog(biasType, `${biasLog.message} ${biasLog.details || ''}`);
306
- lastBias = bias;
307
- // Reset volume after logging
308
- buyVolume = 0;
309
- sellVolume = 0;
310
- }
311
-
312
- // Strategy state log every 30 seconds (reduced frequency)
313
- if (currentSecond % 30 === 0) {
314
- const state = strategy.getAnalysisState?.(contractId, price);
315
- if (state) {
316
- const bars = state.barsProcessed || 0;
317
- sessionLogger.state(state.activeZones || 0, state.swingsDetected || 0, bars, lastBias);
318
- if (!state.ready) {
319
- ui.addLog('system', `${state.message} (${bars} bars)`);
320
- } else {
321
- const resStr = state.nearestResistance ? state.nearestResistance.toFixed(2) : '--';
322
- const supStr = state.nearestSupport ? state.nearestSupport.toFixed(2) : '--';
323
-
324
- ui.addLog('analysis', `Zones: ${state.activeZones} | R: ${resStr} | S: ${supStr} | Swings: ${state.swingsDetected}`);
325
- if (price && state.nearestResistance) {
326
- const gapR = state.nearestResistance - price, ticksR = Math.abs(Math.round(gapR / tickSize));
327
- if (ticksR <= 50) ui.addLog('analysis', `PROX R: ${Math.abs(gapR).toFixed(2)} pts (${ticksR} ticks) | Sweep ABOVE then reject`);
328
- }
329
- if (price && state.nearestSupport) {
330
- const gapS = price - state.nearestSupport, ticksS = Math.abs(Math.round(gapS / tickSize));
331
- if (ticksS <= 50) ui.addLog('analysis', `PROX S: ${Math.abs(gapS).toFixed(2)} pts (${ticksS} ticks) | Sweep BELOW then reject`);
332
- }
333
- if (state.activeZones === 0) ui.addLog('risk', 'Building liquidity map...');
334
- else if (!state.nearestSupport && !state.nearestResistance) ui.addLog('risk', 'Zones outside range');
335
- else if (!state.nearestSupport) ui.addLog('analysis', 'Monitoring R for SHORT sweep');
336
- else if (!state.nearestResistance) ui.addLog('analysis', 'Monitoring S for LONG sweep');
337
- else ui.addLog('ready', 'Both zones active - awaiting sweep');
305
+ const biasLog = smartLogs.getMarketBiasLog(bias, delta, buyPressure);
306
+ const biasType = bias === 'LONG' ? 'bullish' : bias === 'SHORT' ? 'bearish' : 'analysis';
307
+ ui.addLog(biasType, `${biasLog.message} ${biasLog.details || ''}`);
308
+ lastBias = bias;
309
+ // Reset volume after logging to avoid accumulation
310
+ buyVolume = 0;
311
+ sellVolume = 0;
312
+ }
313
+
314
+ // Strategy state log every 30 seconds
315
+ if (currentSecond - lastStateLogSecond >= 30 && tickCount > 1) {
316
+ lastStateLogSecond = currentSecond;
317
+ const state = strategy.getAnalysisState?.(contractId, price);
318
+ if (state) {
319
+ const bars = state.barsProcessed || 0;
320
+ sessionLogger.state(state.activeZones || 0, state.swingsDetected || 0, bars, lastBias);
321
+ if (!state.ready) {
322
+ ui.addLog('system', `${state.message} (${bars} bars)`);
323
+ } else {
324
+ const resStr = state.nearestResistance ? state.nearestResistance.toFixed(2) : '--';
325
+ const supStr = state.nearestSupport ? state.nearestSupport.toFixed(2) : '--';
326
+
327
+ ui.addLog('analysis', `Zones: ${state.activeZones} | R: ${resStr} | S: ${supStr} | Swings: ${state.swingsDetected}`);
328
+ if (price && state.nearestResistance) {
329
+ const gapR = state.nearestResistance - price, ticksR = Math.abs(Math.round(gapR / tickSize));
330
+ if (ticksR <= 50) ui.addLog('analysis', `PROX R: ${Math.abs(gapR).toFixed(2)} pts (${ticksR} ticks) | Sweep ABOVE then reject`);
331
+ }
332
+ if (price && state.nearestSupport) {
333
+ const gapS = price - state.nearestSupport, ticksS = Math.abs(Math.round(gapS / tickSize));
334
+ if (ticksS <= 50) ui.addLog('analysis', `PROX S: ${Math.abs(gapS).toFixed(2)} pts (${ticksS} ticks) | Sweep BELOW then reject`);
338
335
  }
336
+ if (state.activeZones === 0) ui.addLog('risk', 'Building liquidity map...');
337
+ else if (!state.nearestSupport && !state.nearestResistance) ui.addLog('risk', 'Zones outside range');
338
+ else if (!state.nearestSupport) ui.addLog('analysis', 'Monitoring R for SHORT sweep');
339
+ else if (!state.nearestResistance) ui.addLog('analysis', 'Monitoring S for LONG sweep');
340
+ else ui.addLog('ready', 'Both zones active - awaiting sweep');
339
341
  }
340
342
  }
341
-
342
- // AI status every 60s
343
- if (currentSecond % 60 === 0 && supervisionEnabled && supervisionEngine) ui.addLog('analysis', `AI: ${supervisionEngine.getStatus().agents.map(a => a.name.split(' ')[0]).join(', ')}`);
343
+ }
344
+
345
+ // AI status every 60s
346
+ if (currentSecond % 60 === 0 && supervisionEnabled && supervisionEngine) {
347
+ ui.addLog('analysis', `AI: ${supervisionEngine.getStatus().agents.map(a => a.name.split(' ')[0]).join(', ')}`);
344
348
  }
345
349
 
346
350
  lastPrice = price;