'use client' import React, { useState, useEffect } from 'react' export default function AutomationPage() { const [config, setConfig] = useState({ mode: 'SIMULATION', dexProvider: 'DRIFT', symbol: 'SOLUSD', timeframe: '1h', tradingAmount: 100, maxLeverage: 5, stopLossPercent: 2, takeProfitPercent: 6, riskPercentage: 2 }) const [status, setStatus] = useState(null) const [balance, setBalance] = useState(null) const [positions, setPositions] = useState([]) const [isLoading, setIsLoading] = useState(false) const [balanceLoading, setBalanceLoading] = useState(false) useEffect(() => { fetchStatus() fetchBalance() fetchPositions() const interval = setInterval(() => { fetchStatus() fetchBalance() fetchPositions() }, 30000) return () => clearInterval(interval) }, []) const fetchStatus = async () => { try { const response = await fetch('/api/automation/status') const data = await response.json() if (data.success) { setStatus(data.status) } } catch (error) { console.error('Failed to fetch status:', error) } } const fetchBalance = async () => { if (config.dexProvider !== 'DRIFT') return setBalanceLoading(true) try { const response = await fetch('/api/drift/balance') const data = await response.json() if (data.success) { setBalance(data) // Auto-calculate position size based on available balance and leverage const maxPositionSize = (data.availableBalance * config.maxLeverage) * 0.9 // Use 90% of max const suggestedSize = Math.max(10, Math.min(maxPositionSize, config.tradingAmount)) setConfig(prev => ({ ...prev, tradingAmount: Math.round(suggestedSize) })) } } catch (error) { console.error('Failed to fetch balance:', error) } finally { setBalanceLoading(false) } } const fetchPositions = async () => { if (config.dexProvider !== 'DRIFT') return try { const response = await fetch('/api/drift/positions') const data = await response.json() if (data.success) { setPositions(data.positions || []) } } catch (error) { console.error('Failed to fetch positions:', error) } } const handleLeverageChange = (newLeverage) => { const leverage = parseFloat(newLeverage) // Auto-calculate position size when leverage changes if (balance?.availableBalance) { const maxPositionSize = (balance.availableBalance * leverage) * 0.9 // Use 90% of max const suggestedSize = Math.max(10, maxPositionSize) setConfig(prev => ({ ...prev, maxLeverage: leverage, tradingAmount: Math.round(suggestedSize) })) } else { setConfig(prev => ({ ...prev, maxLeverage: leverage })) } } const hasOpenPosition = positions.some(pos => pos.symbol.includes(config.symbol.replace('USD', '')) && pos.size > 0.001 ) const handleStart = async () => { setIsLoading(true) try { const response = await fetch('/api/automation/start', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(config) }) const data = await response.json() if (data.success) { fetchStatus() } else { alert('Failed to start automation: ' + data.error) } } catch (error) { console.error('Failed to start automation:', error) alert('Failed to start automation') } finally { setIsLoading(false) } } const handleStop = async () => { setIsLoading(true) try { const response = await fetch('/api/automation/stop', { method: 'POST' }) const data = await response.json() if (data.success) { fetchStatus() } else { alert('Failed to stop automation: ' + data.error) } } catch (error) { console.error('Failed to stop automation:', error) alert('Failed to stop automation') } finally { setIsLoading(false) } } return (
{/* Header */}

Automated Trading

Drift Protocol

{status?.isActive ? ( ) : ( )}
{/* Main Grid */}
{/* Configuration */}

Configuration

{/* Trading Mode */}
{/* Leverage */}
{/* Parameters */}
setConfig({...config, tradingAmount: parseFloat(e.target.value)})} className="w-full p-3 bg-gray-700 border border-gray-600 rounded-lg text-white focus:border-blue-500" disabled={status?.isActive} min="10" step="10" /> {balance && (
Available: ${balance.availableBalance?.toFixed(2)} • Using {((config.tradingAmount / balance.availableBalance) * 100).toFixed(0)}% of balance
)}
{/* Risk Management */}
setConfig({...config, stopLossPercent: parseFloat(e.target.value)})} className="w-full p-3 bg-gray-700 border border-gray-600 rounded-lg text-white focus:border-blue-500" disabled={status?.isActive} min="0.5" max="20" step="0.5" />
setConfig({...config, takeProfitPercent: parseFloat(e.target.value)})} className="w-full p-3 bg-gray-700 border border-gray-600 rounded-lg text-white focus:border-blue-500" disabled={status?.isActive} min="1" max="50" step="1" />
AI-Driven Trading
{hasOpenPosition ? 'Monitoring Position' : 'Ready to Trade'}
Bot will enter trades based on AI analysis when no position is open
{/* Status */}

Account Status

{balance ? (
Available Balance: ${balance.availableBalance?.toFixed(2)}
Account Value: ${balance.accountValue?.toFixed(2)}
Unrealized P&L: = 0 ? 'text-green-400' : 'text-red-400'}`}> {balance.unrealizedPnl >= 0 ? '+' : ''}${balance.unrealizedPnl?.toFixed(2)}
Open Positions: {positions.length}
{positions.length > 0 && (
Active Positions:
{positions.map((pos, idx) => (
{pos.symbol} {pos.side.toUpperCase()} {pos.size?.toFixed(4)}
))}
)}
) : (
{balanceLoading ? (
Loading account data...
) : (
No account data available
)}
)}

Bot Status

{status ? (
Status: {status.isActive ? 'ACTIVE' : 'STOPPED'}
Mode: {status.mode}
Protocol: DRIFT
Symbol: {config.symbol}
Leverage: {config.maxLeverage}x
Position Size: ${config.tradingAmount}
) : (

Loading...

)}

Trading Metrics

{balance?.accountValue ? `$${balance.accountValue.toFixed(0)}` : '$0'}
Portfolio
{balance?.leverage ? `${(balance.leverage * 100).toFixed(1)}%` : '0%'}
Leverage Used
= 0 ? 'text-green-400' : 'text-red-400'}`}> {balance?.unrealizedPnl ? `$${balance.unrealizedPnl.toFixed(2)}` : '$0.00'}
Unrealized P&L
{positions.length}
Open Positions
) }