diff --git a/.env b/.env index a6eecbf..ec95dfb 100644 --- a/.env +++ b/.env @@ -131,7 +131,7 @@ MAX_TRADES_PER_HOUR=20 # Minimum time between trades in minutes (cooldown period) # Example: 10 = 10 minutes between trades -MIN_TIME_BETWEEN_TRADES=21 +MIN_TIME_BETWEEN_TRADES=10 # DEX execution settings # Maximum acceptable slippage on market orders (percentage) diff --git a/app/api/settings/route.ts b/app/api/settings/route.ts index 8a7aaf1..38facbf 100644 --- a/app/api/settings/route.ts +++ b/app/api/settings/route.ts @@ -79,6 +79,7 @@ export async function GET() { MAX_DAILY_DRAWDOWN: parseFloat(env.MAX_DAILY_DRAWDOWN || '-50'), MAX_TRADES_PER_HOUR: parseInt(env.MAX_TRADES_PER_HOUR || '6'), MIN_TIME_BETWEEN_TRADES: parseInt(env.MIN_TIME_BETWEEN_TRADES || '600'), + MIN_QUALITY_SCORE: parseInt(env.MIN_QUALITY_SCORE || '60'), SLIPPAGE_TOLERANCE: parseFloat(env.SLIPPAGE_TOLERANCE || '1.0'), DRY_RUN: env.DRY_RUN === 'true', } @@ -115,6 +116,7 @@ export async function POST(request: NextRequest) { MAX_DAILY_DRAWDOWN: settings.MAX_DAILY_DRAWDOWN.toString(), MAX_TRADES_PER_HOUR: settings.MAX_TRADES_PER_HOUR.toString(), MIN_TIME_BETWEEN_TRADES: settings.MIN_TIME_BETWEEN_TRADES.toString(), + MIN_QUALITY_SCORE: settings.MIN_QUALITY_SCORE.toString(), SLIPPAGE_TOLERANCE: settings.SLIPPAGE_TOLERANCE.toString(), DRY_RUN: settings.DRY_RUN.toString(), } diff --git a/app/api/trading/check-risk/route.ts b/app/api/trading/check-risk/route.ts index 42ec907..446a08d 100644 --- a/app/api/trading/check-risk/route.ts +++ b/app/api/trading/check-risk/route.ts @@ -153,7 +153,8 @@ export async function POST(request: NextRequest): Promise= minScore, score, diff --git a/app/api/trading/execute/route.ts b/app/api/trading/execute/route.ts index e37a7aa..762f9b2 100644 --- a/app/api/trading/execute/route.ts +++ b/app/api/trading/execute/route.ts @@ -13,84 +13,6 @@ import { getMergedConfig } from '@/config/trading' import { getInitializedPositionManager, ActiveTrade } from '@/lib/trading/position-manager' import { createTrade } from '@/lib/database/trades' -/** - * Calculate signal quality score (same logic as check-risk endpoint) - */ -function calculateQualityScore(params: { - atr?: number - adx?: number - rsi?: number - volumeRatio?: number - pricePosition?: number - direction: 'long' | 'short' -}): number | undefined { - // If no metrics provided, return undefined - if (!params.atr || params.atr === 0) { - return undefined - } - - let score = 50 // Base score - - // ATR check - if (params.atr < 0.6) { - score -= 15 - } else if (params.atr > 2.5) { - score -= 20 - } else { - score += 10 - } - - // ADX check - if (params.adx && params.adx > 0) { - if (params.adx > 25) { - score += 15 - } else if (params.adx < 18) { - score -= 15 - } else { - score += 5 - } - } - - // RSI check - if (params.rsi && params.rsi > 0) { - if (params.direction === 'long') { - if (params.rsi > 50 && params.rsi < 70) { - score += 10 - } else if (params.rsi > 70) { - score -= 10 - } - } else { - if (params.rsi < 50 && params.rsi > 30) { - score += 10 - } else if (params.rsi < 30) { - score -= 10 - } - } - } - - // Volume check - if (params.volumeRatio && params.volumeRatio > 0) { - if (params.volumeRatio > 1.2) { - score += 10 - } else if (params.volumeRatio < 0.8) { - score -= 10 - } - } - - // Price position check - if (params.pricePosition && params.pricePosition > 0) { - if (params.direction === 'long' && params.pricePosition > 90) { - score -= 15 - } else if (params.direction === 'short' && params.pricePosition < 10) { - score -= 15 - } else { - score += 5 - } - } - - return score -} - export interface ExecuteTradeRequest { symbol: string // TradingView symbol (e.g., 'SOLUSDT') direction: 'long' | 'short' @@ -166,14 +88,6 @@ export async function POST(request: NextRequest): Promise + updateSetting('MIN_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." + /> {/* Execution */} diff --git a/config/trading.ts b/config/trading.ts index 5539573..3565380 100644 --- a/config/trading.ts +++ b/config/trading.ts @@ -39,6 +39,7 @@ export interface TradingConfig { maxDailyDrawdown: number // USD stop trading threshold maxTradesPerHour: number // Limit overtrading minTimeBetweenTrades: number // Cooldown period (minutes) + minQualityScore: number // Minimum signal quality score (0-100) to accept trade // Execution useMarketOrders: boolean // true = instant execution @@ -95,6 +96,7 @@ export const DEFAULT_TRADING_CONFIG: TradingConfig = { maxDailyDrawdown: -150, // Stop trading if daily loss exceeds $150 (-15%) maxTradesPerHour: 6, // Max 6 trades per hour minTimeBetweenTrades: 10, // 10 minutes cooldown + minQualityScore: 60, // Minimum 60/100 quality score to accept trade // Execution useMarketOrders: true, // Use market orders for reliable fills @@ -255,6 +257,9 @@ export function getConfigFromEnv(): Partial { minTimeBetweenTrades: process.env.MIN_TIME_BETWEEN_TRADES ? parseInt(process.env.MIN_TIME_BETWEEN_TRADES) : undefined, + minQualityScore: process.env.MIN_QUALITY_SCORE + ? parseInt(process.env.MIN_QUALITY_SCORE) + : undefined, } }