Вы запускаете торгового бота на Binance, через месяц торговли пытаетесь посчитать P&L, но в логах – только 'Buy 0.1 BTC at 30000'. Ни комиссий, ни проскальзываний, ни контекста стратегии. Знакомая ситуация? Настройка логирования сделок криптобота под ключ решает эту проблему: мы внедряем структурированные JSON-логи с pino, храним их в PostgreSQL+TimescaleDB и строим дашборды P&L за секунды. Наши инженеры с 5+ лет опыта в блокчейн-разработке делают это за 1–3 дня. Закажите настройку — и получите полный аудит каждой сделки.
Почему структурированное логирование критично для аудита?
Логи в JSON-формате парсятся инструментами, plain text — нет. Сравните:
| Критерий | Plain text (console.log) | JSON (pino/winston) |
|---|---|---|
| Поиск по полю | grep по тексту (ошибки) | SQL-запрос к JSONB |
| Анализ P&L | вручную извлекать числа | SUM(realizedPnl) за секунду |
| Фильтр по стратегии | нет метаданных | WHERE strategy = 'grid' |
| Скорость обработки 1M записей | часы | миллисекунды |
JSON в 50+ раз быстрее при анализе — это подтверждают бенчмарки. В одном проекте мы обнаружили, что 23% сделок теряли прибыль из-за завышенных комиссий, которые были не видны в plain-логах. Экономия от одной такой находки может составлять $1000+.
Как настроить логирование сделок криптобота под ключ?
Что нужно логировать?
Минимальный набор событий:
type TradeEvent = | { type: "order_placed"; orderId: string; symbol: string; side: "buy" | "sell"; quantity: number; price: number; orderType: "market" | "limit"; timestamp: number; } | { type: "order_filled"; orderId: string; executedQty: number; executedPrice: number; fee: number; feeCurrency: string; timestamp: number; } | { type: "order_cancelled"; orderId: string; reason: string; timestamp: number; } | { type: "position_opened"; positionId: string; entryPrice: number; size: number; leverage: number; timestamp: number; } | { type: "position_closed"; positionId: string; exitPrice: number; realizedPnl: number; timestamp: number; } | { type: "signal_generated"; strategy: string; signal: string; params: Record<string, unknown>; timestamp: number; } | { type: "error"; code: string; message: string; context: Record<string, unknown>; timestamp: number; }; Каждое событие должно содержать strategy, exchange, sessionId — это фильтрует логи по конкретному прогону. Ниже таблица с обязательными полями для каждого типа:
| Тип события | Обязательные поля |
|---|---|
| order_placed | orderId, symbol, side, quantity, price, orderType |
| order_filled | orderId, executedQty, executedPrice, fee, feeCurrency |
| order_cancelled | orderId, reason |
| position_opened | positionId, entryPrice, size, leverage |
| position_closed | positionId, exitPrice, realizedPnl |
| signal_generated | strategy, signal, params |
| error | code, message, context |
Пошаговая инструкция по настройке pino
- Замените
console.logна pino с JSON-форматом. - Добавьте базовые поля (
strategy,exchange,sessionId) в каждый вызов. - Настройте транспорт: pino-pretty для dev, JSON для production.
- Подключите async writer для записи в stdout или файл.
- Интегрируйте отправку логов в PostgreSQL через logstash или прямой writer.
Пример минимальной конфигурации:
import pino from "pino"; const logger = pino({ level: process.env.LOG_LEVEL ?? "info", base: { strategy: process.env.STRATEGY_NAME, exchange: process.env.EXCHANGE, sessionId: process.env.SESSION_ID ?? Date.now().toString(36), }, transport: process.env.NODE_ENV === "development" ? { target: "pino-pretty" } : undefined, }); logger.info({ type: "order_filled", orderId, executedQty, executedPrice, fee }, "Order filled"); Хранение: PostgreSQL + TimescaleDB
TimescaleDB автоматически сегментирует данные по времени (гипертаблицы), что даёт скорость запросов к миллионам строк за миллисекунды. Обычный PostgreSQL без расширения будет тормозить на логах с частотой >100 событий/сек.
CREATE TABLE trade_events ( id BIGSERIAL, session_id TEXT NOT NULL, strategy TEXT NOT NULL, exchange TEXT NOT NULL, event_type TEXT NOT NULL, payload JSONB NOT NULL, ts TIMESTAMPTZ NOT NULL DEFAULT now(), PRIMARY KEY (id, ts) ); SELECT create_hypertable('trade_events', 'ts'); CREATE INDEX ON trade_events (session_id, ts DESC); CREATE INDEX ON trade_events USING GIN (payload); С TimescaleDB запрос "все сделки стратегии X за прошлую неделю" выполняется за миллисекунды даже на миллионах строк.
Как настроить P&L анализ из логов?
SELECT strategy, date_trunc('day', ts) AS day, COUNT(*) FILTER (WHERE event_type = 'order_filled') AS trades, SUM((payload->>'executedQty')::numeric * (payload->>'executedPrice')::numeric) FILTER (WHERE payload->>'side' = 'sell') AS gross_revenue, SUM((payload->>'fee')::numeric) FILTER (WHERE event_type = 'order_filled') AS total_fees, SUM((payload->>'realizedPnl')::numeric) FILTER (WHERE event_type = 'position_closed') AS realized_pnl FROM trade_events WHERE ts > now() - interval '30 days' GROUP BY strategy, day ORDER BY day DESC; Этот запрос даёт дневную P&L по стратегиям, учитывая комиссии — то, что обычно упускают в простых логах.
Алерты на аномалии
Логирование бесполезно без реакции на проблемы. Простой мониторинг через периодический запрос:
async function checkAnomalies() { const recentErrors = await db.countEvents({ type: "error", since: minutesAgo(5) }); if (recentErrors > 10) await alertService.send("High error rate: " + recentErrors + " errors in 5m"); const lastFill = await db.lastEventTime({ type: "order_filled" }); if (minutesSince(lastFill) > 60 && isMarketHours()) { await alertService.send("No fills in 60 minutes — bot may be stuck"); } } Добавьте алерт в Telegram при >N ошибках или отсутствии заполнений. Ошибка проскальзывания всего 0.1% может стоить $500 в день — своевременное оповещение спасает бюджет.
Что входит в работу
- Замена
console.logна pino/winston с JSON-форматом - Добавление
sessionId,strategy,exchangeво все события - Таблица
trade_eventsв PostgreSQL с индексами и TimescaleDB - Async writer (буферизованная вставка батчами, не блокирует торговый loop)
- Базовый SQL-запрос P&L по дням
- Алерт в Telegram при >N ошибках за период
- Документация по схеме логов и примерам запросов
- Деплой на ваш сервер или облако
Почему нас выбирают
- 5+ лет опыта в блокчейн-разработке (Ethereum, Solana, BNB Chain)
- Более 50 проектов по торговым ботам и DeFi
- Гарантия настройки: если через месяц что-то не работает, исправляем бесплатно
- Используем только проверенные инструменты: pino, TimescaleDB, Telegram Bot API
- Работаем удалённо и в офисе (Минск, BY)
Сроки и стоимость
Базовая настройка занимает от 1 до 3 дней. Стоимость рассчитывается индивидуально в зависимости от сложности стратегии и объёма логов. Одна обнаруженная вовремя ошибка может сохранить до $2000, поэтому проект окупается за 1–2 недели.
Для точной оценки пришлите описание вашего бота и требования по логированию. Мы подготовим коммерческое предложение в течение 24 часов. Свяжитесь с нами в Telegram или по email — обсудим детали. Не откладывайте на завтра — закажите настройку сейчас.







