Files
zjjk/backend/app/api/analysis_schemas.py

266 lines
6.0 KiB
Python
Raw Normal View History

2026-04-08 20:04:40 +08:00
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]