fix: Make minSignalQualityScore configurable via settings + anti-chop improvements
CRITICAL BUG FIX: - Settings page saved MIN_SIGNAL_QUALITY_SCORE to .env but check-risk had hardcoded value - Now reads from config.minSignalQualityScore (defaults to 65, editable via /settings) - Prevents settings changes from being ignored after restart ANTI-CHOP FILTER FIXES: - Fixed volume breakout bonus conflicting with anti-chop filter - Volume breakout now requires ADX > 18 (trending market) - Prevents high volume + low ADX from getting rewarded instead of penalized - Anti-chop filter now properly blocks whipsaw traps at score 60 TESTING INFRASTRUCTURE: - Added backtest script showing +17.1% P&L improvement (saved $242 in losses) - Added test-signals.sh for comprehensive signal quality validation - Added test-recent-signals.sh for analyzing actual trading session signals - All tests passing: timeframe awareness, anti-chop, score thresholds CHANGES: - config/trading.ts: Added minSignalQualityScore to interface and defaults - app/api/trading/check-risk/route.ts: Use config value instead of hardcoded 65 - lib/trading/signal-quality.ts: Fixed volume breakout bonus logic - .env: Added MIN_SIGNAL_QUALITY_SCORE=65 - scripts/: Added comprehensive testing tools BACKTEST RESULTS (Last 30 trades): - Old system (score ≥60): $1,412.79 P&L - New system (score ≥65 + anti-chop): $1,654.79 P&L - Improvement: +$242.00 (+17.1%) - Blocked 5 losing trades, missed 0 winners
This commit is contained in:
@@ -50,6 +50,9 @@ export interface TradingConfig {
|
||||
trailingStopMaxPercent: number // Maximum trailing distance in percent
|
||||
trailingStopActivation: number // Activate when runner profits exceed this %
|
||||
|
||||
// Signal Quality
|
||||
minSignalQualityScore: number // Minimum quality score for initial entry (0-100)
|
||||
|
||||
// Position Scaling (add to winning positions)
|
||||
enablePositionScaling: boolean // Allow scaling into existing positions
|
||||
minScaleQualityScore: number // Minimum quality score for scaling signal (0-100)
|
||||
@@ -136,9 +139,12 @@ export const DEFAULT_TRADING_CONFIG: TradingConfig = {
|
||||
trailingStopMaxPercent: 0.9, // Cap trailing distance at 0.9%
|
||||
trailingStopActivation: 0.5, // Activate trailing when runner is +0.5% in profit
|
||||
|
||||
// Signal Quality
|
||||
minSignalQualityScore: 65, // Minimum quality score for initial entry (raised from 60)
|
||||
|
||||
// Position Scaling (conservative defaults)
|
||||
enablePositionScaling: false, // Disabled by default - enable after testing
|
||||
minScaleQualityScore: 75, // Only scale with strong signals (vs 60 for initial entry)
|
||||
minScaleQualityScore: 75, // Only scale with strong signals (vs 65 for initial entry)
|
||||
minProfitForScale: 0.4, // Position must be at/past TP1 to scale
|
||||
maxScaleMultiplier: 2.0, // Max 2x original position size total
|
||||
scaleSizePercent: 50, // Scale with 50% of original position size
|
||||
@@ -409,6 +415,9 @@ export function getConfigFromEnv(): Partial<TradingConfig> {
|
||||
trailingStopActivation: process.env.TRAILING_STOP_ACTIVATION
|
||||
? parseFloat(process.env.TRAILING_STOP_ACTIVATION)
|
||||
: undefined,
|
||||
minSignalQualityScore: process.env.MIN_SIGNAL_QUALITY_SCORE
|
||||
? parseInt(process.env.MIN_SIGNAL_QUALITY_SCORE)
|
||||
: undefined,
|
||||
enablePositionScaling: process.env.ENABLE_POSITION_SCALING
|
||||
? process.env.ENABLE_POSITION_SCALING === 'true'
|
||||
: undefined,
|
||||
|
||||
Reference in New Issue
Block a user