feat: add quality score display and timezone fixes
- Add qualityScore to ExecuteTradeResponse interface and response object - Update analytics page to always show Signal Quality card (N/A if unavailable) - Fix n8n workflow to pass context metrics and qualityScore to execute endpoint - Fix timezone in Telegram notifications (Europe/Berlin) - Fix symbol normalization in /api/trading/close endpoint - Update Drift ETH-PERP minimum order size (0.002 ETH not 0.01) - Add transaction confirmation to closePosition() to prevent phantom closes - Add 30-second grace period for new trades in Position Manager - Fix execution order: database save before Position Manager.addTrade() - Update copilot instructions with transaction confirmation pattern
This commit is contained in:
@@ -313,28 +313,27 @@ export default function AnalyticsPage() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{lastTrade.signalQualityScore !== undefined ? (
|
||||
<div className="bg-gray-700/30 rounded-lg p-4">
|
||||
<div className="text-sm text-gray-400 mb-1">Signal Quality</div>
|
||||
<div className={`text-xl font-bold ${lastTrade.signalQualityScore >= 80 ? 'text-green-400' : lastTrade.signalQualityScore >= 70 ? 'text-yellow-400' : 'text-orange-400'}`}>
|
||||
{lastTrade.signalQualityScore}/100
|
||||
</div>
|
||||
<div className="text-xs text-gray-500">
|
||||
{lastTrade.signalQualityScore >= 80 ? 'Excellent' : lastTrade.signalQualityScore >= 70 ? 'Good' : 'Marginal'}
|
||||
</div>
|
||||
</div>
|
||||
) : lastTrade.exitTime && lastTrade.exitPrice ? (
|
||||
<div className="bg-gray-700/30 rounded-lg p-4">
|
||||
<div className="text-sm text-gray-400 mb-1">Exit</div>
|
||||
<div className="text-xl font-bold text-white">${lastTrade.exitPrice.toFixed(4)}</div>
|
||||
<div className="text-xs text-gray-500">
|
||||
{new Date(lastTrade.exitTime).toLocaleString()}
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
<div className="bg-gray-700/30 rounded-lg p-4">
|
||||
<div className="text-sm text-gray-400 mb-1">Signal Quality</div>
|
||||
{lastTrade.signalQualityScore !== undefined ? (
|
||||
<>
|
||||
<div className={`text-xl font-bold ${lastTrade.signalQualityScore >= 80 ? 'text-green-400' : lastTrade.signalQualityScore >= 70 ? 'text-yellow-400' : 'text-orange-400'}`}>
|
||||
{lastTrade.signalQualityScore}/100
|
||||
</div>
|
||||
<div className="text-xs text-gray-500">
|
||||
{lastTrade.signalQualityScore >= 80 ? 'Excellent' : lastTrade.signalQualityScore >= 70 ? 'Good' : 'Marginal'}
|
||||
</div>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<div className="text-xl font-bold text-gray-500">N/A</div>
|
||||
<div className="text-xs text-gray-500">No score available</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{lastTrade.exitTime && lastTrade.exitPrice && lastTrade.signalQualityScore !== undefined && (
|
||||
{lastTrade.exitTime && lastTrade.exitPrice && (
|
||||
<div className="grid md:grid-cols-1 gap-4 mb-4">
|
||||
<div className="bg-gray-700/30 rounded-lg p-4">
|
||||
<div className="text-sm text-gray-400 mb-1">Exit</div>
|
||||
|
||||
Reference in New Issue
Block a user