feat: implement real Drift trading history using SDK methods

- Updated getTradingHistory to fetch actual Drift order records
- Added fallback to local database for trade history
- Enhanced executeTrade to store trades in database for history tracking
- Fixed hydration issues in AutoTradingPanel and TradingHistory components
- Improved error handling and logging for trading history retrieval
This commit is contained in:
mindesbunister
2025-07-13 02:24:12 +02:00
parent 0fa687d1d7
commit 836455d1a4
6 changed files with 286 additions and 427 deletions

View File

@@ -387,175 +387,4 @@ export default function AIAnalysisPanel() {
)}
</div>
)
}
{error && (
<div className="bg-red-900/20 border border-red-800 rounded-md p-3 mb-4">
<div className="text-red-400">
{error.includes('frame was detached') ? (
<>
<strong>TradingView Error:</strong> Chart could not be loaded. Please check your symbol and layout, or try again.<br />
<span className="text-xs opacity-75">Technical: {error}</span>
</>
) : error.includes('layout not found') ? (
<>
<strong>Layout Error:</strong> TradingView layout not found. Please select a valid layout.<br />
<span className="text-xs opacity-75">Technical: {error}</span>
</>
) : error.includes('Private layout access denied') ? (
<>
<strong>Access Error:</strong> The selected layout is private or requires authentication. Try a different layout or check your TradingView login.<br />
<span className="text-xs opacity-75">Technical: {error}</span>
</>
) : (
<>
<strong>Analysis Error:</strong> {error}
</>
)}
</div>
</div>
)}
{loading && (
<div className="bg-blue-900/20 border border-blue-800 rounded-md p-3 mb-4">
<div className="flex items-center gap-3 text-blue-300">
<svg className="animate-spin h-5 w-5" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
<path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8v8z"></path>
</svg>
<span>Analyzing {symbol} chart...</span>
</div>
</div>
)}
{result && (
<div className="bg-gray-800 border border-gray-700 rounded-lg p-4 mt-4">
<h3 className="text-lg font-semibold text-white mb-3">Analysis Results</h3>
{result.layoutsAnalyzed && (
<div className="mb-4 text-sm">
<span className="text-gray-400">Layouts analyzed:</span>
<span className="ml-2 text-blue-300">{result.layoutsAnalyzed.join(', ')}</span>
</div>
)}
<div className="grid gap-3">
<div className="bg-gray-900 p-3 rounded">
<span className="text-gray-400 text-sm">Summary:</span>
<p className="text-white mt-1">{safeRender(result.summary)}</p>
</div>
<div className="grid grid-cols-2 gap-3">
<div className="bg-gray-900 p-3 rounded">
<span className="text-gray-400 text-sm">Sentiment:</span>
<p className="text-white mt-1">{safeRender(result.marketSentiment)}</p>
</div>
<div className="bg-gray-900 p-3 rounded">
<span className="text-gray-400 text-sm">Recommendation:</span>
<p className="text-white mt-1">{safeRender(result.recommendation)}</p>
<span className="text-blue-300 text-sm">({safeRender(result.confidence)}% confidence)</span>
</div>
</div>
{result.keyLevels && (
<div className="grid grid-cols-2 gap-3">
<div className="bg-gray-900 p-3 rounded">
<span className="text-gray-400 text-sm">Support Levels:</span>
<p className="text-green-300 mt-1">{result.keyLevels.support?.join(', ') || 'None identified'}</p>
</div>
<div className="bg-gray-900 p-3 rounded">
<span className="text-gray-400 text-sm">Resistance Levels:</span>
<p className="text-red-300 mt-1">{result.keyLevels.resistance?.join(', ') || 'None identified'}</p>
</div>
</div>
)}
{/* Enhanced Trading Analysis */}
{result.entry && (
<div className="bg-gray-900 p-3 rounded">
<span className="text-gray-400 text-sm">Entry:</span>
<p className="text-yellow-300 mt-1">${safeRender(result.entry.price || result.entry)}</p>
{result.entry.buffer && <p className="text-xs text-gray-400">{safeRender(result.entry.buffer)}</p>}
{result.entry.rationale && <p className="text-xs text-gray-300 mt-1">{safeRender(result.entry.rationale)}</p>}
</div>
)}
{result.stopLoss && (
<div className="bg-gray-900 p-3 rounded">
<span className="text-gray-400 text-sm">Stop Loss:</span>
<p className="text-red-300 mt-1">${safeRender(result.stopLoss.price || result.stopLoss)}</p>
{result.stopLoss.rationale && <p className="text-xs text-gray-300 mt-1">{safeRender(result.stopLoss.rationale)}</p>}
</div>
)}
{result.takeProfits && (
<div className="bg-gray-900 p-3 rounded">
<span className="text-gray-400 text-sm">Take Profits:</span>
{typeof result.takeProfits === 'object' ? (
<>
{result.takeProfits.tp1 && (
<div className="mt-1">
<p className="text-green-300">TP1: ${safeRender(result.takeProfits.tp1.price || result.takeProfits.tp1)}</p>
{result.takeProfits.tp1.description && <p className="text-xs text-gray-300">{safeRender(result.takeProfits.tp1.description)}</p>}
</div>
)}
{result.takeProfits.tp2 && (
<div className="mt-1">
<p className="text-green-300">TP2: ${safeRender(result.takeProfits.tp2.price || result.takeProfits.tp2)}</p>
{result.takeProfits.tp2.description && <p className="text-xs text-gray-300">{safeRender(result.takeProfits.tp2.description)}</p>}
</div>
)}
</>
) : (
<p className="text-green-300 mt-1">{safeRender(result.takeProfits)}</p>
)}
</div>
)}
{result.riskToReward && (
<div className="bg-gray-900 p-3 rounded">
<span className="text-gray-400 text-sm">Risk to Reward:</span>
<p className="text-blue-300 mt-1">{safeRender(result.riskToReward)}</p>
</div>
)}
{result.confirmationTrigger && (
<div className="bg-gray-900 p-3 rounded">
<span className="text-gray-400 text-sm">Confirmation Trigger:</span>
<p className="text-orange-300 mt-1">{safeRender(result.confirmationTrigger)}</p>
</div>
)}
{result.indicatorAnalysis && (
<div className="bg-gray-900 p-3 rounded">
<span className="text-gray-400 text-sm">Indicator Analysis:</span>
{typeof result.indicatorAnalysis === 'object' ? (
<div className="mt-1 space-y-1">
{result.indicatorAnalysis.rsi && (
<div>
<span className="text-purple-300 text-xs">RSI:</span>
<span className="text-white text-xs ml-2">{safeRender(result.indicatorAnalysis.rsi)}</span>
</div>
)}
{result.indicatorAnalysis.vwap && (
<div>
<span className="text-cyan-300 text-xs">VWAP:</span>
<span className="text-white text-xs ml-2">{safeRender(result.indicatorAnalysis.vwap)}</span>
</div>
)}
{result.indicatorAnalysis.obv && (
<div>
<span className="text-indigo-300 text-xs">OBV:</span>
<span className="text-white text-xs ml-2">{safeRender(result.indicatorAnalysis.obv)}</span>
</div>
)}
</div>
) : (
<p className="text-white mt-1">{safeRender(result.indicatorAnalysis)}</p>
)}
</div>
)}
<div className="bg-gray-900 p-3 rounded">
<span className="text-gray-400 text-sm">Reasoning:</span>
<p className="text-white mt-1">{safeRender(result.reasoning)}</p>
</div>
</div>
</div>
)}
</div>
)
}