Розробка системи рівнів підтримки/опору
Автоматичне визначення рівнів підтримки та опору — завдання, яке кожен досвідчений трейдер вирішує інтуїтивно, але алгоритмізація вимагає чіткої методології. Система має знаходити «значимі» рівні: ті, до яких ціна повертається багато разів.
Методи визначення рівнів
1. Кластерний аналіз pivot points
Найпоширеніший підхід. Алгоритм:
- Знайти всі pivot highs та pivot lows за період (rolling window)
- Групувати близькі рівні в кластери (tolerance ±0.5% від ціни)
- Оцінити «силу» кожного рівня: кількість дотиків, обсяг на рівні, свіжість
from scipy.cluster.hierarchy import linkage, fcluster
def cluster_levels(price_points, tolerance=0.005):
prices = np.array([p[1] for p in price_points]).reshape(-1, 1)
Z = linkage(prices, method='single')
labels = fcluster(Z, t=tolerance * np.mean(prices), criterion='distance')
clusters = {}
for i, label in enumerate(labels):
clusters.setdefault(label, []).append(price_points[i])
return {k: np.mean([p[1] for p in v]) for k, v in clusters.items()}
2. Volume Profile / POC
Рівні з максимальним торговим обсягом — найзначиміші зони. Point of Control (POC) — цінова рівень з найбільшим обсягом за період. Цей підхід описаний детальніше в системі Volume Profile.
3. Круглі числа та психологічні рівні
Круглі числа (50000, 100000 для BTC; 3000, 4000 для ETH) діють як рівні чисто психологічно. Алгоритм додатково додає такі рівні з базовою вагою.
4. Fractal рівні
Bill Williams fractal: pivot high з двома нижчими highs з кожної сторони. Суворіше визначення значимого локального максимуму, ніж простий rolling max.
Оцінка сили рівня
Кожен рівень отримує score за кількома метриками:
| Метрика | Опис | Вага |
|---|---|---|
| Touch count | Скільки разів ціна тестувала рівень | Висока |
| Volume at level | Обсяг торгів біля рівня | Висока |
| Recency | Наскільки недавно рівень був актуальним | Середня |
| Bounce strength | Наскільки сильно ціна відштовхнулася | Середня |
| Timeframe confluence | Рівень видимий на кількох таймфреймах | Висока |
Рівень, видимий на денному та 4h таймфреймі одночасно, отримує значно вищий score.
Динамічні рівні
Статичні рівні доповнюються динамічними:
- Moving Averages (EMA 20, 50, 200) — динамічні S/R
- Bollinger Bands — верхня/нижня смуга як динамічне S/R
- VWAP та anchored VWAP — динамічні рівні на основі обсягу
Візуалізація та оновлення
Рівні відриховуються як горизонтальні лінії або зони (прямокутники) на цінному графіку. Товщина/насиченість кольору пропорційна силі рівня.
Зони замість ліній — рівень представляється не як точна ціна, а як діапазон (±ATR/4 від центральної ціни). Це реалістичніше: ринок «тестує» зону, а не точку.
Автоматичне оновлення — при пробої рівня (ціна закрилася за межами зони) він позначається як «broken» та змінює статус (support → resistance або навпаки — зміна полярності). Нові рівні додаються у реальному часі по мірі накопичення pivot points.
Стек: Python для розрахунків (pandas, scipy, numpy), PostgreSQL для зберігання рівнів, WebSocket API для real-time оновлень фронтенду, React + TradingView Lightweight Charts для візуалізації. Система сканує заданий список інструментів та оновлює рівні при кожному закритті свічки.







