Ми розробляємо професійні volume screeners для криптофондів і трейдерів, які працюють з аномаліями об'єму. Готові рішення на кшталт CoinMarketCap показують лише TOP-10 за абсолютним об'ємом — ви пропустите спайк на новій парі в Uniswap або CEX з низькою ліквідністю. Наші screener-двигуни моніторять 500+ пар на 10 біржах одночасно, обчислюючи Volume Ratio, Relative Volume (RVOL) та тренд об'єму в реальному часі. Кожна секунда затримки коштує грошей: професійний трейдер втрачає можливість увійти в позицію до натовпу. Тому ми реалізуємо збір даних з мінімальною затримкою, кастомні метрики та алерти в Telegram/Slack.
Ключова фішка нашого підходу — адаптивний threshold: ми не використовуємо жорсткі пороги, а підлаштовуємось під волатильність кожної пари на кожному таймфреймі. Це дає в 2–3 рази менше хибних спрацьовувань порівняно з фіксованим ratio 3. Результат — ви бачите тільки ті спайки, які дійсно варті уваги, а не шум.
Чому простого Volume Ratio недостатньо?
Volume Ratio = поточний об'єм / середній за N періодів. Ratio > 3 — потенційний спайк. Але якщо брати лише цей показник, ви отримаєте хибні спрацьовування на парах із добовими циклами. Наприклад, на ETH/USDT о 2:00 ночі норма — 10 000 ETH, а о 14:00 — 100 000 ETH. Ratio 3 вночі — це всього 30 000, що вдень вважається нормою. Тому ми додаємо RVOL — Relative Volume за часом доби (Relative volume).
RVOL вирівнює сезонність: для кожної години зберігається середній об'єм за 30 днів. Поточний об'єм ділиться на середнє для цієї години. RVOL > 2 = аномалія незалежно від часу.
| Метрика | Формула | Що дає |
|---|---|---|
| Volume Ratio | поточний / середній за 20 | Виявлення зростання об'єму |
| RVOL | поточний / середній за цю годину | Врахування добової сезонності |
| Volume Spike | разовий сплеск > 3x попередньої свічки | Вхід великого гравця |
| OBV | накопичувальний індикатор | Потік money flow (накопичення/розподіл) |
| Volume Trend | нахил регресії за 5 свічок | Напрямок (зростає/падає) |
Як збирати дані з 5 бірж одночасно?
Паралельний збір — ключова складність. Одна біржа віддає дані за 50–200 мс, а 5 — вже 1 секунда послідовно. Ми використовуємо Promise.all з розбиттям на чанки по 10 символів і паузами між чанками, щоб не перевищити rate limit.
Ось приклад класу VolumeDataCollector — він кешує свічки та фільтрує пари за мінімальним Volume Ratio.
class VolumeDataCollector { private candleCache = new Map<string, OHLCV[]>(); private exchange: ccxt.Exchange; async fetchAllCandles(symbols: string[], timeframe: string): Promise<void> { const chunks = chunkArray(symbols, 10); for (const chunk of chunks) { await Promise.all( chunk.map(async (symbol) => { const candles = await this.exchange.fetchOHLCV(symbol, timeframe, undefined, 100); this.candleCache.set(`${symbol}:${timeframe}`, candles.map(formatCandle)); }) ); await sleep(100); } } async getScreenerData(timeframe: string, minVolumeRatio: number = 2): Promise<VolumeScreenerItem[]> { const results: VolumeScreenerItem[] = []; for (const [key, candles] of this.candleCache) { if (!key.endsWith(`:${timeframe}`)) continue; const symbol = key.split(':')[0]; if (candles.length < 21) continue; const metrics = calculateVolumeMetrics(candles.slice(0, -1), candles[candles.length - 1]); if (metrics.volumeRatio >= minVolumeRatio) { results.push({ symbol, currentVolume: candles[candles.length - 1].volume, ...metrics, }); } } return results.sort((a, b) => b.volumeRatio - a.volumeRatio); } } Як розраховуються метрики об'єму (розшифровка)
Функція calculateVolumeMetrics бере останні 20 свічок для середнього, поточну свічку для Volume Ratio, а також 5 останніх для тренду. Volume Trend вважається через лінійну регресію: позитивний нахил = збільшення, негативний = зменшення. Спайк фіксується при Ratio > 3 незалежно від тренду.
function calculateVolumeMetrics( candles: OHLCV[], currentCandle: OHLCV ): VolumeMetrics { const period = 20; const recentCandles = candles.slice(-period); const avgVolume = recentCandles.reduce((sum, c) => sum + c.volume, 0) / period; const volumeRatio = currentCandle.volume / avgVolume; const recentVolumes = candles.slice(-5).map(c => c.volume); const volumeTrendSlope = linearRegressionSlope(recentVolumes); const priceChange = (currentCandle.close - candles.slice(-2)[0].close) / candles.slice(-2)[0].close; const volumeChange = currentCandle.volume / candles.slice(-2)[0].volume - 1; const confirming = (priceChange > 0 && volumeChange > 0) || (priceChange < 0 && volumeChange > 0); return { avgVolume, volumeRatio, volumeTrend: volumeTrendSlope > 0.1 ? 'increasing' : volumeTrendSlope < -0.1 ? 'decreasing' : (volumeRatio > 3 ? 'spike' : 'normal'), volumePrice: confirming ? 'confirming' : 'diverging', }; } UI для трейдера: що ми вбудовуємо
Інтерфейс — React-таблиця з сортуванням по колонках і візуальною індикацією. Ми використовуємо компонент VolumeRow, який підсвічує рядки з Ratio > 5 оранжевим фоном — трейдер бачить термінові сигнали за секунду.
const VolumeRow: React.FC<{ item: VolumeScreenerItem }> = ({ item }) => ( <tr className={item.volumeRatio > 5 ? 'highlight-spike' : ''}> <td><a href={`/trade/${item.symbol}`}>{item.symbol}</a></td> <td> <VolumeRatioBar ratio={item.volumeRatio} /> <span>{item.volumeRatio.toFixed(1)}x</span> </td> <td>{item.rvol.toFixed(1)}x</td> <td>{formatVolume(item.currentVolume)}</td> <td className={item.priceChange > 0 ? 'green' : 'red'}> {item.priceChange > 0 ? '+' : ''}{item.priceChange.toFixed(2)}% </td> <td><TrendIcon trend={item.volumeTrend} /></td> <td> <span className={item.volumePrice === 'confirming' ? 'green' : 'yellow'}> {item.volumePrice === 'confirming' ? '✓ Confirm' : '⚡ Diverge'} </span> </td> </tr> ); Як налаштувати алерти під свою стратегію?
Недостатньо показувати дані — трейдер повинен отримувати сповіщення. Налаштовуємо алерти на Telegram, email або webhook. Кожен алерт прив'язаний до символу та мінімального Ratio. Як тільки значення досягнуто, надсилається повідомлення з деталями.
| Канал | Формат | Типова затримка |
|---|---|---|
| Telegram | Текст з markdown | 1–3 секунди |
| HTML | 10–30 секунд | |
| Webhook | JSON | 0.5–2 секунди |
async function checkVolumeAlerts(screenerData: VolumeScreenerItem[], alerts: VolumeAlert[]) { for (const alert of alerts) { const item = screenerData.find(d => d.symbol === alert.symbol); if (!item) continue; if (item.volumeRatio >= alert.minVolumeRatio) { await sendAlert(alert.notifyVia, { message: `Volume spike on ${item.symbol}! Ratio: ${item.volumeRatio.toFixed(1)}x avg | Price: ${item.priceChange > 0 ? '+' : ''}${item.priceChange.toFixed(2)}%`, }); } } } Процес роботи
- Аналітика — обговорюємо біржі, пари, метрики, типи алертів.
- Проектування — архітектура збору, кешування, фільтрації; дизайн UI.
- Розробка — збір даних, розрахунок метрик, алерти, інтерфейс; паралельно пишемо тести.
- Інтеграція — підключаємо біржі через API, налаштовуємо rate limits.
- Тестування — на історичних даних перевіряємо хибні спрацьовування, оптимізуємо пороги.
- Деплой — розгортаємо в хмарі (AWS/GCP), налаштовуємо моніторинг.
Щоб розпочати роботу над проєктом, зв'яжіться з нами — ми проаналізуємо вимоги та запропонуємо архітектуру за 2 дні. Отримайте консультацію та попередню оцінку вже сьогодні.
Що входить в роботу
- Архітектурна документація та схеми потоків даних
- Вихідний код volume screener з відкритим API
- Адаптивна таблиця з сортуванням і фільтрами
- Система алертів (Telegram, email, webhook)
- Розгортання в хмарній інфраструктурі
- Документація з експлуатації
- Гарантійна підтримка 2 тижні після деплою
Строки: від 4 до 6 тижнів залежно від кількості бірж і метрик. Вартість розраховується індивідуально після аналізу вашого кейсу. Досвід нашої команди: 5+ років у розробці Web3, 50+ реалізованих проєктів, сертифіковані інженери з Solidity та Rust. Ми гарантуємо дотримання SLA та прозорий процес.
Бажаєте отримати volume screener під свої завдання? Оцінимо проєкт за 2 дні — замовте розробку та отримайте аналіз ринку в подарунок.







