From 4dc42075cba25f8876d1f69e8796e76d19b87fec Mon Sep 17 00:00:00 2001 From: mindesbunister Date: Sun, 23 Nov 2025 15:26:13 +0100 Subject: [PATCH] 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 --- app/api/settings/route.ts | 4 ++++ app/settings/page.tsx | 30 +++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/app/api/settings/route.ts b/app/api/settings/route.ts index 5124eac..2a6ae24 100644 --- a/app/api/settings/route.ts +++ b/app/api/settings/route.ts @@ -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(), } diff --git a/app/settings/page.tsx b/app/settings/page.tsx index b8c6910..4664618 100644 --- a/app/settings/page.tsx +++ b/app/settings/page.tsx @@ -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." /> 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." + /> + 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)." + /> + 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." />