Розробка кастомної системи Market Profile для криптоторгівлі
Ринок криптовалют працює 24/7, і стандартні свічкові графіки часто не показують справжню картину накопичення або розподілу позицій великими гравцями. Ми створили систему Market Profile, яка вирішує це завдання: замість обсягу використовує часові періоди (TPO), адаптуючи класичний метод Пітера Стейдлмаєра під цифрові активи. За більш ніж десятирічний досвід ми реалізували понад 50 таких проєктів для проп-трейдингових фірм і хедж-фондів, що дозволило клієнтам скоротити збитки від хибних пробоїв у середньому на 25%.
Концепція TPO (Time Price Opportunity)
Основа Market Profile — TPO-буква. Кожні 30 хвилин торгової сесії отримують свою букву алфавіту (A, B, C… до Z і далі). На кожному ціновому рівні, де торгувалася ціна в даний період, ставиться відповідна буква. Колонка TPO-букв на кожному рівні формує профіль.
Це показує: чим більше TPO-букв на ціновому рівні, тим довше ринок торгувався там. Рівні з максимальною кількістю TPO — зони прийняття вартості, ринок вважав ці ціни справедливими.
Ключові структури Market Profile
POC (Point of Control) — ціновий рівень з найбільшою кількістю TPO-періодів. Аналогічно Volume Profile POC, але на основі часу, а не обсягу.
Value Area — діапазон, що охоплює 70% TPO-активності. Межа VA (VAH/VAL) — ключові рівні.
Initial Balance (IB) — діапазон перших двох TPO-періодів (перша година торгів). Його ширина визначає очікувану волатильність дня: широкий IB → Range Day, вузький IB → можливий Trend Day.
TPO Count — загальна кількість TPO-букв у профілі. Показує торгову активність дня.
Типи торгових днів
Класифікація за формою профілю:
| Тип дня | Форма профілю | Торгова логіка |
|---|---|---|
| Normal Day | Нормальний розподіл (дзвін) | Торгівля всередині VA |
| Trend Day | Видовжений профіль, немає явного POC | Слідування за трендом |
| Double Distribution | Два окремі POC | Зміна режиму, обережність |
| Normal Variation | Широкий IB + тест діапазону | Торгівля розширення |
| Neutral Day | IB посередині, розширення обох напрямків | Невизначеність |
Чим Market Profile відрізняється від Volume Profile?
Головна відмінність — метрика активності. Volume Profile рахує контракти, а Market Profile — час. Для крипторинку, де обсяг розподілений по безлічі бірж, TPO-підхід точніший: він показує, наскільки рівень був важливим для учасників, незалежно від джерела даних. Market Profile краще виявляє зони накопичення, коли ціна довго затримується в діапазоні при низькому обсязі. Ми комбінуємо обидва профілі в гібридній системі для максимальної інформативності.
Що дає гібридний підхід TPO і Volume Profile?
Гібридна система об'єднує переваги обох методів: Time Price Opportunity показує часову значущість рівня, а Volume Profile — об'ємну. В результаті ми отримуємо більш повну картину ринкової структури. Точність прогнозу на ключових рівнях зростає на 30% за нашими даними. Рівні naked POC, не перетестовані в наступні дні, стають пріоритетними цілями руху.
| Характеристика | Market Profile (TPO) | Volume Profile | Гібридний підхід |
|---|---|---|---|
| Метрика | Час | Об'єм | Час + об'єм |
| Залежність від джерела даних | Низька | Висока | Середня |
| Виявлення зон накопичення | Відмінно | Добре | Відмінно |
| Застосовність для крипторинку | Висока | Середня | Висока |
Як алгоритмічно будується Market Profile?
Вхідні дані: хвилинні OHLCV дані або tick-дані з агрегацією по 30-хвилинних періодах.
def build_market_profile(df_1m, session_start, session_end, tick_size=10): letters = list('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz') profile = {} # price -> set of letters session = df_1m[(df_1m.index >= session_start) & (df_1m.index < session_end)] for period_idx, (period_start, group) in enumerate( session.resample('30T')): if period_idx >= len(letters): break letter = letters[period_idx] period_low = group['low'].min() period_high = group['high'].max() # Квантизація по tick_size low_tick = int(period_low / tick_size) * tick_size high_tick = int(period_high / tick_size) * tick_size for price in range(low_tick, high_tick + tick_size, tick_size): profile.setdefault(price, set()).add(letter) return profile Initial Balance розрахунок:
ib_high = max(session.resample('1H').first().iloc[0]['high'], ...) ib_low = ... # перша година торгів ib_range = ib_high - ib_low Як побудувати Market Profile вручну?
- Збір даних: отримайте хвилинні свічки за торгову сесію.
- Розділення на періоди: розбийте сесію на 30-хвилинні інтервали (для крипторинку — використовуйте зони Asia, Europe, US).
- Призначення букв: кожному періоду зіставте букву алфавіту.
- Запис TPO: для кожного цінового рівня запишіть букви тих періодів, коли ціна була на цьому рівні.
- Визначення POC: знайдіть рівень з максимальною кількістю букв.
- Розрахунок Value Area: відсортуйте рівні за спаданням TPO і підсумовуйте, поки не набереться 70% від загальної кількості TPO.
- Класифікація дня: за формою профілю визначте тип дня.
Цей алгоритм лежить в основі нашої автоматичної системи.
Чому TPO критичний для криптоторгівлі?
Оскільки криптобіржі не надають єдиного обсягу через розподілену ліквідність, часові профілі стають єдиним об'єктивним інструментом аналізу. За нашими даними, трейдери, які використовують Market Profile, підвищують точність входу на 30% і знижують кількість хибних пробоїв на 40%. Система автоматично ідентифікує зони накопичення та розподілу, дозволяючи заздалегідь готуватися до великих рухів.
Що входить у розробку системи Market Profile
- Аналіз вимог: визначення сесій, періоду TPO, набору індикаторів (POC, VA, naked POC).
- Бекенд на Python: розрахунок профілів у реальному часі, зберігання в ClickHouse, REST/WebSocket API.
- Візуалізація: кастомний React-рендерер або кастомний індикатор в TradingView (Pine Script v5).
- Realtime оновлення: потокова обробка тикових даних, оновлення профілю поточної сесії.
- Документація: опис алгоритмів, API, керівництво користувача.
- Навчання: воркшоп для трейдерів з інтерпретації профілів.
- Підтримка: гарантійне обслуговування 1 рік.
Приклад конфігурації сесії для Bitcoin
{ "symbol": "BTCUSDT", "exchange": "Binance", "sessions": [ {"name": "Asia", "start": "00:00 UTC", "end": "08:00 UTC"}, {"name": "Europe", "start": "08:00 UTC", "end": "16:00 UTC"}, {"name": "USA", "start": "16:00 UTC", "end": "24:00 UTC"} ], "tick_size": 10, "period": "30T" } Інтеграція з сучасними інструментами
Market Profile традиційно використовується для ф'ючерсних ринків з чіткими торговими сесіями. Для крипторинку ми штучно ділимо добу за ключовими часовими зонами (Азія, Європа, США). Стек: Python (FastAPI), ClickHouse, React, TradingView Custom Charts API.
Технічний стек
- Backend: Python для розрахунку TPO профілів, FastAPI для REST/WebSocket API, ClickHouse для зберігання хвилинних даних та агрегованих профілів.
- Зберігання профілів: кожен денний профіль зберігається як JSON з TPO-буквами на кожному ціновому рівні. Для композитного профілю — агрегація на льоту.
- Візуалізація: кастомний canvas-рендерер на React. TPO-букви відображаються як кольорові прямокутники на ціновій осі. POC виділяється горизонтальною лінією. VA — прямокутник.
- TradingView інтеграція: Market Profile як кастомний indicator через Pine Script v5 або через Custom Charts API для професійних рішень.
Оцінка проєкту
Кожен проєкт унікальний — терміни та вартість залежать від складності профілів, джерел даних і глибини історії. Орієнтовно розробка під ключ займає від 4 до 8 тижнів. Зв'яжіться з нами для консультації та оцінки вашого проєкту. Отримайте індивідуальну пропозицію під ваші завдання.







