07.4.4.1.9 Adaptive Market Diagnostics Layer

This commit is contained in:
2026-05-11 22:09:16 +03:00
parent 9ba1297c46
commit 5325ea3855
10 changed files with 500 additions and 7 deletions

View File

@@ -5,7 +5,12 @@ from __future__ import annotations
import time
from src.integrations.exchange.service import ExchangeService
from src.trading.market_analysis.models import MarketState
from src.trading.market_analysis.models import (
MarketPhase,
MarketState,
TrendQuality,
TrendStrength,
)
from src.trading.market_analysis.service import MarketAnalysisService
from src.trading.strategies.base import StrategyContext
from src.trading.strategies.signals import SignalResult, SignalType
@@ -116,6 +121,11 @@ class TrendStrategy:
"market_analysis_interval": market.interval,
"market_analysis_reason": market.reason,
"market_analysis": market.payload,
"market_trend_strength": market.trend_strength.value,
"market_trend_quality": market.trend_quality.value,
"market_phase": market.market_phase.value,
"market_trend_gap_percent": market.trend_gap_percent,
"market_trend_consistency": market.trend_consistency,
"runtime_window_ttl_seconds": self._window_ttl_seconds,
"runtime_window_size": len(prices),
}
@@ -133,6 +143,42 @@ class TrendStrategy:
},
)
if market.trend_strength == TrendStrength.WEAK:
return SignalResult(
signal=SignalType.HOLD,
reason="TREND есть, но сила тренда слабая.",
confidence=0.0,
payload={
**base_payload,
"entry_block_reason": "WEAK_MARKET_TREND",
"entry_block_message": "слабый тренд",
},
)
if market.trend_quality == TrendQuality.NOISY:
return SignalResult(
signal=SignalType.HOLD,
reason="TREND есть, но движение шумное.",
confidence=0.0,
payload={
**base_payload,
"entry_block_reason": "NOISY_MARKET_TREND",
"entry_block_message": "шумный тренд",
},
)
if market.market_phase == MarketPhase.PULLBACK:
return SignalResult(
signal=SignalType.HOLD,
reason="TREND есть, но рынок находится в откате.",
confidence=0.0,
payload={
**base_payload,
"entry_block_reason": "MARKET_PULLBACK",
"entry_block_message": "откат",
},
)
if len(prices) < self._window_size:
return SignalResult(
signal=SignalType.HOLD,