From 1e04e0c5583026df5220413b0a65fffd7e033f7d Mon Sep 17 00:00:00 2001 From: multipleof4 Date: Sun, 15 Mar 2026 17:35:51 -0700 Subject: [PATCH] Fix: Settle orphans on startup, reset flag, norm result --- worker.js | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/worker.js b/worker.js index 7999b0b..1281f75 100644 --- a/worker.js +++ b/worker.js @@ -3,6 +3,7 @@ import { PaperEngine } from './lib/paper/engine.js'; import { MartingaleStrategy } from './lib/strategies/martingale.js'; import { MartingaleAlphaStrategy } from './lib/strategies/martingale-alpha.js'; import { ThresholdStrategy } from './lib/strategies/threshold.js'; +import { getMarket } from './lib/kalshi/rest.js'; import { db } from './lib/db.js'; import { notify } from './lib/notify.js'; import fs from 'fs'; @@ -31,6 +32,13 @@ async function main() { console.log(`[Worker] Loaded ${strategies.length} strategies: ${strategies.map((s) => s.name).join(', ')}`); + // Settle any orphaned positions from previous runs before starting + try { + await paper.settleOrphans(getMarket); + } catch (e) { + console.error('[Worker] Orphan settlement error:', e.message); + } + const tracker = new MarketTracker(); let latestMarketState = null; let heartbeatTimer = null; @@ -67,7 +75,7 @@ async function main() { for (const strategy of strategies) { if (!settledPositions) continue; for (const trade of settledPositions) { - strategy.onSettlement(result, trade); + strategy.onSettlement(trade.result, trade); } } @@ -88,6 +96,31 @@ async function main() { writeState(latestMarketState, paper, strategies); }, HEARTBEAT_MS); + // Check for reset flag periodically + setInterval(async () => { + try { + if (fs.existsSync('/tmp/kalbot-reset-flag')) { + fs.unlinkSync('/tmp/kalbot-reset-flag'); + console.log('[Worker] Reset flag detected — resetting all paper data'); + await paper.resetAll(); + for (const s of strategies) { + if (s.consecutiveLosses !== undefined) s.consecutiveLosses = 0; + if (s.currentBetSize !== undefined) s.currentBetSize = s.config.baseBet; + if (s.round !== undefined) s.round = 0; + if (s.cycleWins !== undefined) s.cycleWins = 0; + if (s.cycleLosses !== undefined) s.cycleLosses = 0; + if (s.totalCycles !== undefined) s.totalCycles = 0; + s.lastTradeTicker = null; + s.lastTradeTime = 0; + } + writeState(latestMarketState, paper, strategies); + await notify('🔄 Paper trading reset by admin', 'Kalbot Reset', 'default', 'recycle'); + } + } catch { + // ignore + } + }, 1000); + console.log('[Worker] Running. Press Ctrl+C to stop.'); const shutdown = async (signal) => {