Fix: Explicitly set Surreal record IDs to save history

This commit is contained in:
2026-03-15 20:11:28 -07:00
parent 9f0ff58118
commit 11339a0900

View File

@@ -96,8 +96,11 @@ export class PaperEngine {
return null; return null;
} }
// FIX: Pre-format the ID exactly as SurrealDB expects it to ensure perfect sync
const tradeId = `paper_positions:pt_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
const trade = { const trade = {
id: `pt_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`, id: tradeId,
strategy: signal.strategy, strategy: signal.strategy,
ticker: signal.ticker, ticker: signal.ticker,
side: signal.side.toLowerCase(), side: signal.side.toLowerCase(),
@@ -124,7 +127,8 @@ export class PaperEngine {
acct.openPositions.set(trade.ticker, list); acct.openPositions.set(trade.ticker, list);
try { try {
await db.create('paper_positions', trade); // Force SurrealDB to use our exact record link ID
await db.create(tradeId, trade);
await this._saveState(acct); await this._saveState(acct);
} catch (e) { } catch (e) {
console.error('[Paper] DB write error:', e.message); console.error('[Paper] DB write error:', e.message);
@@ -172,21 +176,21 @@ export class PaperEngine {
if (won) acct.wins++; if (won) acct.wins++;
else acct.losses++; else acct.losses++;
try {
// FIX: Use explicit record identifier for SurrealDB updates
const recordId = pos.id.includes(':') ? pos.id : `paper_positions:${pos.id}`; const recordId = pos.id.includes(':') ? pos.id : `paper_positions:${pos.id}`;
try {
const updated = await db.query( const updated = await db.query(
`UPDATE ${recordId} SET settled = true, result = $result, pnl = $pnl, settleTime = $settleTime`, `UPDATE ${recordId} SET settled = true, result = $result, pnl = $pnl, settleTime = $settleTime`,
{ result, pnl: pos.pnl, settleTime: pos.settleTime } { result, pnl: pos.pnl, settleTime: pos.settleTime }
); );
const rows = updated[0] || []; const rows = updated[0] || [];
if (rows.length === 0) { if (rows.length === 0) {
await db.create('paper_positions', { ...pos }); await db.create(recordId, { ...pos, id: recordId });
} }
} catch (e) { } catch (e) {
console.error('[Paper] Settle DB error:', e.message); console.error('[Paper] Settle DB error:', e.message);
try { try {
await db.create('paper_positions', { ...pos }); await db.create(recordId, { ...pos, id: recordId });
} catch (e2) { } catch (e2) {
console.error('[Paper] Settle DB fallback error:', e2.message); console.error('[Paper] Settle DB fallback error:', e2.message);
} }
@@ -217,9 +221,6 @@ export class PaperEngine {
return Array.from(tickers); return Array.from(tickers);
} }
/**
* Check unresolved tickers periodically for delayed Kalshi results
*/
async checkOrphans(getMarketFn) { async checkOrphans(getMarketFn) {
const orphanTickers = this.getOpenTickers(); const orphanTickers = this.getOpenTickers();
if (!orphanTickers.length) return { settled: [], expired: [] }; if (!orphanTickers.length) return { settled: [], expired: [] };
@@ -263,15 +264,16 @@ export class PaperEngine {
acct.totalPnL -= pos.cost; acct.totalPnL -= pos.cost;
acct.losses++; acct.losses++;
try {
const recordId = pos.id.includes(':') ? pos.id : `paper_positions:${pos.id}`; const recordId = pos.id.includes(':') ? pos.id : `paper_positions:${pos.id}`;
try {
const updated = await db.query( const updated = await db.query(
`UPDATE ${recordId} SET settled = true, result = $result, pnl = $pnl, settleTime = $settleTime`, `UPDATE ${recordId} SET settled = true, result = $result, pnl = $pnl, settleTime = $settleTime`,
{ result: 'expired', pnl: pos.pnl, settleTime: pos.settleTime } { result: 'expired', pnl: pos.pnl, settleTime: pos.settleTime }
); );
const rows = updated[0] || []; const rows = updated[0] || [];
if (rows.length === 0) { if (rows.length === 0) {
await db.create('paper_positions', { ...pos }); await db.create(recordId, { ...pos, id: recordId });
} }
} catch (e) { } catch (e) {
console.error('[Paper] Force-expire DB error:', e.message); console.error('[Paper] Force-expire DB error:', e.message);