Features: - AI-powered signal generation with multi-factor analysis - Fundamental news aggregation from multiple sources - Technical analysis with 6+ indicators - VectorDB integration for semantic search - Backtesting engine with performance metrics - Demo/paper trading mode - Real-time WebSocket updates - Comprehensive dashboard UI Built for Mantle Turing Test Hackathon - AI Trading track - AI Alpha & Data track
243 lines
7.2 KiB
Plaintext
243 lines
7.2 KiB
Plaintext
// Prisma Schema for Mantle AI Trading Bot
|
|
// Comprehensive database schema for signals, trades, backtests, and news
|
|
|
|
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "sqlite"
|
|
url = "file:./data/mantle-trader.db"
|
|
}
|
|
|
|
// Signal Management
|
|
model Signal {
|
|
id String @id @default(uuid())
|
|
symbol String // Trading pair e.g., "BTCUSDT"
|
|
action String // "BUY" | "SELL" | "HOLD"
|
|
confidence Float // 0.0 to 1.0
|
|
rating Int @default(0) // User rating 1-5
|
|
priceTarget Float?
|
|
stopLoss Float?
|
|
takeProfit Float?
|
|
reasoning String // AI-generated reasoning
|
|
newsSources String? // JSON array of source URLs
|
|
sentimentScore Float? // -1 to 1
|
|
technicalScore Float? // 0 to 1
|
|
fundamentalScore Float? // 0 to 1
|
|
status String @default("PENDING") // PENDING | EXECUTED | CANCELLED | EXPIRED
|
|
executedAt DateTime?
|
|
executedPrice Float?
|
|
result String? // WIN | LOSS | NEUTRAL
|
|
resultPnL Float? // Profit/Loss percentage
|
|
demo Boolean @default(false) // Is this a demo signal?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
trades Trade[]
|
|
backtestResults BacktestResult[]
|
|
|
|
@@index([symbol])
|
|
@@index([status])
|
|
@@index([createdAt])
|
|
}
|
|
|
|
// Trade Execution
|
|
model Trade {
|
|
id String @id @default(uuid())
|
|
signalId String?
|
|
signal Signal? @relation(fields: [signalId], references: [id])
|
|
symbol String
|
|
side String // "BUY" | "SELL"
|
|
orderType String // "MARKET" | "LIMIT"
|
|
quantity Float
|
|
price Float
|
|
leverage Float @default(1)
|
|
stopLoss Float?
|
|
takeProfit Float?
|
|
status String @default("PENDING") // PENDING | FILLED | CANCELLED | FAILED
|
|
orderId String? // Exchange order ID
|
|
executedAt DateTime?
|
|
closedAt DateTime?
|
|
pnl Float?
|
|
fees Float?
|
|
demo Boolean @default(false)
|
|
notes String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@index([symbol])
|
|
@@index([status])
|
|
}
|
|
|
|
// News Articles
|
|
model NewsArticle {
|
|
id String @id @default(uuid())
|
|
title String
|
|
content String?
|
|
summary String?
|
|
source String // e.g., "CryptoPanic", "CoinGecko"
|
|
sourceUrl String?
|
|
author String?
|
|
category String? // e.g., "Bitcoin", "DeFi", "Regulation"
|
|
sentiment Float? // -1 to 1
|
|
importance Float? // 0 to 1
|
|
tags String? // JSON array
|
|
publishedAt DateTime?
|
|
fetchedAt DateTime @default(now())
|
|
processed Boolean @default(false)
|
|
vectorId String? // ChromaDB vector ID
|
|
createdAt DateTime @default(now())
|
|
|
|
@@unique([sourceUrl])
|
|
@@index([source])
|
|
@@index([category])
|
|
@@index([publishedAt])
|
|
}
|
|
|
|
// Market Data Cache
|
|
model MarketData {
|
|
id String @id @default(uuid())
|
|
symbol String
|
|
timeframe String // "1m", "5m", "15m", "1h", "4h", "1d"
|
|
openPrice Float
|
|
highPrice Float
|
|
lowPrice Float
|
|
closePrice Float
|
|
volume Float
|
|
timestamp DateTime
|
|
createdAt DateTime @default(now())
|
|
|
|
@@unique([symbol, timeframe, timestamp])
|
|
@@index([symbol, timeframe])
|
|
}
|
|
|
|
// Backtest Sessions
|
|
model BacktestSession {
|
|
id String @id @default(uuid())
|
|
name String
|
|
description String?
|
|
symbol String
|
|
startDate DateTime
|
|
endDate DateTime
|
|
initialCapital Float
|
|
finalCapital Float?
|
|
totalTrades Int @default(0)
|
|
winRate Float?
|
|
maxDrawdown Float?
|
|
sharpeRatio Float?
|
|
status String @default("PENDING") // PENDING | RUNNING | COMPLETED | FAILED
|
|
config String? // JSON configuration
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
results BacktestResult[]
|
|
|
|
@@index([symbol])
|
|
@@index([status])
|
|
}
|
|
|
|
model BacktestResult {
|
|
id String @id @default(uuid())
|
|
sessionId String
|
|
session BacktestSession @relation(fields: [sessionId], references: [id])
|
|
signalId String?
|
|
signal Signal? @relation(fields: [signalId], references: [id])
|
|
symbol String
|
|
action String
|
|
entryPrice Float
|
|
exitPrice Float?
|
|
quantity Float
|
|
pnl Float?
|
|
pnlPercent Float?
|
|
executedAt DateTime
|
|
closedAt DateTime?
|
|
notes String?
|
|
createdAt DateTime @default(now())
|
|
|
|
@@index([sessionId])
|
|
}
|
|
|
|
// Portfolio Tracking
|
|
model Portfolio {
|
|
id String @id @default(uuid())
|
|
name String @default("Main Portfolio")
|
|
totalValue Float @default(0)
|
|
cashBalance Float @default(0)
|
|
realizedPnL Float @default(0)
|
|
unrealizedPnL Float @default(0)
|
|
demo Boolean @default(false)
|
|
isActive Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
positions Position[]
|
|
|
|
@@index([isActive])
|
|
}
|
|
|
|
model Position {
|
|
id String @id @default(uuid())
|
|
portfolioId String
|
|
portfolio Portfolio @relation(fields: [portfolioId], references: [id])
|
|
symbol String
|
|
side String // "LONG" | "SHORT"
|
|
quantity Float
|
|
avgEntryPrice Float
|
|
currentPrice Float?
|
|
marketValue Float?
|
|
unrealizedPnL Float?
|
|
leverage Float @default(1)
|
|
liquidationPrice Float?
|
|
openedAt DateTime @default(now())
|
|
closedAt DateTime?
|
|
status String @default("OPEN") // OPEN | CLOSED
|
|
demo Boolean @default(false)
|
|
|
|
@@index([portfolioId])
|
|
@@index([symbol])
|
|
}
|
|
|
|
// User Settings & API Keys (Encrypted in production)
|
|
model UserSettings {
|
|
id String @id @default(uuid())
|
|
bybitApiKey String?
|
|
bybitApiSecret String?
|
|
bybitTestnet Boolean @default(true)
|
|
riskLevel String @default("MODERATE") // CONSERVATIVE | MODERATE | AGGRESSIVE
|
|
maxPositionSize Float @default(1000)
|
|
maxLeverage Float @default(5)
|
|
autoTrading Boolean @default(false)
|
|
notificationsEnabled Boolean @default(true)
|
|
telegramChatId String?
|
|
discordWebhook String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
}
|
|
|
|
// Signal Rating History
|
|
model SignalRating {
|
|
id String @id @default(uuid())
|
|
signalId String
|
|
rating Int // 1-5
|
|
feedback String?
|
|
userId String?
|
|
createdAt DateTime @default(now())
|
|
|
|
@@index([signalId])
|
|
}
|
|
|
|
// System Logs
|
|
model SystemLog {
|
|
id String @id @default(uuid())
|
|
level String // INFO | WARNING | ERROR | CRITICAL
|
|
component String // e.g., "NewsAggregator", "SignalEngine"
|
|
message String
|
|
details String? // JSON additional data
|
|
createdAt DateTime @default(now())
|
|
|
|
@@index([level])
|
|
@@index([component])
|
|
@@index([createdAt])
|
|
}
|