critical: Fix 1-minute signal price logging - query Drift oracle directly

Problem:
- 1-minute signals logged wrong prices (4-55 vs actual 41-144 SOL)
- Pyth price cache empty for 1-minute signals
- Fallback to body.signalPrice (from n8n) contained pricePosition value
- signalPrice === pricePosition in every request (39.29 = 39.29)

Failed Attempts (5):
1. Added @ close to TradingView indicator (commit 212a36f)
2. Added signalPrice regex to n8n (commit 99a5223)
3. Fixed regex to avoid POS collision (commit ff402ed)
4. Added DEBUG logging to n8n (no output visible)
5. FINAL FIX: Query Drift oracle directly

Solution:
- Bypass Pyth cache and n8n signalPrice entirely
- Query Drift Protocol oracle directly for real-time price
- Lines 145-149 in execute/route.ts:
  * OLD: latestPrice?.price || body.signalPrice || 0
  * NEW: await driftService.getOraclePrice(marketConfig.driftMarketIndex)
- Drift oracle is source of truth (on-chain), no caching issues
- Added getMarketConfig import to resolve marketConfig

Impact:
- Logs will show actual SOL price ($141.XX) instead of indicator values ($24-55)
- Accurate price logging critical for REAL MONEY system P&L tracking
- BlockedSignal database records will have correct signalPrice values

Files Changed:
- app/api/trading/execute/route.ts (lines 11, 145-149)
  * Added getMarketConfig to imports
  * Replaced Pyth cache fallback with direct Drift oracle query
This commit is contained in:
mindesbunister
2025-11-27 12:48:37 +01:00
parent ff402ed4d2
commit d602744938
2 changed files with 6 additions and 5 deletions

View File

@@ -8,7 +8,7 @@
import { NextRequest, NextResponse } from 'next/server'
import { initializeDriftService } from '@/lib/drift/client'
import { openPosition, placeExitOrders, closePosition } from '@/lib/drift/orders'
import { normalizeTradingViewSymbol, getMinQualityScoreForDirection } from '@/config/trading'
import { normalizeTradingViewSymbol, getMinQualityScoreForDirection, getMarketConfig } from '@/config/trading'
import { getMergedConfig } from '@/config/trading'
import { getInitializedPositionManager, ActiveTrade } from '@/lib/trading/position-manager'
import { createTrade, updateTradeExit } from '@/lib/database/trades'
@@ -143,9 +143,10 @@ export async function POST(request: NextRequest): Promise<NextResponse<ExecuteTr
console.log(`📊 DATA COLLECTION: ${timeframe}min signal from ${driftSymbol}, saving for analysis (not executing)`)
// Get current price for entry tracking
const priceMonitor = getPythPriceMonitor()
const latestPrice = priceMonitor.getCachedPrice(driftSymbol)
const currentPrice = latestPrice?.price || body.signalPrice || 0
// CRITICAL FIX: Query Drift oracle directly instead of Pyth cache (cache might be stale for 1min signals)
const driftService = await initializeDriftService()
const marketConfig = getMarketConfig(driftSymbol)
const currentPrice = await driftService.getOraclePrice(marketConfig.driftMarketIndex)
// Save to BlockedSignal for cross-timeframe analysis
const { createBlockedSignal } = await import('@/lib/database/trades')