🔧 CRITICAL FIX: Price Data Sync & Position Monitor Enhancement

Fixed major price data sync issues:
- Removed hardcoded price (77.63) from position monitor
- Added real-time oracle data instead of stale TWAP pricing
- Implemented cache-busting headers for fresh data
- Updated fallback prices to current market levels

- Real-time P&L tracking with trend indicators (📈📉➡️)
- Enhanced stop loss proximity alerts with color-coded risk levels
- Analysis progress indicators during automation cycles
- Performance metrics (runtime, cycles, trades, errors)
- Fresh data validation and improved error handling

- Price accuracy: 77.63 → 84.47 (matches Drift UI)
- P&L accuracy: -.91 → -.59 (correct calculation)
- Risk assessment: CRITICAL → MEDIUM (proper evaluation)
- Stop loss distance: 0.91% → 4.8% (safe distance)

- CLI monitor script with 8-second updates
- Web dashboard component (PositionMonitor.tsx)
- Real-time automation status tracking
- Database and error monitoring improvements

This fixes the automation showing false emergency alerts when
position was actually performing normally.
This commit is contained in:
mindesbunister
2025-07-25 23:33:06 +02:00
parent 08f9a9b541
commit 9b6a393e06
18 changed files with 6783 additions and 361 deletions

Binary file not shown.

View File

@@ -7,62 +7,92 @@ datasource db {
url = env("DATABASE_URL")
}
model User {
id String @id @default(cuid())
email String @unique
name String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
aiLearningData AILearningData[]
apiKeys ApiKey[]
automationSessions AutomationSession[]
trades Trade[]
journals TradingJournal[]
settings UserSettings?
@@map("users")
model ai_learning_data {
id String @id
userId String
sessionId String?
tradeId String?
analysisData Json
marketConditions Json
outcome String?
actualPrice Float?
predictedPrice Float?
confidenceScore Float?
accuracyScore Float?
timeframe String
symbol String
screenshot String?
feedbackData Json?
createdAt DateTime @default(now())
updatedAt DateTime
users users @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model ApiKey {
id String @id @default(cuid())
model api_keys {
id String @id
userId String
provider String
keyName String
encryptedKey String
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
updatedAt DateTime
users users @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([userId, provider, keyName])
@@map("api_keys")
}
model UserSettings {
id String @id @default(cuid())
userId String @unique
autoTrading Boolean @default(false)
tradingAmount Float @default(100)
riskPercentage Float @default(2)
maxDailyTrades Int @default(5)
enableNotifications Boolean @default(true)
automationMode String @default("SIMULATION")
autoTimeframe String @default("1h")
autoSymbol String @default("SOLUSD")
autoTradingEnabled Boolean @default(false)
autoAnalysisEnabled Boolean @default(false)
maxLeverage Float @default(3.0)
stopLossPercent Float @default(2.0)
takeProfitPercent Float @default(6.0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
model automation_sessions {
id String @id
userId String
status String @default("ACTIVE")
mode String @default("SIMULATION")
symbol String
timeframe String
totalTrades Int @default(0)
successfulTrades Int @default(0)
failedTrades Int @default(0)
totalPnL Float @default(0)
totalPnLPercent Float @default(0)
winRate Float @default(0)
avgRiskReward Float @default(0)
maxDrawdown Float @default(0)
startBalance Float?
currentBalance Float?
settings Json?
lastAnalysis DateTime?
lastTrade DateTime?
nextScheduled DateTime?
errorCount Int @default(0)
lastError String?
createdAt DateTime @default(now())
updatedAt DateTime
lastAnalysisData Json?
users users @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("user_settings")
@@unique([userId, symbol, timeframe])
}
model Trade {
id String @id @default(cuid())
model screenshots {
id String @id
url String
filename String
fileSize Int
mimeType String
metadata Json?
createdAt DateTime @default(now())
}
model system_logs {
id String @id
level String
message String
metadata Json?
createdAt DateTime @default(now())
}
model trades {
id String @id
userId String
symbol String
side String
@@ -90,16 +120,14 @@ model Trade {
executionTime DateTime?
learningData Json?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
updatedAt DateTime
executedAt DateTime?
closedAt DateTime?
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("trades")
users users @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model TradingJournal {
id String @id @default(cuid())
model trading_journals {
id String @id
userId String
date DateTime @default(now())
screenshotUrl String
@@ -122,85 +150,41 @@ model TradingJournal {
marketCondition String?
sessionId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("trading_journals")
updatedAt DateTime
users users @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model Screenshot {
id String @id @default(cuid())
url String
filename String
fileSize Int
mimeType String
metadata Json?
createdAt DateTime @default(now())
@@map("screenshots")
model user_settings {
id String @id
userId String @unique
autoTrading Boolean @default(false)
tradingAmount Float @default(100)
riskPercentage Float @default(2)
maxDailyTrades Int @default(5)
enableNotifications Boolean @default(true)
automationMode String @default("SIMULATION")
autoTimeframe String @default("1h")
autoSymbol String @default("SOLUSD")
autoTradingEnabled Boolean @default(false)
autoAnalysisEnabled Boolean @default(false)
maxLeverage Float @default(3.0)
stopLossPercent Float @default(2.0)
takeProfitPercent Float @default(6.0)
createdAt DateTime @default(now())
updatedAt DateTime
users users @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model SystemLog {
id String @id @default(cuid())
level String
message String
metadata Json?
createdAt DateTime @default(now())
@@map("system_logs")
}
model AutomationSession {
id String @id @default(cuid())
userId String
status String @default("ACTIVE")
mode String @default("SIMULATION")
symbol String
timeframe String
totalTrades Int @default(0)
successfulTrades Int @default(0)
failedTrades Int @default(0)
totalPnL Float @default(0)
totalPnLPercent Float @default(0)
winRate Float @default(0)
avgRiskReward Float @default(0)
maxDrawdown Float @default(0)
startBalance Float?
currentBalance Float?
settings Json?
lastAnalysis DateTime?
lastTrade DateTime?
nextScheduled DateTime?
errorCount Int @default(0)
lastError String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
lastAnalysisData Json?
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([userId, symbol, timeframe])
@@map("automation_sessions")
}
model AILearningData {
id String @id @default(cuid())
userId String
sessionId String?
tradeId String?
analysisData Json
marketConditions Json
outcome String?
actualPrice Float?
predictedPrice Float?
confidenceScore Float?
accuracyScore Float?
timeframe String
symbol String
screenshot String?
feedbackData Json?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("ai_learning_data")
model users {
id String @id
email String @unique
name String?
createdAt DateTime @default(now())
updatedAt DateTime
ai_learning_data ai_learning_data[]
api_keys api_keys[]
automation_sessions automation_sessions[]
trades trades[]
trading_journals trading_journals[]
user_settings user_settings?
}