feat: ATR-based trailing stop + rate limit monitoring

MAJOR FIXES:
- ATR-based trailing stop for runners (was fixed 0.3%, now adapts to volatility)
- Fixes runners with +7-9% MFE exiting for losses
- Typical improvement: 2.24x more room (0.3% → 0.67% at 0.45% ATR)
- Enhanced rate limit logging with database tracking
- New /api/analytics/rate-limits endpoint for monitoring

DETAILS:
- Position Manager: Calculate trailing as (atrAtEntry / price × 100) × multiplier
- Config: TRAILING_STOP_ATR_MULTIPLIER=1.5, MIN=0.25%, MAX=0.9%
- Settings UI: Added ATR multiplier controls
- Rate limits: Log hits/recoveries/exhaustions to SystemEvent table
- Documentation: ATR_TRAILING_STOP_FIX.md + RATE_LIMIT_MONITORING.md

IMPACT:
- Runners can now capture big moves (like morning's $172→$162 SOL drop)
- Rate limit visibility prevents silent failures
- Data-driven optimization for RPC endpoint health
This commit is contained in:
mindesbunister
2025-11-11 14:51:41 +01:00
parent 0700daf8ff
commit 03e91fc18d
9 changed files with 577 additions and 7 deletions

View File

@@ -35,6 +35,9 @@ interface TradingSettings {
PROFIT_LOCK_PERCENT: number
USE_TRAILING_STOP: boolean
TRAILING_STOP_PERCENT: number
TRAILING_STOP_ATR_MULTIPLIER: number
TRAILING_STOP_MIN_PERCENT: number
TRAILING_STOP_MAX_PERCENT: number
TRAILING_STOP_ACTIVATION: number
// ATR-based Dynamic Targets
@@ -608,13 +611,40 @@ export default function SettingsPage() {
description="Enable trailing stop for 25% runner position when TP2 triggers. 0 = disabled, 1 = enabled."
/>
<Setting
label="Trailing Stop Distance (%)"
label="Trailing Stop Distance (%) [FALLBACK]"
value={settings.TRAILING_STOP_PERCENT}
onChange={(v) => updateSetting('TRAILING_STOP_PERCENT', v)}
min={0.1}
max={2}
step={0.1}
description="How far below peak price (for longs) to trail the stop loss. Example: 0.3% = SL trails 0.3% below highest price reached."
description="Legacy fallback used only if ATR data is unavailable. Normally, ATR-based trailing is used instead."
/>
<Setting
label="ATR Trailing Multiplier"
value={settings.TRAILING_STOP_ATR_MULTIPLIER}
onChange={(v) => updateSetting('TRAILING_STOP_ATR_MULTIPLIER', v)}
min={1.0}
max={3.0}
step={0.1}
description="🔥 NEW: Trailing distance = (ATR × multiplier). Example: 0.5% ATR × 1.5 = 0.75% trailing. Higher = more room for runner, lower = tighter protection."
/>
<Setting
label="Min Trailing Distance (%)"
value={settings.TRAILING_STOP_MIN_PERCENT}
onChange={(v) => updateSetting('TRAILING_STOP_MIN_PERCENT', v)}
min={0.1}
max={1.0}
step={0.05}
description="Minimum trailing distance cap. Prevents ultra-tight stops in low ATR conditions."
/>
<Setting
label="Max Trailing Distance (%)"
value={settings.TRAILING_STOP_MAX_PERCENT}
onChange={(v) => updateSetting('TRAILING_STOP_MAX_PERCENT', v)}
min={0.5}
max={2.0}
step={0.1}
description="Maximum trailing distance cap. Prevents excessively wide stops in high ATR conditions."
/>
<Setting
label="Trailing Stop Activation (%)"