zephyrdark a7366d053e feat: add manual signal execution to portfolio
Allow users to execute active KJB signals by selecting a portfolio,
entering quantity and price, then creating the corresponding transaction
and updating holdings. Signal status changes to 'executed' after completion.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 16:10:48 +09:00

60 lines
1.3 KiB
Python

"""
Signal related Pydantic schemas.
"""
from datetime import date, datetime
from decimal import Decimal
from typing import Optional, List
from enum import Enum
from pydantic import BaseModel, Field
from app.schemas.portfolio import FloatDecimal
class SignalExecuteRequest(BaseModel):
portfolio_id: int
quantity: int = Field(..., gt=0)
price: FloatDecimal = Field(..., gt=0)
class SignalType(str, Enum):
BUY = "buy"
SELL = "sell"
PARTIAL_SELL = "partial_sell"
class SignalStatus(str, Enum):
ACTIVE = "active"
EXECUTED = "executed"
EXPIRED = "expired"
class SignalResponse(BaseModel):
id: int
date: date
ticker: str
name: Optional[str] = None
signal_type: str
entry_price: Optional[FloatDecimal] = None
target_price: Optional[FloatDecimal] = None
stop_loss_price: Optional[FloatDecimal] = None
reason: Optional[str] = None
status: str
created_at: datetime
class Config:
from_attributes = True
class ActivePosition(BaseModel):
ticker: str
name: Optional[str] = None
entry_date: date
entry_price: FloatDecimal
current_price: FloatDecimal
shares: int
stop_loss_price: FloatDecimal
target_price: FloatDecimal
pnl_percent: FloatDecimal
pnl_amount: FloatDecimal