We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/TheMacroeconomicDao/bybit-ai-trader'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
# 🚀 ПРОМПТ: Trading Terminal - Финальные Улучшения
## ЦЕЛЬ
Исправить критические проблемы и улучшить функциональность Trading Terminal после очистки проекта.
## КОНТЕКСТ
После очистки проекта и удаления старого режима остались несколько TODO и недоделанных функций:
- Entry Time в PositionDetailReport использует демо-данные
- Win Rate всегда показывает 0%
- AI Confidence всегда показывает 85%
- Нет уведомлений об операциях
- Много debug логов в production коде
---
## 📋 ЗАДАЧИ
### 1. КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ
#### 1.1. Entry Time в PositionDetailReport
**Проблема:** Используется демо-время вместо реального времени входа в позицию
**Файл:** `bybit-mcp/webui/src/components/PositionDetailReport.ts` (строка 220)
**Текущий код:**
```typescript
const entryTime = currentTime - 3600; // Entry time (1 hour ago for demo, should use actual entry time)
```
**Задача:**
- [ ] Использовать реальное время входа из позиции
- [ ] Проверить, есть ли поле `time_in_trade`, `created_at`, `opened_at` или `entry_time` в интерфейсе `TradingPosition`
- [ ] Если время входа недоступно, использовать текущее время минус `time_in_trade` (если доступно)
- [ ] Если ничего не доступно, оставить текущую логику, но убрать комментарий "for demo"
**Ожидаемый результат:** Маркер Entry на графике показывает реальное время входа в позицию
---
#### 1.2. Win Rate в Header Metrics
**Проблема:** Win Rate всегда показывает 0% (TODO комментарий)
**Файл:** `bybit-mcp/webui/src/utils/headerMetrics.ts` (строка 122)
**Текущий код:**
```typescript
const winRate = 0; // TODO: Calculate from trade history
```
**Задача:**
- [ ] Получить историю сделок через `tradingDataService` или MCP tools
- [ ] Рассчитать Win Rate = (количество прибыльных сделок / общее количество закрытых сделок) * 100
- [ ] Обновлять Win Rate при изменении истории сделок
- [ ] Обработать случай, когда сделок нет (показывать "--" или "N/A")
**Ожидаемый результат:** Header показывает реальный Win Rate на основе истории сделок
---
#### 1.3. AI Confidence в Header Metrics
**Проблема:** AI Confidence всегда показывает 85% (hardcoded значение)
**Файл:** `bybit-mcp/webui/src/utils/headerMetrics.ts` (строка 125)
**Текущий код:**
```typescript
const aiConfidence = 85; // TODO: Get from AI reasoning system
```
**Задача:**
- [ ] Получить AI Confidence из `AIReasoningViewer` или `multiStepAgent`
- [ ] Если confidence недоступен, использовать последнее значение из анализа
- [ ] Обновлять confidence при новых анализах
- [ ] Обработать случай, когда confidence недоступен (показывать "--")
**Ожидаемый результат:** Header показывает реальный AI Confidence из системы анализа
---
#### 1.4. Уведомления об успешных операциях
**Проблема:** После закрытия позиции нет уведомления об успехе
**Файл:** `bybit-mcp/webui/src/components/TradingDashboard.ts` (строка 1043)
**Текущий код:**
```typescript
// TODO: Show success notification
```
**Задача:**
- [ ] Создать систему уведомлений (toast notifications)
- [ ] Показывать уведомление при успешном закрытии позиции
- [ ] Показывать уведомление при успешном открытии позиции
- [ ] Показывать уведомление при ошибках операций
- [ ] Использовать существующий метод `showToast` или создать новый компонент
**Ожидаемый результат:** Пользователь видит уведомления о результатах операций
---
### 2. ОПТИМИЗАЦИЯ И ОЧИСТКА
#### 2.1. Удаление Debug логов
**Проблема:** Много console.log для отладки в production коде
**Файлы:**
- `bybit-mcp/webui/src/components/ChatApp.ts` (много строк с `// DEV_PLAN debug`)
- `bybit-mcp/webui/src/components/TradingTerminal.ts` (несколько console.log)
**Задача:**
- [ ] Удалить все debug логи с комментариями `// DEV_PLAN debug`
- [ ] Оставить только критичные console.error и console.warn
- [ ] Обернуть оставшиеся логи в условие `if (process.env.NODE_ENV === 'development')`
- [ ] Или использовать централизованный логгер из `logService`
**Ожидаемый результат:** Чистый код без debug логов в production
---
#### 2.2. Удаление неиспользуемого DebugConsole
**Проблема:** Компонент DebugConsole существует, но не используется
**Файлы:**
- `bybit-mcp/webui/src/components/DebugConsole.ts` - компонент существует
- `bybit-mcp/webui/src/styles/components.css` - стили для debug-console (строки 1454-1631)
**Задача:**
- [ ] Проверить, используется ли DebugConsole где-либо
- [ ] Если не используется - удалить компонент и стили
- [ ] Если нужно оставить - интегрировать в Trading Terminal
**Ожидаемый результат:** Удалены неиспользуемые компоненты и стили
---
### 3. УЛУЧШЕНИЕ ОБРАБОТКИ ОШИБОК
#### 3.1. Обработка ошибок в PositionDetailReport
**Файл:** `bybit-mcp/webui/src/components/PositionDetailReport.ts`
**Задача:**
- [ ] Добавить try-catch в `initializeTradingView()` с fallback на iframe виджет
- [ ] Обработать ошибки загрузки технического анализа (показывать сообщение пользователю)
- [ ] Обработать ошибки загрузки рыночных данных
- [ ] Добавить retry логику для критичных операций
**Ожидаемый результат:** Graceful handling ошибок с информативными сообщениями
---
#### 3.2. Обработка ошибок в TradingTerminal
**Файл:** `bybit-mcp/webui/src/components/TradingTerminal.ts`
**Задача:**
- [ ] Улучшить обработку ошибок инициализации компонентов
- [ ] Добавить retry логику для критичных компонентов (TradingDashboard, ChartContainer)
- [ ] Показывать сообщения об ошибках пользователю
- [ ] Логировать ошибки в централизованный логгер
**Ожидаемый результат:** Приложение продолжает работать даже при ошибках отдельных компонентов
---
### 4. ОПТИМИЗАЦИЯ ПРОИЗВОДИТЕЛЬНОСТИ
#### 4.1. Lazy Loading компонентов
**Файл:** `bybit-mcp/webui/src/components/TradingTerminal.ts`
**Задача:**
- [ ] Загружать аналитические панели (PerformanceDashboard, RiskMetrics, PortfolioAnalytics) только при переключении на соответствующий таб
- [ ] Использовать динамические импорты для тяжелых компонентов
- [ ] Показывать loading индикатор при загрузке компонентов
**Ожидаемый результат:** Быстрая начальная загрузка терминала
---
#### 4.2. Debounce для real-time обновлений
**Файлы:**
- `bybit-mcp/webui/src/components/TradingDashboard.ts`
- `bybit-mcp/webui/src/components/PositionDetailReport.ts`
**Задача:**
- [ ] Добавить debounce для частых обновлений цены (не чаще 1 раза в секунду)
- [ ] Оптимизировать обновления UI (обновлять только измененные элементы)
- [ ] Использовать requestAnimationFrame для обновлений DOM
**Ожидаемый результат:** Плавные обновления без лагов
---
## 📝 ПЛАН ВЫПОЛНЕНИЯ
### Этап 1: Критические исправления (Приоритет: ВЫСОКИЙ)
1. Исправить Entry Time в PositionDetailReport
2. Реализовать Win Rate в Header
3. Реализовать AI Confidence в Header
4. Добавить уведомления об операциях
### Этап 2: Очистка кода (Приоритет: СРЕДНИЙ)
5. Удалить debug логи
6. Удалить неиспользуемый DebugConsole
### Этап 3: Улучшение надежности (Приоритет: СРЕДНИЙ)
7. Улучшить обработку ошибок в PositionDetailReport
8. Улучшить обработку ошибок в TradingTerminal
### Этап 4: Оптимизация (Приоритет: НИЗКИЙ)
9. Реализовать lazy loading компонентов
10. Добавить debounce для обновлений
---
## ✅ КРИТЕРИИ УСПЕХА
1. ✅ Entry Time показывает реальное время входа
2. ✅ Win Rate рассчитывается из истории сделок
3. ✅ AI Confidence получается из системы анализа
4. ✅ Уведомления показываются при операциях
5. ✅ Нет debug логов в production коде
6. ✅ Неиспользуемые компоненты удалены
7. ✅ Ошибки обрабатываются gracefully
8. ✅ Приложение работает быстро и плавно
---
## 🔍 ПРОВЕРКА
После выполнения всех задач проверить:
- [ ] Все TODO комментарии исправлены
- [ ] Нет ошибок в консоли браузера
- [ ] Все функции работают корректно
- [ ] Производительность улучшена
- [ ] Код чистый и поддерживаемый
---
## 📌 ВАЖНЫЕ ЗАМЕЧАНИЯ
1. **НЕ удалять** функциональность, только улучшать
2. **НЕ ломать** существующие функции
3. **Тестировать** каждое изменение
4. **Сохранять** обратную совместимость
5. **Документировать** сложные изменения
---
## 🚨 ВАЖНО
- Начинать с критических исправлений (Этап 1)
- Тестировать каждое изменение перед следующим
- Сообщать о проблемах, если что-то не работает
- Следовать существующему стилю кода
---
---
## 📚 СПРАВОЧНАЯ ИНФОРМАЦИЯ
### Существующие сервисы и методы
#### 1. TradingDataService
**Файл:** `bybit-mcp/webui/src/services/tradingDataService.ts`
**Интерфейс Position:**
```typescript
export interface Position {
symbol: string;
side: 'Buy' | 'Sell';
size: number;
entry_price: number;
current_price: number;
unrealized_pnl: number;
unrealized_pnl_pct: number;
leverage?: number;
stop_loss?: number;
take_profit?: number;
time_in_trade?: string; // ⚠️ Время в торговле (может быть использовано для расчета entry time)
status?: 'healthy' | 'warning' | 'critical';
updated_at: number; // ⚠️ Время последнего обновления
}
```
**Методы:**
- `getPositions(): Promise<Position[]>` - получить все позиции
- `getPortfolio(): Promise<PortfolioData>` - получить данные портфеля
- `subscribe(channel: string, callback: (data: any) => void): () => void` - подписка на обновления
**Важно:** В интерфейсе `Position` нет поля `entry_time` или `created_at`. Нужно использовать `time_in_trade` или `updated_at` для расчета времени входа.
---
#### 2. AnalyticsEngine
**Файл:** `bybit-mcp/webui/src/services/analyticsEngine.ts`
**Методы для Win Rate:**
- `calculateWinRate(trades: TradeRecord[]): number` - рассчитать Win Rate из массива сделок
- `getTradeHistory(): TradeRecord[]` - получить историю сделок
- `calculateMetrics(positions?: Position[], period?: 'daily' | 'weekly' | 'monthly' | 'all'): Promise<PerformanceMetrics>` - рассчитать метрики производительности (включая Win Rate)
**Интерфейс PerformanceMetrics:**
```typescript
interface PerformanceMetrics {
winRate: number; // ✅ Уже рассчитан!
totalTrades: number;
winningTrades: number;
losingTrades: number;
// ... другие метрики
}
```
**Использование:**
```typescript
import { analyticsEngine } from '@/services/analyticsEngine';
// Получить Win Rate
const metrics = await analyticsEngine.calculateMetrics();
const winRate = metrics.winRate; // 0-100
```
---
#### 3. AIReasoningViewer
**Файл:** `bybit-mcp/webui/src/components/AIReasoningViewer.ts`
**Структура данных:**
- `probabilityData: ProbabilityCalc | null` - содержит `final` (финальная вероятность)
- `parsedReasoning: ParsedReasoning | null` - содержит `probability.final`
**Проблема:** Нет публичного метода для получения confidence/probability
**Решение:**
1. Добавить метод `getCurrentConfidence(): number | null` в `AIReasoningViewer`
2. Или использовать напрямую `probabilityData?.final` (но это приватное свойство)
3. Или получить из `parsedReasoning.probability.final`
**Пример реализации:**
```typescript
// В AIReasoningViewer.ts добавить:
public getCurrentConfidence(): number | null {
if (this.probabilityData) {
return this.probabilityData.final; // 0-100
}
if (this.parsedReasoning?.probability) {
return this.parsedReasoning.probability.final; // 0-100
}
return null;
}
```
**Альтернатива:** Использовать `multiStepAgent` из `@/services/multiStepAgent`:
```typescript
import { multiStepAgent } from '@/services/multiStepAgent';
// Получить состояние агента
const state = multiStepAgent.getState();
// Проверить, есть ли confidence в state
```
---
#### 4. Toast Notifications
**Проблема:** Метод `showToast()` был удален из `main.ts` при очистке!
**Файл:** `bybit-mcp/webui/src/main.ts` (строка 592) - метод существует, но нужно проверить, используется ли
**Текущая реализация:**
```typescript
private showToast(message: string, type: 'success' | 'error' = 'success'): void {
const toast = document.createElement('div');
toast.className = `dashboard-toast toast-${type}`;
toast.textContent = message;
document.body.appendChild(toast);
setTimeout(() => toast.classList.add('show'), 10);
setTimeout(() => {
toast.classList.remove('show');
setTimeout(() => toast.remove(), 300);
}, 3000);
}
```
**Стили:** Стили для `.dashboard-toast` существуют в `bybit-mcp/webui/src/styles/agent-dashboard.css` (строки 238-260)
**✅ Хорошие новости:** `agent-dashboard.css` уже импортирован в `main.css` (строка 16), значит стили доступны!
**Задача:**
- [x] Стили уже импортированы в `main.css`
- [ ] Создать публичный метод `showToast()` в `TradingDashboard` (скопировать из `main.ts` или создать утилиту)
- [ ] Или экспортировать метод из `main.ts` и использовать глобально
- [ ] Использовать в `TradingDashboard.ts` для уведомлений при закрытии/открытии позиций
**Стили уже существуют:**
```css
.dashboard-toast {
position: fixed;
bottom: 20px;
right: 20px;
padding: 12px 24px;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
z-index: 10000;
transform: translateY(100px);
opacity: 0;
transition: all 0.3s ease;
}
.dashboard-toast.show {
transform: translateY(0);
opacity: 1;
}
.dashboard-toast.toast-success {
background: #48bb78;
color: white;
}
.dashboard-toast.toast-error {
background: #f56565;
color: white;
}
```
---
### MCP Tools для получения данных
#### Для Win Rate:
- `mcp_user-bybit-trading_get_order_history` - получить историю ордеров
- `mcp_user-bybit-trading_get_signal_quality_metrics` - получить метрики качества сигналов (включая Win Rate)
#### Для Entry Time:
- Проверить, есть ли в ответе MCP tools поле `created_at`, `opened_at` или `entry_time`
- Использовать `time_in_trade` из позиции для расчета времени входа
---
### Зависимости между задачами
1. **Win Rate** зависит от:
- `analyticsEngine` (уже есть метод `calculateWinRate`)
- Истории сделок (нужно получить через MCP или `analyticsEngine.getTradeHistory()`)
2. **AI Confidence** зависит от:
- `AIReasoningViewer` или `multiStepAgent`
- Нужно проверить, как получить confidence из этих компонентов
3. **Toast Notifications**:
- Метод `showToast()` существует в `main.ts`, но нужно проверить стили
- Если стилей нет - создать компонент или добавить стили
4. **Entry Time**:
- Использовать `time_in_trade` или `updated_at` из позиции
- Если `time_in_trade` в формате строки - распарсить и вычислить время входа
---
### Примеры кода
#### Пример 1: Получение Win Rate
```typescript
import { analyticsEngine } from '@/services/analyticsEngine';
async function getWinRate(): Promise<number> {
try {
const metrics = await analyticsEngine.calculateMetrics();
return metrics.winRate; // 0-100
} catch (error) {
console.error('Failed to get win rate:', error);
return 0;
}
}
```
#### Пример 2: Расчет Entry Time
```typescript
function calculateEntryTime(position: Position): number {
// Вариант 1: Если есть time_in_trade в секундах
if (position.time_in_trade) {
const timeInTradeSeconds = parseTimeInTrade(position.time_in_trade);
return Math.floor(Date.now() / 1000) - timeInTradeSeconds;
}
// Вариант 2: Использовать updated_at как приблизительное время входа
// (если позиция только что открыта)
if (position.updated_at) {
return Math.floor(position.updated_at / 1000);
}
// Fallback: текущее время минус 1 час
return Math.floor(Date.now() / 1000) - 3600;
}
function parseTimeInTrade(timeStr: string): number {
// Парсинг строки типа "2h 30m" или "1d 5h" в секунды
// Реализовать парсинг в зависимости от формата
return 3600; // placeholder
}
```
#### Пример 3: Toast Notification
```typescript
// В TradingDashboard.ts добавить метод:
private showToast(message: string, type: 'success' | 'error' = 'success'): void {
const toast = document.createElement('div');
toast.className = `dashboard-toast toast-${type}`;
toast.textContent = message;
document.body.appendChild(toast);
// Animate in
setTimeout(() => toast.classList.add('show'), 10);
// Remove after 3 seconds
setTimeout(() => {
toast.classList.remove('show');
setTimeout(() => toast.remove(), 300);
}, 3000);
}
// Использование:
this.showToast('Position closed successfully', 'success');
this.showToast('Failed to close position', 'error');
```
**Альтернатива:** Создать утилиту `toastService.ts` для переиспользования:
```typescript
// src/utils/toastService.ts
export function showToast(message: string, type: 'success' | 'error' = 'success'): void {
// ... та же логика
}
```
---
### Проверка перед началом
Перед выполнением задач проверить:
1. **Entry Time:**
- [ ] Какие поля доступны в интерфейсе `Position`?
- [ ] Какой формат у `time_in_trade`?
- [ ] Есть ли в MCP tools дополнительная информация о времени входа?
2. **Win Rate:**
- [ ] Работает ли `analyticsEngine.getTradeHistory()`?
- [ ] Есть ли данные в истории сделок?
- [ ] Нужно ли получать данные через MCP tools?
3. **AI Confidence:**
- [ ] Добавить метод `getCurrentConfidence()` в `AIReasoningViewer` (использовать `probabilityData.final`)
- [ ] Или получить из `parsedReasoning.probability.final`
- [ ] Проверить, обновляется ли confidence при новых анализах
- [ ] Сохранять последний confidence для отображения в header
4. **Toast Notifications:**
- [x] Стили для `.dashboard-toast` существуют в `agent-dashboard.css`
- [x] Стили уже импортированы в `main.css` (строка 16)
- [ ] Создать публичный метод `showToast()` в `TradingDashboard` (скопировать логику из `main.ts`)
- [ ] Протестировать отображение уведомлений
---
---
## ⚠️ ВОЗМОЖНЫЕ ПРОБЛЕМЫ И РЕШЕНИЯ
### Проблема 1: Win Rate всегда 0%
**Причина:** `analyticsEngine.getTradeHistory()` возвращает пустой массив
**Решение:**
- Проверить, добавляются ли сделки в `analyticsEngine` при закрытии позиций
- Если нет - добавить вызов `analyticsEngine.addTrade()` при закрытии позиции
- Или получать историю через MCP tool `get_order_history` и преобразовывать в `TradeRecord[]`
### Проблема 2: AI Confidence не обновляется
**Причина:** `AIReasoningViewer` не имеет публичного метода для получения confidence
**Решение:**
- Добавить метод `getCurrentConfidence()` в `AIReasoningViewer`
- Подписаться на события обновления confidence
- Сохранять последний confidence в localStorage или глобальном состоянии
### Проблема 3: Entry Time неправильный
**Причина:** `time_in_trade` может быть в разных форматах (строка, число, undefined)
**Решение:**
- Проверить формат `time_in_trade` в реальных данных
- Создать функцию парсинга для разных форматов
- Использовать fallback на `updated_at` если `time_in_trade` недоступен
### Проблема 4: Toast не отображается
**Причина:** Стили не применяются или метод не вызывается
**Решение:**
- Проверить, что стили `.dashboard-toast` загружены (уже импортированы)
- Проверить z-index (должен быть высоким, например 10000)
- Проверить, что метод вызывается после успешной операции
- Проверить консоль на ошибки JavaScript
---
## 🧪 ИНСТРУКЦИИ ПО ТЕСТИРОВАНИЮ
### Тест 1: Entry Time
1. Открыть позицию (или использовать существующую)
2. Открыть Position Detail Report
3. Проверить маркер Entry на графике
4. **Ожидаемый результат:** Маркер показывает реальное время входа (не демо-время)
### Тест 2: Win Rate
1. Закрыть несколько позиций (с прибылью и убытком)
2. Проверить Win Rate в Header
3. **Ожидаемый результат:** Win Rate рассчитывается как (wins / total) * 100
### Тест 3: AI Confidence
1. Запросить анализ актива через чат
2. Проверить AI Confidence в Header
3. **Ожидаемый результат:** Confidence обновляется на основе последнего анализа
### Тест 4: Toast Notifications
1. Закрыть позицию
2. **Ожидаемый результат:** Появляется зеленое уведомление "Position closed successfully"
3. Попробовать закрыть несуществующую позицию
4. **Ожидаемый результат:** Появляется красное уведомление с ошибкой
### Тест 5: Debug Logs
1. Открыть консоль браузера
2. Выполнить несколько операций
3. **Ожидаемый результат:** Нет debug логов с комментариями `// DEV_PLAN debug`
---
## 📊 МЕТРИКИ УСПЕХА
После выполнения всех задач проверить:
### Функциональность
- [ ] Entry Time показывает реальное время входа
- [ ] Win Rate рассчитывается из истории сделок
- [ ] AI Confidence обновляется при новых анализах
- [ ] Toast уведомления появляются при операциях
### Качество кода
- [ ] Нет debug логов в production коде
- [ ] Неиспользуемые компоненты удалены
- [ ] Ошибки обрабатываются gracefully
- [ ] Нет ошибок в консоли браузера
### Производительность
- [ ] Приложение загружается быстро
- [ ] Real-time обновления плавные (без лагов)
- [ ] Нет memory leaks
---
## 🔗 СВЯЗАННЫЕ ФАЙЛЫ
### Основные файлы для изменения:
1. `bybit-mcp/webui/src/components/PositionDetailReport.ts` - Entry Time, маркеры
2. `bybit-mcp/webui/src/utils/headerMetrics.ts` - Win Rate, AI Confidence
3. `bybit-mcp/webui/src/components/TradingDashboard.ts` - Toast notifications
4. `bybit-mcp/webui/src/components/AIReasoningViewer.ts` - метод getCurrentConfidence()
5. `bybit-mcp/webui/src/components/ChatApp.ts` - удаление debug логов
6. `bybit-mcp/webui/src/components/TradingTerminal.ts` - удаление debug логов
### Сервисы для использования:
1. `bybit-mcp/webui/src/services/analyticsEngine.ts` - Win Rate
2. `bybit-mcp/webui/src/services/tradingDataService.ts` - данные позиций
3. `bybit-mcp/webui/src/components/AIReasoningViewer.ts` - AI Confidence
---
## 💡 ДОПОЛНИТЕЛЬНЫЕ УЛУЧШЕНИЯ (ОПЦИОНАЛЬНО)
Если останется время, можно добавить:
1. **Кэширование метрик** - кэшировать Win Rate и AI Confidence на 1-2 минуты
2. **Анимации** - плавные анимации для обновления метрик в Header
3. **История уведомлений** - сохранять последние уведомления для просмотра
4. **Настройки** - возможность отключить уведомления в настройках
5. **Аналитика** - логирование действий пользователя для аналитики
---
**НАЧНИ С ЭТАПА 1 - КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ!**