Phase 3: Advanced Analytics Foundation - Models, Schemas, and API
This commit is contained in:
@@ -169,3 +169,100 @@ class HabitTracker(Base):
|
||||
total_completions = Column(Integer, default=0)
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
||||
|
||||
|
||||
# Phase 3: Advanced Analytics
|
||||
|
||||
class PerformanceSnapshot(Base):
|
||||
"""Daily performance snapshot for historical tracking"""
|
||||
__tablename__ = "performance_snapshots"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
user_id = Column(String, nullable=True)
|
||||
snapshot_date = Column(Date, default=func.current_date())
|
||||
daily_pnl = Column(Float, default=0.0)
|
||||
daily_pnl_percent = Column(Float, default=0.0)
|
||||
total_trades = Column(Integer, default=0)
|
||||
winning_trades = Column(Integer, default=0)
|
||||
losing_trades = Column(Integer, default=0)
|
||||
win_rate = Column(Float, default=0.0)
|
||||
best_trade = Column(Float, nullable=True)
|
||||
worst_trade = Column(Float, nullable=True)
|
||||
avg_win = Column(Float, nullable=True)
|
||||
avg_loss = Column(Float, nullable=True)
|
||||
sharpe_ratio = Column(Float, nullable=True)
|
||||
profit_factor = Column(Float, nullable=True)
|
||||
max_drawdown = Column(Float, nullable=True)
|
||||
cumulative_pnl = Column(Float, default=0.0)
|
||||
portfolio_value = Column(Float, nullable=True)
|
||||
equity_curve = Column(JSON, default=[]) # Time series
|
||||
streak_type = Column(String, nullable=True) # win_streak, loss_streak
|
||||
streak_count = Column(Integer, default=0)
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
|
||||
|
||||
class TradePattern(Base):
|
||||
"""Identified profitable trade patterns"""
|
||||
__tablename__ = "trade_patterns"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
user_id = Column(String, nullable=True)
|
||||
pattern_name = Column(String) # e.g., "Morning breakout", "Reversal near support"
|
||||
description = Column(Text, nullable=True)
|
||||
win_rate = Column(Float) # Percentage
|
||||
avg_win = Column(Float)
|
||||
avg_loss = Column(Float)
|
||||
sample_count = Column(Integer) # Number of matching trades
|
||||
best_timeframe = Column(String, nullable=True) # 1m, 5m, 15m, 1h, 1d
|
||||
best_time_of_day = Column(String, nullable=True) # e.g., "09:30-10:30"
|
||||
confidence_score = Column(Float) # 0-100
|
||||
indicators_used = Column(JSON, default=[]) # List of indicators
|
||||
market_conditions = Column(String, nullable=True) # bullish, bearish, neutral
|
||||
total_profit = Column(Float, default=0.0)
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
||||
|
||||
|
||||
class LessonLearned(Base):
|
||||
"""Track lessons and insights from trading"""
|
||||
__tablename__ = "lessons_learned"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
user_id = Column(String, nullable=True)
|
||||
date_learned = Column(DateTime(timezone=True), server_default=func.now())
|
||||
category = Column(String) # entry, exit, risk, psychology, market
|
||||
lesson_text = Column(Text)
|
||||
related_trades = Column(JSON, default=[]) # Trade IDs
|
||||
impact = Column(String) # positive, negative, neutral
|
||||
tags = Column(JSON, default=[]) # Searchable tags
|
||||
importance = Column(String) # critical, important, helpful
|
||||
status = Column(String, default="active") # active, archived
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
|
||||
|
||||
class MonthlyReview(Base):
|
||||
"""Monthly trading performance review"""
|
||||
__tablename__ = "monthly_reviews"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
user_id = Column(String, nullable=True)
|
||||
year = Column(Integer)
|
||||
month = Column(Integer)
|
||||
total_trades = Column(Integer, default=0)
|
||||
total_pnl = Column(Float, default=0.0)
|
||||
total_pnl_percent = Column(Float, default=0.0)
|
||||
best_day = Column(Date, nullable=True)
|
||||
worst_day = Column(Date, nullable=True)
|
||||
best_trade = Column(Float, nullable=True)
|
||||
worst_trade = Column(Float, nullable=True)
|
||||
win_rate = Column(Float, default=0.0)
|
||||
avg_daily_pnl = Column(Float, nullable=True)
|
||||
sharpe_ratio = Column(Float, nullable=True)
|
||||
max_drawdown = Column(Float, nullable=True)
|
||||
trading_days = Column(Integer, default=0)
|
||||
best_pattern = Column(String, nullable=True)
|
||||
summary = Column(Text, nullable=True)
|
||||
improvements = Column(JSON, default=[])
|
||||
goals_met = Column(JSON, default=[])
|
||||
goals_missed = Column(JSON, default=[])
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
|
||||
Reference in New Issue
Block a user