-
- {(['BTC', 'SOL', 'ETH'] as const).map(a => (
-
- ))}
-
-
- {(['15m', '1h', '4h', '1D'] as const).map(tf => (
-
- ))}
-
+
{(['BTC', 'SOL', 'ETH'] as const).map(a => )}
+
{(['15m', '1h', '4h', '1D'] as const).map(tf => )}
- {/* Indicator toggles */}
-
-
-
-
-
-
-
+
Compare:{(['15m', '1h', '4h', '1D'] as const).map(tf => )}
-
-
- {selectedAsset}/USD
-
-
-
${priceData.price.toLocaleString()}
-
= 0 ? 'text-green-400' : 'text-red-400'}`}>
- {priceData.change24h >= 0 ? '↑' : '↓'} {Math.abs(priceData.change24h).toFixed(2)}%
-
-
-
+
{(Object.keys(indicators) as (keyof IndicatorState)[]).map(k => )}
- {cv && (
-
-
- 👁️
-
THOTH'S VIEW
- {new Date(cv.updated_at).toLocaleString()}
-
-
"{cv.thought}"
-
-
Trend
{getTE(cv.trend)} {cv.trend}
-
-
Key Level
${cv.key_level.toLocaleString()}
-
Bias
{cv.bias.toUpperCase()} ({cv.confidence}/10)
-
-
- )}
+
{selectedAsset}/USD
${priceData.price.toLocaleString()}
= 0 ? 'text-green-400' : 'text-red-400'}`}>{priceData.change24h >= 0 ? '↑' : '↓'} {Math.abs(priceData.change24h).toFixed(2)}%
-
- {loading && (
-
- Loading...
-
- )}
-
-
+ {cv &&
👁️
THOTH'S VIEW
{new Date(cv.updated_at).toLocaleString()}"{cv.thought}"
Trend
{getTE(cv.trend)} {cv.trend}
Key Level
${cv.key_level.toLocaleString()}
Bias
{cv.bias.toUpperCase()} ({cv.confidence}/10)
}
-
-
-
Trades
-
{closedTrades.length}
-
-
-
Win Rate
-
{winRate}%
-
-
-
Total PnL
-
= 0 ? 'text-green-400' : 'text-red-400'}`}>${totalPnl.toFixed(2)}
-
-
-
Avg R:R
-
{avgRr.toFixed(2)}R
-
-
+
+
+ {secondTimeframe && secondChartData.length > 0 &&
}
+
+ {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) =>
)}
+
+
📊 Trade History
{trades.length === 0 ?
No trades yet
:
| Date | Asset | Dir | Entry | SL | TP | R:R | Result |
{trades.map((t, i) => | {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' ? '❌' : '⏳'} |
)}
}
)
}
+
+function SecondChart({ data }: { data: ChartData[] }) {
+ const ref = useRef