Initial commit: Gold Trading Simulator with AI-powered analysis
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
from fastapi import APIRouter, HTTPException, Query
|
||||
from typing import List
|
||||
from app.services.news_service import news_service
|
||||
from app.services.alert_service import alert_service
|
||||
from app.schemas.schemas import (
|
||||
NewsFeedResponse,
|
||||
EconomicCalendarResponse,
|
||||
AlertsResponse,
|
||||
CorrelationAnalysisResponse,
|
||||
)
|
||||
|
||||
router = APIRouter(prefix="/news", tags=["News & Sentiment"])
|
||||
|
||||
|
||||
@router.get("/feed", response_model=NewsFeedResponse)
|
||||
async def get_news_feed(
|
||||
limit: int = Query(50, description="Maximum number of articles to return"),
|
||||
):
|
||||
"""
|
||||
Get aggregated news feed from multiple sources with sentiment analysis
|
||||
|
||||
Features:
|
||||
- Fetches from Alpha Vantage News Sentiment API
|
||||
- Fetches from Finnhub (if API key provided)
|
||||
- Filters for gold-relevant news
|
||||
- Performs sentiment analysis
|
||||
- Categorizes by impact type
|
||||
- Calculates relevance scores
|
||||
- Provides overall market sentiment
|
||||
"""
|
||||
try:
|
||||
news_feed = await news_service.get_aggregated_news_feed()
|
||||
|
||||
# Limit articles
|
||||
news_feed.articles = news_feed.articles[:limit]
|
||||
|
||||
# Generate alerts for high-impact news
|
||||
for article in news_feed.articles:
|
||||
if article.impact_on_gold == "HIGH":
|
||||
alert_service.add_news_alert(
|
||||
news_title=article.title,
|
||||
impact=article.impact_on_gold,
|
||||
sentiment=article.sentiment.value,
|
||||
)
|
||||
|
||||
return news_feed
|
||||
|
||||
except Exception as e:
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=f"Failed to fetch news feed: {str(e)}"
|
||||
)
|
||||
|
||||
|
||||
@router.get("/economic-calendar", response_model=EconomicCalendarResponse)
|
||||
async def get_economic_calendar():
|
||||
"""
|
||||
Get upcoming economic events that may impact gold prices
|
||||
|
||||
Includes:
|
||||
- Federal Reserve meetings
|
||||
- Employment reports
|
||||
- Inflation data (CPI, PPI)
|
||||
- GDP releases
|
||||
- Central bank decisions
|
||||
"""
|
||||
try:
|
||||
calendar = await news_service.get_economic_calendar()
|
||||
return calendar
|
||||
|
||||
except Exception as e:
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=f"Failed to fetch economic calendar: {str(e)}"
|
||||
)
|
||||
|
||||
|
||||
@router.get("/alerts", response_model=AlertsResponse)
|
||||
async def get_alerts(
|
||||
limit: int = Query(50, description="Maximum number of alerts to return"),
|
||||
):
|
||||
"""
|
||||
Get recent alerts for price movements and news events
|
||||
|
||||
Alert Types:
|
||||
- PRICE_SPIKE: Significant upward price movement
|
||||
- PRICE_DROP: Significant downward price movement
|
||||
- NEWS_BREAKING: High-impact breaking news
|
||||
- SUPPORT_BREACH: Price broke below support level
|
||||
- RESISTANCE_BREACH: Price broke above resistance level
|
||||
- HIGH_VOLATILITY: Unusual price volatility detected
|
||||
- ECONOMIC_EVENT: Upcoming important economic release
|
||||
"""
|
||||
try:
|
||||
alerts = alert_service.get_alerts(limit=limit)
|
||||
return alerts
|
||||
|
||||
except Exception as e:
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=f"Failed to fetch alerts: {str(e)}"
|
||||
)
|
||||
|
||||
|
||||
@router.get("/correlation", response_model=CorrelationAnalysisResponse)
|
||||
async def get_news_price_correlation():
|
||||
"""
|
||||
Analyze correlation between news events and price movements
|
||||
|
||||
Shows:
|
||||
- How price reacted to specific news
|
||||
- Time delay between news and price change
|
||||
- Correlation strength (STRONG/MODERATE/WEAK)
|
||||
- Average price impact from news
|
||||
"""
|
||||
try:
|
||||
# Get recent news and price data
|
||||
news_feed = await news_service.get_aggregated_news_feed()
|
||||
|
||||
# Would need price data here - for MVP return empty
|
||||
# In full implementation, fetch from market service
|
||||
correlation = alert_service.analyze_news_price_correlation(
|
||||
news_articles=news_feed.articles[:20],
|
||||
price_data=[], # Would pass actual price data
|
||||
)
|
||||
|
||||
return correlation
|
||||
|
||||
except Exception as e:
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=f"Failed to analyze correlation: {str(e)}"
|
||||
)
|
||||
|
||||
|
||||
@router.post("/alerts/clear")
|
||||
async def clear_old_alerts():
|
||||
"""Clear alerts older than 24 hours"""
|
||||
try:
|
||||
alert_service.clear_old_alerts(hours=24)
|
||||
return {"message": "Old alerts cleared successfully"}
|
||||
|
||||
except Exception as e:
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=f"Failed to clear alerts: {str(e)}"
|
||||
)
|
||||
Reference in New Issue
Block a user