Initial commit: Gold Trading Simulator with AI-powered analysis

This commit is contained in:
Krikorios
2025-11-16 00:50:04 +02:00
commit 72c1d3adb7
128 changed files with 16232 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
# Schemas package
+26
View File
@@ -0,0 +1,26 @@
from __future__ import annotations
from pydantic import BaseModel, Field
from typing import Literal
from datetime import datetime
class KlineEvent(BaseModel):
symbol: str
timeframe: str
open_time: datetime
close_time: datetime
open: float
high: float
low: float
close: float
volume: float = 0.0
is_closed: bool = Field(default=True, description="True when candle closed")
source: Literal["binance", "alpha_vantage", "oanda", "other"] = "other"
class OHLCVRequest(BaseModel):
symbol: str
timeframe: str
start: datetime | None = None
end: datetime | None = None
+211
View File
@@ -0,0 +1,211 @@
from pydantic import BaseModel, Field
from typing import Optional, List
from datetime import datetime
from enum import Enum
class TradeAction(str, Enum):
BUY = "BUY"
SELL = "SELL"
class Recommendation(str, Enum):
BUY = "BUY"
SELL = "SELL"
HOLD = "HOLD"
class RiskLevel(str, Enum):
LOW = "LOW"
MEDIUM = "MEDIUM"
HIGH = "HIGH"
class PriceData(BaseModel):
time: int
open: float
high: float
low: float
close: float
volume: Optional[float] = None
class TradeCreate(BaseModel):
action: TradeAction
quantity: float
price: float
class TradeResponse(BaseModel):
id: int
simulation_id: int
action: TradeAction
quantity: float
price: float
total: float
pnl: Optional[float] = None
timestamp: datetime
class Config:
from_attributes = True
class PositionResponse(BaseModel):
symbol: str
quantity: float
avg_price: float
current_price: float
unrealized_pnl: float
unrealized_pnl_percent: float
class Config:
from_attributes = True
class PortfolioResponse(BaseModel):
cash: float
initial_capital: float
total_value: float
total_pnl: float
total_pnl_percent: float
position: Optional[PositionResponse] = None
trades: List[TradeResponse] = []
class MarketDataResponse(BaseModel):
symbol: str = "XAU/USD"
price: float
change: float
change_percent: float
high_24h: float
low_24h: float
volume: float
class SupportResistance(BaseModel):
support: List[float] = []
resistance: List[float] = []
class AIAnalysisRequest(BaseModel):
price_data: List[PriceData]
indicators: List[dict]
current_price: float
class AIAnalysisResponse(BaseModel):
recommendation: Recommendation
confidence: float = Field(..., ge=0, le=100)
reasoning: str
support_resistance: SupportResistance
risk_level: RiskLevel
class IndicatorData(BaseModel):
time: int
value: float
# News and Sentiment Schemas
class Sentiment(str, Enum):
POSITIVE = "POSITIVE"
NEGATIVE = "NEGATIVE"
NEUTRAL = "NEUTRAL"
class NewsArticle(BaseModel):
id: str
source: str
title: str
description: Optional[str] = None
url: str
published_at: datetime
sentiment: Sentiment
sentiment_score: float = Field(..., ge=-1, le=1)
impact_on_gold: str # HIGH, MEDIUM, LOW
relevance_score: float = Field(..., ge=0, le=1)
category: str # MONETARY_POLICY, GEOPOLITICS, ECONOMIC_DATA, etc.
class NewsFeedResponse(BaseModel):
articles: List[NewsArticle]
total_count: int
bullish_count: int
bearish_count: int
neutral_count: int
overall_sentiment: Sentiment
avg_sentiment_score: float
class EconomicEvent(BaseModel):
id: str
title: str
country: str
currency: str
event_date: datetime
importance: str # HIGH, MEDIUM, LOW
forecast: Optional[str] = None
previous: Optional[str] = None
actual: Optional[str] = None
impact_on_gold: str
class EconomicCalendarResponse(BaseModel):
events: List[EconomicEvent]
upcoming_high_impact: int
# Alert Schemas
class AlertType(str, Enum):
PRICE_SPIKE = "PRICE_SPIKE"
PRICE_DROP = "PRICE_DROP"
NEWS_BREAKING = "NEWS_BREAKING"
SUPPORT_BREACH = "SUPPORT_BREACH"
RESISTANCE_BREACH = "RESISTANCE_BREACH"
HIGH_VOLATILITY = "HIGH_VOLATILITY"
ECONOMIC_EVENT = "ECONOMIC_EVENT"
class AlertSeverity(str, Enum):
CRITICAL = "CRITICAL"
HIGH = "HIGH"
MEDIUM = "MEDIUM"
LOW = "LOW"
class Alert(BaseModel):
id: str
type: AlertType
severity: AlertSeverity
title: str
message: str
price: Optional[float] = None
change_percent: Optional[float] = None
timestamp: datetime
related_news: Optional[List[str]] = [] # URLs to related news
action_required: bool = False
class AlertsResponse(BaseModel):
alerts: List[Alert]
critical_count: int
unread_count: int
# News-Price Correlation
class NewsPriceCorrelation(BaseModel):
news_id: str
news_title: str
news_time: datetime
price_before: float
price_after: float
price_change: float
price_change_percent: float
time_delta_minutes: int
correlation_strength: str # STRONG, MODERATE, WEAK
class CorrelationAnalysisResponse(BaseModel):
correlations: List[NewsPriceCorrelation]
significant_events: int
avg_price_impact: float