Разработка системы уровней поддержки/сопротивления
Автоматическое определение уровней поддержки и сопротивления — задача, которую каждый опытный трейдер решает интуитивно, но алгоритмизация требует чёткой методологии. Система должна находить «значимые» уровни: те, к которым цена возвращается многократно.
Методы определения уровней
1. Cluster анализ 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. Round numbers и psychological levels
Круглые числа (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 для realtime обновлений фронтенда, React + TradingView Lightweight Charts для визуализации. Система сканирует заданный список инструментов и обновляет уровни при каждом закрытии свечи.







