diff --git a/components/mission-control/TradingChart.tsx b/components/mission-control/TradingChart.tsx index b25207e..9f670e8 100644 --- a/components/mission-control/TradingChart.tsx +++ b/components/mission-control/TradingChart.tsx @@ -192,6 +192,7 @@ export function TradingChart() { const [chartData, setChartData] = useState([]) const [secondChartData, setSecondChartData] = useState([]) const [trades, setTrades] = useState([]) + const [traderFilter, setTraderFilter] = useState('all') const [thothView, setThothView] = useState>({}) const [priceData, setPriceData] = useState({ price: 0, change24h: 0 }) const [loading, setLoading] = useState(true) @@ -320,7 +321,15 @@ export function TradingChart() { } const closedTrades = trades.filter(t => t.result === 'win' || t.result === 'loss') - const wins = closedTrades.filter(t => t.result === 'win').length, winRate = closedTrades.length ? Math.round(wins / closedTrades.length * 100) : 0, totalPnl = closedTrades.reduce((s, t) => s + (t.pnl || 0), 0), avgRr = closedTrades.length ? closedTrades.reduce((s, t) => s + (t.rr || 0), 0) / closedTrades.length : 0 + const filteredTrades = traderFilter === 'all' ? trades : trades.filter(t => t.trader === traderFilter) + const filteredClosed = filteredTrades.filter(t => t.result === 'win' || t.result === 'loss') + const wins = filteredClosed.filter(t => t.result === 'win').length + const winRate = filteredClosed.length ? Math.round(wins / filteredClosed.length * 100) : 0 + const totalPnl = filteredClosed.reduce((s, t) => s + (t.pnl || 0), 0) + const avgRr = filteredClosed.length ? filteredClosed.reduce((s, t) => s + (t.rr || 0), 0) / filteredClosed.length : 0 + + // Get unique traders from trades + const tradersList = ['all', ...new Set(trades.map(t => t.trader).filter(Boolean))] const cv = thothView[selectedAsset] const getTE = (t: string) => t === 'uptrend' ? '🟢' : t === 'downtrend' ? '🔴' : '⚪️' const getBC = (b: string) => b === 'bullish' ? 'text-green-400' : b === 'bearish' ? 'text-red-400' : 'text-yellow-400' @@ -336,6 +345,24 @@ export function TradingChart() {
{(Object.keys(indicators) as (keyof IndicatorState)[]).map(k => )}
+ {/* Trader Filter */} +
+ Trader: + {tradersList.map(t => ( + + ))} +
+
{selectedAsset}/USD
${priceData.price.toLocaleString()}
= 0 ? 'text-green-400' : 'text-red-400'}`}>{priceData.change24h >= 0 ? '↑' : '↓'} {Math.abs(priceData.change24h).toFixed(2)}%
{cv &&
👁️

THOTH'S VIEW

{new Date(cv.updated_at).toLocaleString()}

"{cv.thought}"

Trend

{getTE(cv.trend)} {cv.trend}

Phase

{cv.phase}

Key Level

${cv.key_level.toLocaleString()}

Bias

{cv.bias.toUpperCase()} ({cv.confidence}/10)

} @@ -347,9 +374,9 @@ export function TradingChart() { {indicators.rsi &&
} {indicators.macd &&
} -
{[{ v: trades.filter(t => t.result === 'open').length, l: 'Open' }, { v: totalPnl, l: 'P&L', c: 'text-green-400' }, { v: winRate + '%', l: 'Win Rate' }, { v: closedTrades.length, l: 'Trades' }, { v: avgRr.toFixed(1) + ':1', l: 'Avg R:R' }].map((s, i) =>

{s.v}

{s.l}

)}
+
{[{ v: filteredTrades.filter(t => t.result === 'open').length, l: 'Open' }, { v: totalPnl, l: 'P&L', c: 'text-green-400' }, { v: winRate + '%', l: 'Win Rate' }, { v: filteredClosed.length, l: 'Trades' }, { v: avgRr.toFixed(1) + ':1', l: 'Avg R:R' }].map((s, i) =>

{s.v}

{s.l}

)}
-

📊 Trade History

{trades.length === 0 ?
No trades yet
:
{trades.map((t, i) => )}
DateAssetDirEntrySLTPR:RResult
{t.date}{t.pair}{t.direction.toUpperCase()}${t.entry.toLocaleString()}${t.stopLoss.toLocaleString()}${t.takeProfit.toLocaleString()}{t.rr?.toFixed(1)}:1{t.result === 'win' ? '✅' : t.result === 'loss' ? '❌' : '⏳'}
}
+

📊 Trade History - {traderFilter === 'all' ? 'All Traders' : traderFilter}

{filteredTrades.length === 0 ?
No trades yet
:
{filteredTrades.map((t, i) => )}
DateAssetDirEntrySLTPR:RResult
{t.date}{t.pair}{t.direction.toUpperCase()}${t.entry.toLocaleString()}${t.stopLoss.toLocaleString()}${t.takeProfit.toLocaleString()}{t.rr?.toFixed(1)}:1{t.result === 'win' ? '✅' : t.result === 'loss' ? '❌' : '⏳'}
}
) }