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:
@@ -123,6 +123,8 @@ export async function GET() {
|
|||||||
MAX_TRADES_PER_HOUR: parseInt(env.MAX_TRADES_PER_HOUR || '6'),
|
MAX_TRADES_PER_HOUR: parseInt(env.MAX_TRADES_PER_HOUR || '6'),
|
||||||
MIN_TIME_BETWEEN_TRADES: parseInt(env.MIN_TIME_BETWEEN_TRADES || '600'),
|
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: 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'),
|
SLIPPAGE_TOLERANCE: parseFloat(env.SLIPPAGE_TOLERANCE || '1.0'),
|
||||||
DRY_RUN: env.DRY_RUN === 'true',
|
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(),
|
MAX_TRADES_PER_HOUR: settings.MAX_TRADES_PER_HOUR.toString(),
|
||||||
MIN_TIME_BETWEEN_TRADES: settings.MIN_TIME_BETWEEN_TRADES.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: 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(),
|
SLIPPAGE_TOLERANCE: settings.SLIPPAGE_TOLERANCE.toString(),
|
||||||
DRY_RUN: settings.DRY_RUN.toString(),
|
DRY_RUN: settings.DRY_RUN.toString(),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,9 @@ interface TradingSettings {
|
|||||||
MAX_DAILY_DRAWDOWN: number
|
MAX_DAILY_DRAWDOWN: number
|
||||||
MAX_TRADES_PER_HOUR: number
|
MAX_TRADES_PER_HOUR: number
|
||||||
MIN_TIME_BETWEEN_TRADES: 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
|
SLIPPAGE_TOLERANCE: number
|
||||||
DRY_RUN: boolean
|
DRY_RUN: boolean
|
||||||
}
|
}
|
||||||
@@ -792,13 +794,31 @@ export default function SettingsPage() {
|
|||||||
description="Minimum wait time between trades to prevent overtrading."
|
description="Minimum wait time between trades to prevent overtrading."
|
||||||
/>
|
/>
|
||||||
<Setting
|
<Setting
|
||||||
label="Min Quality Score (0-100)"
|
label="Min Quality Score - Global Fallback (0-100)"
|
||||||
value={settings.MIN_QUALITY_SCORE}
|
value={settings.MIN_SIGNAL_QUALITY_SCORE}
|
||||||
onChange={(v) => updateSetting('MIN_QUALITY_SCORE', v)}
|
onChange={(v) => updateSetting('MIN_SIGNAL_QUALITY_SCORE', v)}
|
||||||
min={0}
|
min={0}
|
||||||
max={100}
|
max={100}
|
||||||
step={5}
|
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>
|
</Section>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user