feat: Complete Smart Entry Validation System with Telegram notifications
Implementation: - Smart validation queue monitors quality 50-89 signals - Block & Watch strategy: queue → validate → enter if confirmed - Validation thresholds: LONG +0.3% confirms / -0.4% abandons - Validation thresholds: SHORT -0.3% confirms / +0.4% abandons - Monitoring: Every 30 seconds for 10 minute window - Auto-execution via API when price confirms direction Telegram Notifications: - ⏰ Queued: Alert when signal enters validation queue - ✅ Confirmed: Alert when price validates entry (with slippage) - ❌ Abandoned: Alert when price invalidates (saved from loser) - ⏱️ Expired: Alert when 10min window passes without confirmation - ✅ Executed: Alert when validated trade opens (with delay time) Files: - lib/trading/smart-validation-queue.ts (NEW - 460+ lines) - lib/notifications/telegram.ts (added sendValidationNotification) - app/api/trading/check-risk/route.ts (await async addSignal) Integration: - check-risk endpoint already queues signals (lines 433-452) - Startup initialization already exists - Market data cache provides 1-min price updates Expected Impact: - Recover 77% of moves from quality 50-89 false negatives - Example: +1.79% move → entry at +0.41% → capture +1.38% - Protect from weak signals that fail validation - User visibility into validation activity via Telegram Status: READY FOR DEPLOYMENT
This commit is contained in:
@@ -85,6 +85,112 @@ ${options.maxDrawdown ? `\n📉 Max Drawdown: -${options.maxDrawdown.toFixed(2)}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send Telegram notification for smart validation events
|
||||
*/
|
||||
export async function sendValidationNotification(options: {
|
||||
event: 'queued' | 'confirmed' | 'abandoned' | 'expired' | 'executed'
|
||||
symbol: string
|
||||
direction: 'long' | 'short'
|
||||
originalPrice: number
|
||||
currentPrice?: number
|
||||
qualityScore: number
|
||||
validationTime?: number // seconds
|
||||
priceChange?: number // percentage
|
||||
}): Promise<void> {
|
||||
try {
|
||||
const token = process.env.TELEGRAM_BOT_TOKEN
|
||||
const chatId = process.env.TELEGRAM_CHAT_ID
|
||||
|
||||
if (!token || !chatId) {
|
||||
return
|
||||
}
|
||||
|
||||
const directionEmoji = options.direction === 'long' ? '📈' : '📉'
|
||||
let message = ''
|
||||
|
||||
switch (options.event) {
|
||||
case 'queued':
|
||||
message = `⏰ SIGNAL QUEUED FOR VALIDATION
|
||||
|
||||
${directionEmoji} ${options.symbol} ${options.direction.toUpperCase()}
|
||||
|
||||
📊 Quality Score: ${options.qualityScore}/100
|
||||
📍 Price: $${options.originalPrice.toFixed(2)}
|
||||
|
||||
🧠 Watching for price confirmation...
|
||||
✅ Will enter if ${options.direction === 'long' ? '+0.3%' : '-0.3%'}
|
||||
❌ Will abandon if ${options.direction === 'long' ? '-0.4%' : '+0.4%'}`
|
||||
break
|
||||
|
||||
case 'confirmed':
|
||||
message = `✅ SIGNAL VALIDATED - ENTERING NOW!
|
||||
|
||||
${directionEmoji} ${options.symbol} ${options.direction.toUpperCase()}
|
||||
|
||||
💡 Original: $${options.originalPrice.toFixed(2)} (quality ${options.qualityScore})
|
||||
🎯 Confirmed: $${options.currentPrice?.toFixed(2)} (${options.priceChange! >= 0 ? '+' : ''}${options.priceChange?.toFixed(2)}%)
|
||||
|
||||
⏱ Validation Time: ${Math.floor(options.validationTime! / 60)}min ${Math.floor(options.validationTime! % 60)}s
|
||||
🚀 Executing trade now...`
|
||||
break
|
||||
|
||||
case 'abandoned':
|
||||
message = `❌ SIGNAL ABANDONED
|
||||
|
||||
${directionEmoji} ${options.symbol} ${options.direction.toUpperCase()}
|
||||
|
||||
💡 Original: $${options.originalPrice.toFixed(2)} (quality ${options.qualityScore})
|
||||
⚠️ Current: $${options.currentPrice?.toFixed(2)} (${options.priceChange! >= 0 ? '+' : ''}${options.priceChange?.toFixed(2)}%)
|
||||
|
||||
✅ Saved from potential loser!
|
||||
⏱ Monitored for ${Math.floor(options.validationTime! / 60)}min ${Math.floor(options.validationTime! % 60)}s`
|
||||
break
|
||||
|
||||
case 'expired':
|
||||
message = `⏱️ SIGNAL EXPIRED
|
||||
|
||||
${directionEmoji} ${options.symbol} ${options.direction.toUpperCase()}
|
||||
|
||||
📊 Quality: ${options.qualityScore}/100
|
||||
📍 Original Price: $${options.originalPrice.toFixed(2)}
|
||||
|
||||
⏰ No confirmation after 10 minutes
|
||||
🔄 Move wasn't strong enough`
|
||||
break
|
||||
|
||||
case 'executed':
|
||||
message = `✅ VALIDATED TRADE OPENED
|
||||
|
||||
${directionEmoji} ${options.symbol} ${options.direction.toUpperCase()}
|
||||
|
||||
💡 Original Signal: $${options.originalPrice.toFixed(2)} (quality ${options.qualityScore})
|
||||
🎯 Entry: $${options.currentPrice?.toFixed(2)}
|
||||
📊 Slippage: ${options.priceChange?.toFixed(2)}%
|
||||
|
||||
⏱ Validation took ${Math.floor(options.validationTime! / 60)}min ${Math.floor(options.validationTime! % 60)}s`
|
||||
break
|
||||
}
|
||||
|
||||
const url = `https://api.telegram.org/bot${token}/sendMessage`
|
||||
const response = await fetch(url, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
chat_id: chatId,
|
||||
text: message,
|
||||
parse_mode: 'HTML'
|
||||
})
|
||||
})
|
||||
|
||||
if (!response.ok) {
|
||||
console.error('❌ Validation Telegram notification failed')
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('❌ Error sending validation notification:', error)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get emoji for exit reason
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user