feat: Add direction-specific quality thresholds to settings UI

- Added MIN_SIGNAL_QUALITY_SCORE_LONG and _SHORT fields to Settings interface
- Replaced single quality score field with three fields:
  1. Global Fallback (91) - for BTC and other symbols
  2. LONG Signals (90) - based on 71.4% WR data analysis
  3. SHORT Signals (95) - based on toxic 28.6% WR data, blocks low-quality shorts
- Updated app/api/settings/route.ts GET/POST handlers to support direction-specific fields
- Fixed field naming consistency (MIN_SIGNAL_QUALITY_SCORE vs MIN_QUALITY_SCORE)
- User can now adjust direction-specific thresholds via settings UI without .env editing
- Container deployed: 2025-11-23T14:25:34 UTC
This commit is contained in:
mindesbunister
2025-11-23 15:26:13 +01:00
parent 4f6a4b76cf
commit 4dc42075cb
2 changed files with 29 additions and 5 deletions

View File

@@ -123,6 +123,8 @@ export async function GET() {
MAX_TRADES_PER_HOUR: parseInt(env.MAX_TRADES_PER_HOUR || '6'),
MIN_TIME_BETWEEN_TRADES: parseInt(env.MIN_TIME_BETWEEN_TRADES || '600'),
MIN_SIGNAL_QUALITY_SCORE: parseInt(env.MIN_SIGNAL_QUALITY_SCORE || '60'),
MIN_SIGNAL_QUALITY_SCORE_LONG: parseInt(env.MIN_SIGNAL_QUALITY_SCORE_LONG || env.MIN_SIGNAL_QUALITY_SCORE || '60'),
MIN_SIGNAL_QUALITY_SCORE_SHORT: parseInt(env.MIN_SIGNAL_QUALITY_SCORE_SHORT || env.MIN_SIGNAL_QUALITY_SCORE || '60'),
SLIPPAGE_TOLERANCE: parseFloat(env.SLIPPAGE_TOLERANCE || '1.0'),
DRY_RUN: env.DRY_RUN === 'true',
}
@@ -190,6 +192,8 @@ export async function POST(request: NextRequest) {
MAX_TRADES_PER_HOUR: settings.MAX_TRADES_PER_HOUR.toString(),
MIN_TIME_BETWEEN_TRADES: settings.MIN_TIME_BETWEEN_TRADES.toString(),
MIN_SIGNAL_QUALITY_SCORE: settings.MIN_SIGNAL_QUALITY_SCORE.toString(),
MIN_SIGNAL_QUALITY_SCORE_LONG: settings.MIN_SIGNAL_QUALITY_SCORE_LONG.toString(),
MIN_SIGNAL_QUALITY_SCORE_SHORT: settings.MIN_SIGNAL_QUALITY_SCORE_SHORT.toString(),
SLIPPAGE_TOLERANCE: settings.SLIPPAGE_TOLERANCE.toString(),
DRY_RUN: settings.DRY_RUN.toString(),
}

View File

@@ -59,7 +59,9 @@ interface TradingSettings {
MAX_DAILY_DRAWDOWN: number
MAX_TRADES_PER_HOUR: number
MIN_TIME_BETWEEN_TRADES: number
MIN_QUALITY_SCORE: number
MIN_SIGNAL_QUALITY_SCORE: number
MIN_SIGNAL_QUALITY_SCORE_LONG: number
MIN_SIGNAL_QUALITY_SCORE_SHORT: number
SLIPPAGE_TOLERANCE: number
DRY_RUN: boolean
}
@@ -792,13 +794,31 @@ export default function SettingsPage() {
description="Minimum wait time between trades to prevent overtrading."
/>
<Setting
label="Min Quality Score (0-100)"
value={settings.MIN_QUALITY_SCORE}
onChange={(v) => updateSetting('MIN_QUALITY_SCORE', v)}
label="Min Quality Score - Global Fallback (0-100)"
value={settings.MIN_SIGNAL_QUALITY_SCORE}
onChange={(v) => updateSetting('MIN_SIGNAL_QUALITY_SCORE', v)}
min={0}
max={100}
step={5}
description="Minimum signal quality score required to accept a trade. Signals below this score will be blocked."
description="Global fallback minimum quality score (used for BTC and other symbols). Direction-specific thresholds override this for SOL/ETH."
/>
<Setting
label="Min Quality Score - LONG Signals (0-100)"
value={settings.MIN_SIGNAL_QUALITY_SCORE_LONG}
onChange={(v) => updateSetting('MIN_SIGNAL_QUALITY_SCORE_LONG', v)}
min={0}
max={100}
step={5}
description="Minimum quality for LONG signals. Set to 90 based on data: quality 90-94 longs show 71.4% WR (+$44.77 profit)."
/>
<Setting
label="Min Quality Score - SHORT Signals (0-100)"
value={settings.MIN_SIGNAL_QUALITY_SCORE_SHORT}
onChange={(v) => updateSetting('MIN_SIGNAL_QUALITY_SCORE_SHORT', v)}
min={0}
max={100}
step={5}
description="Minimum quality for SHORT signals. Set to 95 based on data: quality 90-94 shorts show 28.6% WR (-$553.76 toxic). Blocks low-quality shorts."
/>
</Section>