Initial commit: Mantle AI Trading Bot
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
This commit is contained in:
242
prisma/schema.prisma
Normal file
242
prisma/schema.prisma
Normal file
@@ -0,0 +1,242 @@
|
||||
// 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])
|
||||
}
|
||||
Reference in New Issue
Block a user