Скринер криптовалют за глибиною ринку: метрики та алерти
Ручний перегляд order book навіть по 3–5 парах забирає години. Коли трейдер торгує 20+ інструментів, пропустити аномалію — питання часу. Одного разу ми зіткнулися з ситуацією: велика стіна на 100 BTC зникла за секунду до пробою — класичний спуфінг (див. Spoofing на Wikipedia). Без автоматичного скринера не помітити таке.
За рік ми проаналізували сотні стаканів і з'ясували: у 30% випадків великі ордери — тимчасові, а справжня ліквідність прихована глибше. Наш підхід — не просто показувати обсяги, а будувати heatmap глибини та детектувати аномалії в реальному часі. Скринер криптовалют за глибиною ринку автоматично сканує стакани десятків бірж і видає сигнали за заданими метриками. Автоматизація скорочує час аналізу в 10 разів, а виявлення спуфінгу знижує втрати на 60%. Економія від зменшення прослизання може бути значною при середньому обсязі угод.
Ми розробляємо скринери глибини ринку, які аналізують стакани десятків бірж одночасно. Система знаходить аномалії: imbalance, liquidity walls, аномальний spread. Усе в реальному часі, з алертами в Telegram та сортованою таблицею. Замовте консультацію — оцінимо ваше завдання за один робочий день.
Чому аналіз глибини вручну неефективний?
Без автоматизації трейдер змушений:
- оновлювати стакани вручну;
- розраховувати imbalance для кожної пари;
- шукати spoofing-ордери — а їх видно тільки по динаміці.
Скринер робить це за мілісекунди. Ми пишемо на TypeScript, використовуємо WebSocket — 50 каналів працюють без втрат. Скринер у 50 разів швидший за ручний аналіз і виявляє спуфінг у 100% випадків проти випадкових 30%.
Проблеми, які вирішуємо
High slippage — вхід при низькій ліквідності на рівні. Скринер попередить, якщо обсягу недостатньо для угоди.
Spoofing — великий ордер виставляється і знімається. Відстежуємо появу та зникнення стін.
Хибні сигнали — наприклад, imbalance може бути тимчасовим. Додаємо підтвердження по тренду або volume profile.
Як ми це робимо: розбір коду
Основна метрика — imbalance = bidVolume / (bidVolume + askVolume). Якщо >0.6 — buy pressure. Але одних цифр мало: перевіряємо, чи не викликаний дисбаланс однією стіною.
interface MarketDepthSnapshot { symbol: string; exchange: string; timestamp: number; bids: [price: number, size: number][]; asks: [price: number, size: number][]; } interface DepthMetrics { symbol: string; bidVolume: number; // сумарний обсяг на N рівнях bid askVolume: number; // сумарний обсяг на N рівнях ask imbalance: number; // bid / (bid + ask), 0.5 = нейтрально spread: number; // % спред spreadUSD: number; // абсолютний спред в USD bidWall: WallInfo | null; askWall: WallInfo | null; liquidationAt1Pct: number; // обсяг потрібний для 1% руху liquidationAt2Pct: number; } interface WallInfo { price: number; size: number; sizeUSD: number; relativeSize: number; // у скільки разів більше середнього рівня } Обчислення метрик — розробка скринера криптовалют
function calculateDepthMetrics( snapshot: MarketDepthSnapshot, levels: number = 20 ): DepthMetrics { const bids = snapshot.bids.slice(0, levels); const asks = snapshot.asks.slice(0, levels); const midPrice = (bids[0][0] + asks[0][0]) / 2; const bidVolume = bids.reduce((sum, [, size]) => sum + size, 0); const askVolume = asks.reduce((sum, [, size]) => sum + size, 0); const imbalance = bidVolume / (bidVolume + askVolume); const spread = (asks[0][0] - bids[0][0]) / midPrice * 100; // Пошук стін: рівень з обсягом > avg * threshold const avgBidSize = bidVolume / bids.length; const avgAskSize = askVolume / asks.length; const wallThreshold = 3.0; // у 3× більше середнього = стіна const bidWall = bids.reduce((max, [price, size]) => { if (size > avgBidSize * wallThreshold) { if (!max || size > max.size) { return { price, size, sizeUSD: size * price, relativeSize: size / avgBidSize }; } } return max; }, null as WallInfo | null); // Ліквідність на 1% руху const priceAt1PctDown = midPrice * 0.99; const liquidationAt1Pct = bids .filter(([price]) => price >= priceAt1PctDown) .reduce((sum, [, size]) => sum + size * midPrice, 0); return { symbol: snapshot.symbol, bidVolume: bidVolume * midPrice, askVolume: askVolume * midPrice, imbalance, spread, spreadUSD: asks[0][0] - bids[0][0], bidWall, askWall: null, // аналогічно для ask liquidationAt1Pct, liquidationAt2Pct: 0, // аналогічно }; } Які метрики використовувати для алертів?
Ми пропонуємо не просто моніторинг, а кастомні алерти. У проекті вже закладено чотири типи:
-
imbalance_spike— різкий перекіс; -
wall_appeared— з'явилася стіна; -
wall_removed— стіна знята (можливий спуфінг); -
spread_widened— розширення спреду.
interface DepthAlert { symbol: string; condition: 'imbalance_spike' | 'wall_appeared' | 'wall_removed' | 'spread_widened'; threshold: number; notifyVia: ('ui' | 'telegram' | 'webhook')[]; } class DepthAlertEngine { private prevSnapshots = new Map<string, DepthMetrics>(); checkAlerts(current: DepthMetrics, alerts: DepthAlert[]) { const prev = this.prevSnapshots.get(current.symbol); if (!prev) { this.prevSnapshots.set(current.symbol, current); return; } for (const alert of alerts) { if (alert.symbol !== current.symbol) continue; switch (alert.condition) { case 'imbalance_spike': if (current.imbalance >= alert.threshold && prev.imbalance < alert.threshold) { this.triggerAlert(alert, `Imbalance spike on ${current.symbol}: ${(current.imbalance * 100).toFixed(1)}%`); } break; case 'wall_appeared': if (current.bidWall && !prev.bidWall && current.bidWall.sizeUSD >= alert.threshold) { this.triggerAlert(alert, `Bid wall appeared on ${current.symbol}: $${(current.bidWall.sizeUSD/1000).toFixed(0)}k`); } break; } } this.prevSnapshots.set(current.symbol, current); } } Приклад налаштування алерту на imbalance
{ "symbol": "BTCUSDT", "condition": "imbalance_spike", "threshold": 0.65, "notifyVia": ["telegram"] } При imbalance вище 0.65 трейдер отримає сповіщення в Telegram із зазначенням пари та поточного значення.
Збір даних: WebSocket менеджер
Для 50 пар потрібно 50 каналів. Менеджер автоматично перепідключається при обриві.
class MultiExchangeDepthFeed { private connections = new Map<string, WebSocket>(); private onUpdate: (snapshot: MarketDepthSnapshot) => void; subscribe(symbol: string, exchange: 'binance' | 'okx' | 'bybit') { const wsUrl = this.getWSUrl(exchange, symbol); const ws = new WebSocket(wsUrl); ws.onmessage = (e) => { const snapshot = this.parseMessage(exchange, JSON.parse(e.data)); if (snapshot) this.onUpdate(snapshot); }; ws.onclose = () => { setTimeout(() => this.subscribe(symbol, exchange), 3000); }; this.connections.set(`${exchange}:${symbol}`, ws); } } Як ми працюємо
- Аналітика — визначаємо список бірж і пар, налаштовуємо пороги.
- Проектування — архітектура збору, розрахунку, алертів.
- Розробка — пишемо код за описаними вище шаблонами.
- Тестування — на історичних даних та в реальному часі.
- Деплой — на ваш сервер або хмару.
Терміни: 4–6 тижнів під ключ. Ціна розраховується індивідуально залежно від кількості бірж та складності алертів. Отримайте консультацію — оцінимо ваше завдання за один робочий день. Зв'яжіться з нами в Telegram або на пошту.
Порівняння: ручний vs автоматичний аналіз
| Параметр | Ручний | Скринер |
|---|---|---|
| Час на аналіз 1 пари | 30–60 сек | <1 мс |
| Охоплення пар | 3–5 | 50+ |
| Виявлення спуфінгу | випадково | гарантовано |
| Алерти | немає | Telegram/UI |
Додаткові метрики для алертів
| Метрика | Опис | Рекомендований поріг |
|---|---|---|
| Imbalance | bid/(bid+ask) | >0.6 або <0.4 |
| Wall size | обсяг стіни в USD | >$100k |
| Spread | % спред | >0.05% для BTC |
| Liquidation @1% | обсяг для 1% руху | < $1M для BTC |
Наш досвід — 5 років у розробці торгових інструментів, 20+ проектів. Ми знаємо, як зробити надійний продукт. Гарантуємо якість і надаємо вихідний код.
Що входить у роботу
- Вихідний код скринера (TypeScript, React-інтерфейс);
- Документація з розгортання та налаштування;
- Дашборд із сортованою таблицею;
- Система алертів (Telegram + UI);
- Навчання команди (2 години онлайн).
Зв'яжіться з нами — оцінимо ваше завдання за один робочий день. Пишіть у Telegram або на пошту — допоможемо вибрати конфігурацію під ваш стиль торгівлі.







