07.4.4.1.2 — Market State Journal Events

This commit is contained in:
2026-05-11 00:28:26 +03:00
parent ef7cec68cc
commit c07a1a4dff
9 changed files with 532 additions and 73 deletions

View File

@@ -32,6 +32,9 @@ class AutoTradeService:
_last_signal_confidence: float = 0.0
_last_signal_payload: dict | None = None
_last_signal_started_at: float | None = None
_last_logged_market_state: str | None = None
_last_logged_market_trend: str | None = None
_last_logged_market_volatility: str | None = None
_same_signal_count = 0
# debug: принудительно выставить сигнал и decision
@@ -649,12 +652,115 @@ class AutoTradeService:
if not isinstance(payload, dict):
return
previous_market_state = state.market_state
previous_market_trend = state.market_trend
previous_market_volatility = state.market_volatility
state.market_state = payload.get("market_state")
state.market_trend = payload.get("market_trend")
state.market_volatility = payload.get("market_volatility")
state.market_analysis_interval = payload.get("market_analysis_interval")
state.market_analysis_reason = payload.get("market_analysis_reason")
self._log_market_state_if_changed(
state=state,
payload=payload,
previous_market_state=previous_market_state,
previous_market_trend=previous_market_trend,
previous_market_volatility=previous_market_volatility,
)
def _log_market_state_if_changed(
self,
*,
state: AutoTradeState,
payload: dict,
previous_market_state: str | None,
previous_market_trend: str | None,
previous_market_volatility: str | None,
) -> None:
market_state = state.market_state
market_trend = state.market_trend
market_volatility = state.market_volatility
if not market_state or market_state == "UNKNOWN":
return
state_changed = (
market_state != previous_market_state
and market_state != type(self)._last_logged_market_state
)
trend_changed = (
market_trend is not None
and market_trend != previous_market_trend
and market_trend != type(self)._last_logged_market_trend
)
volatility_changed = (
market_volatility is not None
and market_volatility != previous_market_volatility
and market_volatility != type(self)._last_logged_market_volatility
)
if not state_changed and not trend_changed and not volatility_changed:
return
type(self)._last_logged_market_state = market_state
type(self)._last_logged_market_trend = market_trend
type(self)._last_logged_market_volatility = market_volatility
level = self._market_journal_level(market_state)
message = self._market_state_message(market_state)
journal_payload = {
**payload,
"previous_market_state": previous_market_state,
"previous_market_trend": previous_market_trend,
"previous_market_volatility": previous_market_volatility,
"current_market_state": market_state,
"current_market_trend": market_trend,
"current_market_volatility": market_volatility,
}
try:
if level == "WARNING":
JournalService().log_ui_warning(
event_type="market_state_changed",
message=message,
screen="auto",
action="market_analysis",
payload=journal_payload,
)
return
JournalService().log_ui_info(
event_type="market_state_changed",
message=message,
screen="auto",
action="market_analysis",
payload=journal_payload,
)
except Exception:
pass
def _market_journal_level(self, market_state: str) -> str:
if market_state == "HIGH_VOLATILITY":
return "WARNING"
return "INFO"
def _market_state_message(self, market_state: str) -> str:
messages = {
"TREND_UP": "📈 Рынок перешёл в рост.",
"TREND_DOWN": "📉 Рынок перешёл в снижение.",
"RANGE": "🟰 На рынке нет выраженного направления.",
"HIGH_VOLATILITY": "⚠️ Рынок стал слишком волатильным.",
"LOW_VOLATILITY": "💤 Рынок почти не движется.",
}
return messages.get(market_state, "⏳ Состояние рынка анализируется.")
def run_cycle(self) -> AutoTradeState:
state = self.get_state()