Phase 1: - Real-time signal alerts (Discord/Telegram webhook) - Trading journal with entry/exit tracking - Position sizing calculator (Fixed/Kelly/ATR) Phase 2: - Pension asset allocation (DC/IRP 70% risk limit) - Drawdown monitoring with SVG gauge - Benchmark dashboard (portfolio vs KOSPI vs deposit) Phase 3: - Tax benefit simulation (Korean pension tax rules) - Correlation matrix heatmap - Parameter optimizer with grid search + overfit detection
54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
"""
|
|
Trading journal models.
|
|
"""
|
|
import enum
|
|
from datetime import datetime
|
|
|
|
from sqlalchemy import (
|
|
Column, Integer, String, Numeric, DateTime, Date,
|
|
Text, Enum as SQLEnum, ForeignKey,
|
|
)
|
|
from sqlalchemy.orm import relationship
|
|
|
|
from app.core.database import Base
|
|
|
|
|
|
class TradeType(str, enum.Enum):
|
|
BUY = "buy"
|
|
SELL = "sell"
|
|
|
|
|
|
class JournalStatus(str, enum.Enum):
|
|
OPEN = "open"
|
|
CLOSED = "closed"
|
|
|
|
|
|
class TradeJournal(Base):
|
|
__tablename__ = "trade_journals"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
user_id = Column(Integer, ForeignKey("users.id"), nullable=False, index=True)
|
|
stock_code = Column(String(20), nullable=False, index=True)
|
|
stock_name = Column(String(100))
|
|
trade_type = Column(SQLEnum(TradeType), nullable=False)
|
|
entry_price = Column(Numeric(12, 2))
|
|
target_price = Column(Numeric(12, 2))
|
|
stop_loss_price = Column(Numeric(12, 2))
|
|
exit_price = Column(Numeric(12, 2))
|
|
entry_date = Column(Date, nullable=False, index=True)
|
|
exit_date = Column(Date)
|
|
quantity = Column(Integer)
|
|
profit_loss = Column(Numeric(14, 2))
|
|
profit_loss_pct = Column(Numeric(8, 4))
|
|
entry_reason = Column(Text)
|
|
exit_reason = Column(Text)
|
|
scenario = Column(Text)
|
|
lessons_learned = Column(Text)
|
|
emotional_state = Column(Text)
|
|
strategy_id = Column(Integer)
|
|
status = Column(SQLEnum(JournalStatus), default=JournalStatus.OPEN, index=True)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
|
|
|
user = relationship("User", backref="trade_journals")
|