from __future__ import annotations from typing import Literal from pydantic import BaseModel SecurityType = Literal["stock", "index", "etf", "unknown"] CycleName = Literal["week", "day", "15m", "30m", "60m", "90m", "120m"] ResonanceLevel = Literal["normal", "medium", "strong", "very_strong"] ResonanceType = Literal["time", "space", "spacetime", "trend", "abc"] SignalBias = Literal["bullish", "bearish", "neutral"] ToolMode = Literal["auto", "manual_ready"] ToolType = Literal["fibonacci_ruler", "extension_ruler", "wave_ruler", "trend_line", "horizontal_line", "range_measure"] MarkerKind = Literal["support", "resistance", "current", "trigger", "target"] class SymbolInfo(BaseModel): query: str code: str name: str market: str security_type: SecurityType secid: str class SnapshotInfo(BaseModel): latest_price: float | None = None change_percent: float | None = None updated_at: str | None = None source_name: str class MaValues(BaseModel): ma5: float | None = None ma13: float | None = None ma21: float | None = None ma34: float | None = None ma55: float | None = None ma89: float | None = None class MacdValues(BaseModel): dif: float | None = None dea: float | None = None histogram: float | None = None class RsiValues(BaseModel): rsi5: float | None = None rsi13: float | None = None rsi21: float | None = None class IndicatorSnapshot(BaseModel): macd: MacdValues rsi: RsiValues signal_summary: str class CycleSummary(BaseModel): cycle: CycleName close: float | None = None trend_label: str ma_status: str volume_status: str ma_values: MaValues indicator_snapshot: IndicatorSnapshot class AbcPoint(BaseModel): label: Literal["A", "B", "C"] timestamp: str price: float k_index: int class AbcStructure(BaseModel): cycle: CycleName direction: Literal["bullish", "bearish", "neutral"] status: str a_point: AbcPoint | None = None b_point: AbcPoint | None = None c_point: AbcPoint | None = None reasoning: list[str] class FibonacciLevel(BaseModel): ratio: float label: str value: float distance_to_price: float | None = None class FibonacciSpace(BaseModel): cycle: CycleName anchor_start_label: str anchor_start_time: str anchor_start_price: float anchor_end_label: str anchor_end_time: str anchor_end_price: float levels: list[FibonacciLevel] current_position_summary: str class FibonacciTime(BaseModel): cycle: Literal["15m", "30m", "60m", "90m", "120m"] start_point_time: str start_point_label: str current_count: int current_hit: list[int] next_key_counts: list[int] next_window_summary: str class TimeSequenceTrack(BaseModel): track_type: Literal["major", "minor"] cycle: Literal["15m", "30m", "60m", "90m", "120m"] start_point_time: str start_point_label: str current_count: int current_hit: list[int] next_key_counts: list[int] next_window_summary: str class TimeSequenceBundle(BaseModel): major: TimeSequenceTrack | None = None minor: TimeSequenceTrack | None = None class ResonanceItem(BaseModel): level: ResonanceLevel type: ResonanceType cycles: list[str] summary: str bias: SignalBias class ConclusionSummary(BaseModel): stage: str bias: SignalBias confidence: int headline: str summary: str tags: list[str] class AlertItem(BaseModel): level: ResonanceLevel trigger_type: str title: str summary: str action: str class EvidenceItem(BaseModel): title: str detail: str cycles: list[str] score: int class StrategyScenario(BaseModel): key: Literal["A", "B", "C"] title: str trigger_condition: str system_view: str user_action: str next_watch: str class MonitoringTask(BaseModel): title: str cadence: str focus: str trigger_condition: str class ToolPreset(BaseModel): name: str cycle: CycleName tool_type: ToolType mode: ToolMode anchors: list[str] summary: str class AnalysisReportResponse(BaseModel): symbol: SymbolInfo snapshot: SnapshotInfo cycles: list[CycleSummary] abc_structures: list[AbcStructure] fibonacci_space: list[FibonacciSpace] fibonacci_time: list[FibonacciTime] resonance: list[ResonanceItem] conclusion_summary: ConclusionSummary alerts: list[AlertItem] evidence_chain: list[EvidenceItem] strategy_scenarios: list[StrategyScenario] monitoring_tasks: list[MonitoringTask] tool_presets: list[ToolPreset] tomorrow_strategy: list[str] follow_strategy: list[str] signal_conclusion: list[str] calculation_steps: list[str] class ChartCandle(BaseModel): timestamp: str open: float close: float high: float low: float volume: float ma5: float | None = None ma13: float | None = None ma21: float | None = None ma34: float | None = None ma55: float | None = None ma89: float | None = None dif: float | None = None dea: float | None = None macd_histogram: float | None = None rsi5: float | None = None rsi13: float | None = None rsi21: float | None = None class ChartTimeMarker(BaseModel): track_type: Literal["major", "minor"] = "major" target_count: int current_count: int candle_index: int | None = None reached: bool label: str class ChartPriceMarker(BaseModel): label: str value: float kind: MarkerKind emphasis: ResonanceLevel class ChartToolLayer(BaseModel): name: str tool_type: ToolType mode: ToolMode summary: str class AnalysisChartResponse(BaseModel): symbol: SymbolInfo cycle: CycleName candles: list[ChartCandle] abc_structure: AbcStructure fibonacci_space: FibonacciSpace fibonacci_time: FibonacciTime | None = None time_sequences: TimeSequenceBundle | None = None time_markers: list[ChartTimeMarker] price_markers: list[ChartPriceMarker] tool_layers: list[ChartToolLayer] signal_tags: list[str]