Детектор шок-свечей и разворота цены на Python с использованием CCXT и Pandas

Детектор шок-свечей и разворота цены на Python с использованием CCXT и Pandas

Когда мы работаем с криптовалютами, важнейшая задача — распознать точки разворота тренда, особенно после резких скачков. Это может быть шок-свеча вверх, за которой идёт коррекция вниз, или резкое падение, после которого цена начинает восстанавливаться.

В этой статье я покажу, как написать детектор шок-свечей на Python, используя библиотеку ccxt для подключения к Binance и pandas для анализа данных. Скрипт автоматически определяет потенциальные разворотные сигналы и записывает их в файл.

🔧 Что такое «шок-свеча» и как её отследить?

Шок-свеча — это свеча, где изменение цены превышает определённый порог, например 2% за 5 минут. Такие свечи могут быть триггером для крупных движений, особенно если после них цена идет в обратную сторону. Пример:

  • Цена резко выросла на 2.5%, а следующая свеча показывает откат — возможный шорт-сигнал.

  • Цена резко упала на 3%, а следующая свеча закрывается выше — потенциальный лонг-сигнал.


🧠 Как работает скрипт?

Вот логика:

  1. Загружаются последние 10 свечей для выбранных криптовалют и таймфреймов.

  2. Анализируется предпоследняя свеча:

    • если она выросла или упала более чем на 2%,

    • и следующая свеча пошла в обратную сторону,

    • и при этом тело свечи большое (сравнивается с ATR),

    • и объём выше среднего,

    ...тогда выводится сигнал на возможный разворот.

  3. Все сигналы записываются в signals.csv, чтобы можно было их потом анализировать или подключить Telegram-бота для уведомлений.


🛠 Используемые технологии

  • Python 3.10+

  • ccxt — библиотека для подключения к криптобиржам.

  • pandas — работа с временными рядами и таблицами.

  • CSV логирование — простая запись сигналов в файл.


📈 Результат запуска

[BTC/USDT 5m] Проверка свечи от 2025-06-24 14:35:00: Δ=2.17%, Объём x1.54, Тело/ATR=242.33/215.11  
🔻 Потенциал *шорт-реверсала* на BTC/USDT (5m)

⚙️ Как адаптировать под себя?

  • Измени список symbols и timeframes, если хочешь следить за другими активами.

  • Измени shock_threshold, чтобы ловить более или менее агрессивные сигналы.

  • Подключи Telegram-бота или Discord Webhook для алертов в реальном времени.

🏁 Вывод

Этот инструмент может стать отличной основой для более сложной стратегии или просто как фильтр для ручной торговли. Даже такой простой алгоритм помогает вовремя замечать аномальные движения на рынке и реагировать быстрее.

Полный код:
import ccxt
import pandas as pd
import time
from datetime import datetime

# Настройки
symbols = ['BTC/USDT', 'ETH/USDT']
timeframes = ['5m', '15m']
shock_threshold = 0.02  # 2%
exchange = ccxt.binance()

def fetch_data(symbol, timeframe, limit=10):
    try:
        ohlcv = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit)
        df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
        df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
        return df
    except Exception as e:
        print(f"[{symbol} {timeframe}] Ошибка получения данных: {e}")
        return pd.DataFrame()

def check_shock_reversal(df, symbol, timeframe):
    if len(df) < 2:
        print(f"[{symbol} {timeframe}] Недостаточно данных для анализа.")
        return

    last = df.iloc[-2]
    current = df.iloc[-1]

    change = (last['close'] - last['open']) / last['open']
    body_size = abs(last['close'] - last['open'])
    atr = (df['high'] - df['low']).mean()
    volume_avg = df['volume'].mean()
    volume_ratio = last['volume'] / volume_avg

    print(f"[{symbol} {timeframe}] Проверка свечи от {last['timestamp']}: "
          f"Δ={change:.2%}, Объём x{volume_ratio:.2f}, Тело/ATR={body_size:.2f}/{atr:.2f}")

    if body_size < atr or volume_ratio < 1:
        print(f"⚠️ [{symbol}] Сигнал ослаблен (низкий объём или короткое тело)")
        return

    if change >= shock_threshold and current['close'] < last['close']:
        print(f"🔻 Потенциал *шорт-реверсала* на {symbol} ({timeframe})")
        log_signal("short", symbol, timeframe, last['timestamp'])
    elif change <= -shock_threshold and current['close'] > last['close']:
        print(f"🔺 Потенциал *лонг-реверсала* на {symbol} ({timeframe})")
        log_signal("long", symbol, timeframe, last['timestamp'])

def log_signal(direction, symbol, timeframe, timestamp):
    with open('signals.csv', 'a') as f:
        f.write(f"{datetime.now()},{direction},{symbol},{timeframe},{timestamp}\n")

if __name__ == "__main__":
    for symbol in symbols:
        for timeframe in timeframes:
            df = fetch_data(symbol, timeframe)
            check_shock_reversal(df, symbol, timeframe)
            time.sleep(1)  # пауза между запросами, чтобы избежать rate limit
Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

Чтобы оставить комментарий, пожалуйста, войдите или зарегистрируйтесь.