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
+76
View File
@@ -0,0 +1,76 @@
from fastapi import APIRouter, HTTPException, Query
from typing import List
from app.services.price_simulator import gold_simulator
from app.schemas.schemas import PriceData, MarketDataResponse
router = APIRouter(prefix="/market", tags=["Market Data"])
@router.get("/gold/current", response_model=MarketDataResponse)
async def get_current_gold_price():
"""Get current gold (XAU/USD) market data - simulated live feed"""
try:
# Get current simulated price
current_price = gold_simulator.get_current_price()
# Generate recent data for 24h high/low calculation
recent_data = gold_simulator.generate_historical_data(interval="60min", points=24)
if len(recent_data) > 0:
# Calculate 24h stats
high_24h = max(candle.high for candle in recent_data)
low_24h = min(candle.low for candle in recent_data)
latest = recent_data[-1]
previous = recent_data[-2] if len(recent_data) > 1 else latest
change = latest.close - previous.close
change_percent = (change / previous.close) * 100
return MarketDataResponse(
symbol="XAU/USD",
price=current_price,
change=change,
change_percent=change_percent,
high_24h=high_24h,
low_24h=low_24h,
volume=0.0,
)
else:
raise HTTPException(status_code=500, detail="Unable to generate market data")
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/gold/history", response_model=List[PriceData])
async def get_gold_historical_data(
interval: str = Query("daily", description="Time interval: daily, 1min, 5min, 15min, 30min, 60min"),
output_size: str = Query("compact", description="compact (100 points) or full (500 points)"),
):
"""Get historical gold (XAU/USD) price data - simulated"""
try:
# Determine number of points based on output_size
points = 500 if output_size == "full" else 100
# Generate historical data using simulator
data = gold_simulator.generate_historical_data(interval=interval, points=points)
return data
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/gold/live", response_model=PriceData)
async def get_live_gold_price(
interval: str = Query("1min", description="Time interval for rounding: 1min, 5min, 15min, 30min, 60min")
):
"""Get latest live gold price tick - simulated real-time feed (no external API calls)"""
try:
# Use the simulator to generate a live candle
live_candle = gold_simulator.get_live_candle(interval=interval)
return live_candle
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))