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." />