'use client'
import { useState, useEffect } from 'react'
import { TradingChart } from './TradingChart'
type TradingTab = 'research' | 'strategies' | 'execution' | 'journal'
interface Trader {
id: string
name: string
status: 'learning' | 'active' | 'paused'
framesAnalyzed: number
patterns: string[]
entryRules: string[]
exitRules: string[]
indicators: string[]
riskParams: string[]
}
interface Trade {
id: string
trader: string
pair: string
direction: 'long' | 'short'
entryPrice: number
exitPrice?: number
status: 'open' | 'closed' | 'cancelled'
pnl?: number
pnlPercent?: number
reason: string
setup: string
timeframe: string
openedAt: string
closedAt?: string
notes: string
isDemo: boolean
traderStyle?: string // NEW: tracks which trader style was used
}
const defaultTraders: Trader[] = [
{
id: 'dopetrades',
name: 'DopeTrades',
status: 'learning',
framesAnalyzed: 922,
patterns: ['Accumulation/Distribution', 'Trend Legs', 'Support/Resistance', 'Pop Pattern'],
entryRules: ['Identify trend on higher timeframe', 'Find demand/supply zones', 'Wait for retest', '2.5:1 min risk:reward'],
exitRules: ['Stop below demand (long)', 'Target recent highs', 'Scale 50% at 1:1'],
indicators: ['Price Action Only', 'Horizontal S/R Lines'],
riskParams: ['2.5:1 minimum', 'No revenge trading', 'Paper trading first']
},
{
id: 'gareth_soloway',
name: 'Gareth Soloway',
status: 'learning',
framesAnalyzed: 5970,
patterns: ['Institutional Analysis', 'Yield Curve Signals', 'Cycle Top/Bottom', 'Epic Resistance Rejections'],
entryRules: ['Track institutional activity', 'Wait for yield curve signals', 'Key level breaks with volume', 'Weekly analysis first'],
exitRules: ['Stop below support (long)', 'Target structure highs/lows', '2:1 minimum'],
indicators: ['VWAP', 'MACD', 'Volume', '10-Year Yield', 'Support/Resistance'],
riskParams: ['No-hype sizing', 'Never average down', 'Respect stops', 'Preservation > profits']
}
]
// Execute Trade Modal Component
function ExecuteTradeModal({
traders,
selectedTrader,
onClose,
onTradeExecuted
}: {
traders: Trader[]
selectedTrader: string
onClose: () => void
onTradeExecuted: (trade: Trade) => void
}) {
const [form, setForm] = useState({
pair: 'BTC/USD',
direction: 'long' as 'long' | 'short',
isDemo: true,
entryPrice: '',
timeframe: '4H',
setup: ''
})
const submitTrade = () => {
const trader = traders.find(t => t.id === selectedTrader)
const trade: Trade = {
id: Date.now().toString(),
trader: trader?.name || 'Unknown',
pair: form.pair,
direction: form.direction,
entryPrice: parseFloat(form.entryPrice) || 0,
status: 'open',
isDemo: form.isDemo,
openedAt: new Date().toISOString(),
setup: form.setup || `${trader?.name} setup`,
timeframe: form.timeframe,
reason: '',
notes: '',
traderStyle: selectedTrader
}
// Save to API
fetch('/api/trading/trades', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(trade)
}).then(() => {
onTradeExecuted(trade)
})
}
const trader = traders.find(t => t.id === selectedTrader)
return (
Execute Trade
{/* Trader Style Badge */}
Trading Style
{trader?.name}
{/* Pair */}
{/* Direction */}
{/* Entry Price */}
setForm({...form, entryPrice: e.target.value})}
placeholder="0.00"
className="w-full bg-white/10 border border-white/20 rounded-lg px-3 py-2 text-white"
/>
{/* Timeframe */}
{/* Demo/Real */}
{/* Setup Note */}
setForm({...form, setup: e.target.value})}
placeholder="What setup is this?"
className="w-full bg-white/10 border border-white/20 rounded-lg px-3 py-2 text-white"
/>
)
}
export function TradingPanel() {
const [activeTab, setActiveTab] = useState('research')
const [traders, setTraders] = useState(defaultTraders)
const [selectedTrader, setSelectedTrader] = useState('dopetrades')
const [showFullAnalysis, setShowFullAnalysis] = useState(null)
const [showExecuteTrade, setShowExecuteTrade] = useState(false)
const [trades, setTrades] = useState([])
const [journalFilter, setJournalFilter] = useState<'all' | 'demo' | 'real'>('all')
// Load data
useEffect(() => {
loadTraders()
loadTrades()
}, [])
const loadTraders = async () => {
try {
const res = await fetch('/api/trading/traders')
if (res.ok) {
const data = await res.json()
if (data.traders?.length > 0) setTraders(data.traders)
}
} catch (e) {}
}
const loadTrades = async () => {
try {
const res = await fetch('/api/trading/trades')
if (res.ok) {
const data = await res.json()
if (data.trades) setTrades(data.trades)
}
} catch (e) {}
}
const tabs = [
{ id: 'research', label: '🔬 Deep Research', count: traders.filter(t => t.status === 'learning').length },
{ id: 'strategies', label: '🎯 Strategies', count: traders.filter(t => t.status === 'active').length },
{ id: 'execution', label: '⚡ Execution', count: trades.filter(t => t.status === 'open').length },
{ id: 'journal', label: '📔 Journal', count: trades.length },
]
const filteredTrades = trades.filter(t => {
if (journalFilter === 'all') return true
if (journalFilter === 'demo') return t.isDemo
return !t.isDemo
})
const openTrades = trades.filter(t => t.status === 'open')
const closedDemoTrades = trades.filter(t => t.status === 'closed' && t.isDemo)
const closedRealTrades = trades.filter(t => t.status === 'closed' && !t.isDemo)
const totalPnl = closedRealTrades.reduce((sum, t) => sum + (t.pnl || 0), 0)
const winRate = closedRealTrades.length > 0
? Math.round((closedRealTrades.filter(t => (t.pnl || 0) > 0).length / closedRealTrades.length) * 100)
: 0
return (
{/* Tab Navigation */}
{tabs.map(tab => (
))}
{/* Research Tab */}
{activeTab === 'research' && (
🔬 Deep Research
Learn trading strategies from experts by analyzing their content.
{traders.map(trader => (
👨🏫
{trader.name}
{trader.framesAnalyzed} frames analyzed
{trader.status}
{trader.patterns.length > 0 && (
{trader.patterns.map(p => (
{p}
))}
)}
))}
)}
{/* Strategies Tab */}
{activeTab === 'strategies' && (
🎯 Trading Strategies
Select a trader style to follow for your next trade.
{traders.filter(t => t.status === 'active').map(trader => (
))}
{traders.find(t => t.id === selectedTrader) && (
{traders.find(t => t.id === selectedTrader)?.name} Strategy
Entry Rules
{traders.find(t => t.id === selectedTrader)?.entryRules.map(r => (
- {r}
))}
{traders.find(t => t.id === selectedTrader)?.entryRules.length === 0 && (
No entry rules defined yet
)}
Exit Rules
{traders.find(t => t.id === selectedTrader)?.exitRules.map(r => (
- {r}
))}
Indicators
{traders.find(t => t.id === selectedTrader)?.indicators.map(i => (
{i}
))}
Risk Parameters
{traders.find(t => t.id === selectedTrader)?.riskParams.map(r => (
- {r}
))}
)}
)}
{/* Execution Tab */}
{activeTab === 'execution' && (
)}
{/* Journal Tab */}
{activeTab === 'journal' && (
📔 Trading Journal
{/* Per-Trader Stats */}
📊 Performance by Trader Style
{traders.filter(t => t.status !== 'paused').map(trader => {
const traderTrades = trades.filter(t => t.traderStyle === trader.id)
const closedTrades = traderTrades.filter(t => t.status === 'closed' && !t.isDemo)
const wins = closedTrades.filter(t => (t.pnl || 0) > 0).length
const totalPnl = closedTrades.reduce((sum, t) => sum + (t.pnl || 0), 0)
const winRate = closedTrades.length > 0 ? Math.round((wins / closedTrades.length) * 100) : 0
return (
{trader.name}
({traderTrades.length} trades)
= 0 ? 'text-green-400' : 'text-red-400'}`}>
${totalPnl.toFixed(2)}
| {winRate}% WR
)
})}
{/* Overall Stats */}
${totalPnl.toFixed(2)}
Real P&L
{closedRealTrades.length}
Real Trades
{/* Filter */}
{(['all', 'demo', 'real'] as const).map(filter => (
))}
{/* Trades List */}
{filteredTrades.length === 0 ? (
No trades yet
) : (
filteredTrades.map(trade => (
0
? 'bg-green-500/10 border-green-500/30'
: 'bg-red-500/10 border-red-500/30'
}`}
>
{trade.pair}
{trade.direction.toUpperCase()}
{trade.isDemo && (Demo)}
{trade.status === 'closed' && (
= 0 ? 'text-green-400' : 'text-red-400'}`}>
{trade.pnl >= 0 ? '+' : ''}{trade.pnl?.toFixed(2)} ({trade.pnlPercent?.toFixed(1)}%)
)}
{trade.setup}
{trade.timeframe}
{new Date(trade.openedAt).toLocaleDateString()}
))
)}
)}
{/* Full Analysis Modal */}
{showFullAnalysis && (
{(() => {
const trader = traders.find(t => t.id === showFullAnalysis)
if (!trader) return null
return (
{trader.name}
{trader.framesAnalyzed} frames analyzed • {trader.status}
{/* Patterns */}
📊 Patterns
{trader.patterns.map(p => (
{p}
))}
{/* Entry Rules */}
✅ Entry Rules
{trader.entryRules.map((r, i) => (
-
•
{r}
))}
{/* Exit Rules */}
🚪 Exit Rules
{trader.exitRules.map((r, i) => (
-
•
{r}
))}
{/* Indicators */}
📈 Indicators
{trader.indicators.map(i => (
{i}
))}
{/* Risk Params */}
⚠️ Risk Parameters
{trader.riskParams.map((r, i) => (
-
•
{r}
))}
{/* Timeframe */}
⏱️ Timeframe
{trader.timeframe}
{/* Notes */}
{trader.notes && (
)}
)
})()}
)}
{/* Execute Trade Modal */}
{showExecuteTrade && (
setShowExecuteTrade(false)}
onTradeExecuted={(trade) => {
setTrades([trade, ...trades])
setShowExecuteTrade(false)
}}
/>
)}
)
}