feat: Add Phase 4 advanced metrics and components

- Add advanced metrics dashboard with trade analytics
- Add new trading components (EntryTypeAnalysis, MultiDayPositionTracker, NewsEventTracker, etc.)
- Add strategy mode selector and trend confirmation
- Add risk automation panel and slippage correlation analysis
- Add daily trading plan enhancements with modal components
- Add custom hooks (useApi, useLocalStorage, useAdvancedTradeMetrics)
- Add broker service integration and trading API
- Add test setup and vitest configuration
- Include parquet data files for live market data
- Add comprehensive documentation in docs/ folder
This commit is contained in:
Krikorios
2025-11-27 10:23:58 +02:00
parent b5e2b02cb8
commit 48e60d015f
2019 changed files with 39793 additions and 257 deletions
+411
View File
@@ -0,0 +1,411 @@
"""
Trading Schools API
Endpoints for accessing trading methodologies, strategies, and plan templates
"""
from fastapi import APIRouter, Query, HTTPException
from typing import Optional, List
from pydantic import BaseModel
from app.services.trading_schools import trading_schools, TradingSchool
from app.services.plan_templates import plan_templates, PlanType, MarketCondition
router = APIRouter(prefix="/api/trading-schools", tags=["Trading Schools"])
# Pydantic Models
class TradingSchoolInfo(BaseModel):
"""Trading school information"""
school: str
name: str
description: str
key_concepts: List[str]
timeframes: List[str]
indicators: List[str]
best_for: List[str]
class GeneratePlanRequest(BaseModel):
"""Request to generate a trading plan"""
methodology: str # ict_smc, wyckoff, multi_confluence, etc.
current_price: float
market_condition: Optional[str] = "trending_up"
session: Optional[str] = "london_ny"
risk_tolerance: Optional[str] = "moderate"
# ============================================================================
# TRADING SCHOOLS ENDPOINTS
# ============================================================================
@router.get("/list")
async def get_all_trading_schools():
"""Get list of all available trading schools and methodologies"""
schools = trading_schools.get_all_schools()
return {
"total_schools": len(schools),
"schools": list(schools.keys()),
"schools_detail": schools,
"description": "Comprehensive collection of trading methodologies"
}
@router.get("/school/{school_name}")
async def get_school_details(school_name: str):
"""Get detailed information about a specific trading school"""
schools = trading_schools.get_all_schools()
if school_name not in schools:
raise HTTPException(
status_code=404,
detail=f"School '{school_name}' not found. Available schools: {list(schools.keys())}"
)
return schools[school_name]
@router.get("/combined-strategies")
async def get_combined_strategies():
"""Get hybrid strategies combining multiple trading schools"""
strategies = trading_schools.get_combined_strategies()
return {
"total_strategies": len(strategies),
"strategies": strategies,
"description": "Hybrid approaches combining multiple methodologies for higher probability setups"
}
@router.get("/indicator-presets")
async def get_indicator_presets(school: Optional[str] = Query(None)):
"""Get recommended indicator configurations for trading schools"""
if school:
preset = trading_schools.get_indicator_presets_for_school(TradingSchool(school))
return {
"school": school,
"preset": preset
}
# Get all presets
all_presets = {}
for s in TradingSchool:
all_presets[s.value] = trading_schools.get_indicator_presets_for_school(s)
return {
"total_schools": len(all_presets),
"presets": all_presets
}
@router.get("/risk-models")
async def get_risk_management_models():
"""Get advanced risk management models and position sizing strategies"""
models = trading_schools.get_risk_models()
return {
"total_models": len(models),
"models": models,
"recommendation": "Use Fixed Fractional (1-2% per trade) for beginners, Kelly Criterion for advanced traders with proven edge"
}
# ============================================================================
# TRADING PLAN TEMPLATES ENDPOINTS
# ============================================================================
@router.get("/plan-types")
async def get_plan_types():
"""Get all available trading plan types"""
types = plan_templates.get_all_plan_types()
return {
"total_types": len(types),
"plan_types": types,
"description": "Pre-built trading plan templates for different methodologies"
}
@router.post("/generate-plan")
async def generate_trading_plan(request: GeneratePlanRequest):
"""
Generate a comprehensive trading plan based on selected methodology
Methodologies:
- ict_smc: ICT / Smart Money Concepts
- wyckoff: Wyckoff Method
- multi_confluence: Multi-Method Confluence (ICT + Fib + S/D + PA)
- session_trading: London/NY Session-Based Trading
"""
try:
# Validate market condition
try:
market_cond = MarketCondition(request.market_condition)
except ValueError:
market_cond = MarketCondition.TRENDING_UP
# Generate plan based on methodology
if request.methodology == "ict_smc":
plan = plan_templates.generate_ict_smc_plan(
current_price=request.current_price,
market_condition=market_cond,
session=request.session or "london_ny"
)
elif request.methodology == "wyckoff":
plan = plan_templates.generate_wyckoff_plan(
current_price=request.current_price,
market_condition=market_cond
)
elif request.methodology == "multi_confluence":
plan = plan_templates.generate_multi_method_confluence_plan(
current_price=request.current_price,
market_condition=market_cond
)
elif request.methodology == "session_trading":
plan = plan_templates.generate_session_based_plan(
current_price=request.current_price,
target_session=request.session or "london_ny_overlap"
)
else:
raise HTTPException(
status_code=400,
detail=f"Unknown methodology: {request.methodology}. Use: ict_smc, wyckoff, multi_confluence, or session_trading"
)
return {
"methodology": request.methodology,
"current_price": request.current_price,
"market_condition": request.market_condition,
"plan": plan,
"generated_at": "now"
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/quick-reference/{school}")
async def get_quick_reference(school: str):
"""Get a quick reference guide for a specific trading school"""
schools = trading_schools.get_all_schools()
if school not in schools:
raise HTTPException(status_code=404, detail=f"School '{school}' not found")
school_data = schools[school]
# Create quick reference
quick_ref = {
"name": school_data["name"],
"school_type": school_data["school"],
"elevator_pitch": school_data["description"],
"key_concepts": school_data["key_concepts"][:5], # Top 5
"timeframes": school_data["timeframes"],
"best_for": school_data["best_for"],
"one_sentence_summary": _get_one_liner(school)
}
if "entry_criteria" in school_data:
quick_ref["how_to_trade"] = school_data["entry_criteria"]
if "risk_management" in school_data:
quick_ref["risk_management"] = school_data["risk_management"]
return quick_ref
@router.get("/comparison")
async def compare_trading_schools(
schools_list: str = Query(..., description="Comma-separated list of schools to compare, e.g., ict_smc,wyckoff,price_action")
):
"""Compare multiple trading schools side by side"""
school_names = [s.strip() for s in schools_list.split(",")]
schools_data = trading_schools.get_all_schools()
comparison = {}
for school_name in school_names:
if school_name not in schools_data:
raise HTTPException(
status_code=404,
detail=f"School '{school_name}' not found"
)
data = schools_data[school_name]
comparison[school_name] = {
"name": data["name"],
"description": data["description"],
"timeframes": data["timeframes"],
"indicators": data["indicators"],
"best_for": data["best_for"],
"complexity": _rate_complexity(school_name)
}
return {
"schools_compared": len(comparison),
"comparison": comparison,
"recommendation": _get_comparison_recommendation(school_names)
}
@router.get("/learning-path")
async def get_learning_path():
"""Get recommended learning path for mastering different trading schools"""
return {
"beginner_path": {
"level": "Beginner (0-6 months)",
"schools": [
{
"order": 1,
"school": "price_action",
"name": "Price Action",
"reason": "Foundation - Learn to read candles and basic S/R",
"time_to_learn": "2-3 months"
},
{
"order": 2,
"school": "fibonacci_trading",
"name": "Fibonacci Trading",
"reason": "Simple tool, high applicability",
"time_to_learn": "1 month"
},
{
"order": 3,
"school": "supply_demand",
"name": "Supply & Demand Zones",
"reason": "Logical, builds on S/R knowledge",
"time_to_learn": "2 months"
}
],
"practice": "Demo trade minimum 3 months before real money"
},
"intermediate_path": {
"level": "Intermediate (6-18 months)",
"schools": [
{
"order": 1,
"school": "ict_smc",
"name": "ICT / Smart Money Concepts",
"reason": "Modern, powerful for gold/forex",
"time_to_learn": "4-6 months"
},
{
"order": 2,
"school": "market_profile",
"name": "Market Profile",
"reason": "Understand volume and value",
"time_to_learn": "3 months"
},
{
"order": 3,
"school": "multi_timeframe",
"name": "Multi-Timeframe Analysis",
"reason": "Combine skills, improve timing",
"time_to_learn": "2 months"
}
],
"practice": "Start combining methods, track statistics"
},
"advanced_path": {
"level": "Advanced (18+ months)",
"schools": [
{
"order": 1,
"school": "wyckoff",
"name": "Wyckoff Method",
"reason": "Deep market understanding, institutional perspective",
"time_to_learn": "6-12 months"
},
{
"order": 2,
"school": "elliott_wave",
"name": "Elliott Wave Theory",
"reason": "Complex but powerful for major moves",
"time_to_learn": "6-12 months"
},
{
"order": 3,
"school": "order_flow",
"name": "Order Flow Trading",
"reason": "Real-time institutional activity",
"time_to_learn": "3-6 months (requires specialized tools)"
}
],
"practice": "Develop personal methodology combining multiple schools"
},
"professional_edge": {
"level": "Professional",
"approach": "Multi-Method Confluence",
"description": "Combine 3-4 methodologies for maximum probability setups",
"schools": ["ict_smc", "fibonacci_trading", "supply_demand", "price_action"],
"goal": "Trade only highest-quality setups with 70%+ win rate",
"frequency": "1-3 trades per week (quality over quantity)"
},
"general_advice": [
"Master ONE school completely before moving to next",
"Journal every trade and study every setup",
"Backtest each methodology on historical data",
"Paper trade new methods for 2-3 months minimum",
"Don't skip fundamentals (Price Action first!)",
"Find 1-2 mentors for each major methodology",
"Join communities: ICT students, Wyckoff traders, etc.",
"Most profitable traders use 2-3 methods maximum (confluence)"
]
}
# ============================================================================
# HELPER FUNCTIONS
# ============================================================================
def _get_one_liner(school: str) -> str:
"""Get one-sentence summary of a trading school"""
summaries = {
"ict_smc": "Trade like institutions: Follow liquidity, FVGs, and order blocks during killzones.",
"wyckoff": "Identify accumulation and distribution phases using volume to trade with smart money.",
"elliott_wave": "Count wave structures and use Fibonacci to predict major market moves.",
"market_profile": "Find value areas and trade price rejection from high/low volume nodes.",
"order_flow": "Read real-time buying/selling pressure to anticipate institutional moves.",
"price_action": "Trade pure price patterns at support/resistance without indicators.",
"supply_demand": "Identify fresh zones of imbalance and trade rejections from these levels.",
"fibonacci_trading": "Use golden ratio levels (0.618, 1.618) for entries and targets.",
"gold_fundamental": "Trade gold based on USD strength, yields, inflation, and geopolitical factors.",
"multi_timeframe": "Align multiple timeframes for high-probability entries with HTF targets.",
"london_ny_session": "Trade gold during high-liquidity sessions (3-5 AM, 8-11 AM EST) for best moves."
}
return summaries.get(school, "A proven trading methodology.")
def _rate_complexity(school: str) -> str:
"""Rate the complexity of learning a trading school"""
ratings = {
"price_action": "Beginner",
"fibonacci_trading": "Beginner",
"supply_demand": "Beginner-Intermediate",
"multi_timeframe": "Intermediate",
"ict_smc": "Intermediate",
"market_profile": "Intermediate-Advanced",
"gold_fundamental": "Intermediate",
"london_ny_session": "Intermediate",
"wyckoff": "Advanced",
"elliott_wave": "Advanced",
"order_flow": "Advanced"
}
return ratings.get(school, "Intermediate")
def _get_comparison_recommendation(schools: List[str]) -> str:
"""Get recommendation based on schools being compared"""
if len(schools) == 1:
return f"Focus on mastering {schools[0]} before adding other methods."
if "ict_smc" in schools and "fibonacci_trading" in schools and "supply_demand" in schools:
return "Excellent combination! These three methods work very well together for confluence trading."
if "wyckoff" in schools and any(s in schools for s in ["market_profile", "order_flow"]):
return "Volume-based methods pair well. Focus on volume analysis across all methods."
if len(schools) > 4:
return "⚠️ Too many methods. Focus on mastering 2-3 maximum to avoid analysis paralysis."
return "Good selection. Look for confluence zones where multiple methods confirm the same setup."