266 lines
6.0 KiB
Python
266 lines
6.0 KiB
Python
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]
|