В трейдинге часто говорят: «Цена — это следствие, объём — это причина».
Именно так я наткнулся на одну простую, но крайне интересную закономерность: если в момент падения появляется свеча с объёмом, который в два раза превышает средний за последние 60 дней, — то на следующей свече часто начинается рост. Об этой идее упомянул довольно популярных трейдер spicy в твиттере.
Звучит почти как байка, но я решил проверить это на практике — с помощью кода, бэктеста и живой реализации на бирже.
💡 Идея
Гипотеза звучит просто:
Если дневная свеча красная (то есть закрылась ниже открытия)
и её объём в 2 раза больше, чем средний объём за последние 60 свечей —
то на следующей дневной свече можно открыть лонг, и к закрытию следующего дня это даст положительный результат.
То есть, мы ищем момент капитуляции — когда рынок падает, но при этом объём всплескивает, как будто кто-то крупный вышел из позиции.
И именно после таких разгрузок часто начинаются разворот
🧪 Проверяем гипотезу: бэктест
Чтобы не верить на слово, я написал скрипт volume.py, который берёт исторические данные с Binance и проверяет, как бы стратегия работала за последние годы.
Код вы можете подгрузить с github, чтобы проверить это самим.
Переменные в начале файла
- SYMBOL = "ETHUSDT" — торговая пара, для которой делаем тест.
- LIMIT = 2500 — общее число свечей.
- VOLUME_LOOKBACK = 60 — длина окна среднего объёма (60 дней).
- VOLUME_MULTIPLIER = 2.0 — множитель объёма
- BINANCE_KLINES_URL = "https://api.binance.com/api/v3/klines" — публичный URL Binance (в коде используется binance.client, но ссылка тут для справки).
fetch_klines(symbol='BTCUSDT', interval='5m', total_bars=1200, client=None)
Что делает:
Загружает исторические свечи через официальную библиотеку binance.client.Client. Поддерживает постраничную загрузку (пока не набрано total_bars). Возвращает массив данных с колонками: timestamp, open, high, low, close, volume.
Прогоняет стратегию по массиву со свечами. Для каждой свечи проверяет условие на "падение + большой объём"). При выполнении — считается вход на следующей свече по открытию и выход в конце следующей свечи (close). Возвращает DataFrame с результатами по всем сделкам.
📈 Результаты
Бэктест по ETHUSDT показал:
Сделок: 60
Побед: 36, поражений: 24
Общая доходность: 94.60%
Всего за 5 лет было 60 таких истуаций. Винрейт при этом составил 60%.
Ну и допустим, наша позиция 1000$. Комиссия на тир1 биржах (общая) 0,1-0,11%. Тогда она составит 1$ на позицию. Прирост капитала 946$, а комиссия 60$. Итого 886$ прибыли.
Также я предоставляю специальные условия для регистрации на BingX в диалогах/телеграме. По ссылке будет полный возврат реферальных комиссий для моих читателей, комиссия составим 0,5% и тогда прирост составит 916$.
Причём обратите внимание, что максимальная просадка по этой стратегии в моменте всего 20% для equity. Это не так много, и в целом мы можем говорить о том, что прибыль вполне стабильна. Это бектест по ETHUSDT (etherium). По биткоину результат следующий:
Побед: 41, поражений: 22, общая доходность: 84.26%
Впринципе результаты похожие, но обратите внимание что максимальная просадка около 10%. Мне такой расклад нравится больше, поэтому в реальном бота остановимся на BTC.
Комиссии - один из главных врагов в торговле. Поэтому буду использовать bingx чтобы снизить потери на комиссионные. Для читателей есть выбил возможность возврата комиссий здесь. Вы также можете использовать, например, bybit. API bybit проще для новичков, так что без проблем сможете отредактировать код под него.
Для bingx я создаю отдельный клиент, он используется мной во всех скриптах, тоже прикрепил его на github - он упрощает работу с биржей и позволяет открывать сделки даже без сильных знания в программировании и api. Вот ссылка на код.
Тут просто прописаны и связаны все функции из документации в один класс, чтобы я мог без проблем импортировать данный код и пне переписывать каждый раз одни и те же функции.
Теперь давайте приступим к основной логике. К нашему бектест коду прибавится только ежедневная подгрузка свечей и проверка их объёма, а также функция открытия позиций.
Основной скрипт
Вот ссылка на скрипт, чтобы не перекопировать все функции:
github
Для начала сделаем конфиг и инициализируем биржу:
import time
import requests
import datetime as dt
from decimal import Decimal
from bingx_client import BingxClient # скачанный клиент BingX
# --------------- Конфигурация -----------------
API_KEY = "ENTER API KEY"
API_SECRET = "ENTER API SECRET"
SYMBOL = "BTCUSDT"
VOLUME_LOOKBACK = 60
VOLUME_MULTIPLIER = 2.0
QTY = 5
QTY_USDT = None # можно вместо QTY указать сумму в USDT
BINANCE_KLINES_URL = "https://api.binance.com/api/v3/klines"
bx = BingxClient(api_key=API_KEY, api_secret=API_SECRET, symbol=SYMBOL)
Вам необходимо будет указать в скрипте api ключ и secret для биржи - в моем коде это будет bingx. Дальше указывает позицию, на сколько мы будем откупать биткоин после падений. Можно выставить как в активе, так и в долларах. После этого уже инициализируем биржу и мы готовы работать.
В бэктесте мы использовали binance.client, но в боевом коде сделаемподгрузку напрямую через HTTP-запросы — это лучше: меньше зависимостей и быстрее инициализация. Так как скрипт работает с дневными свечами, я решил что это более надежный вариант - не зависим от клиента бинанса.
Что происходит:
- параметры: торговая пара (symbol), интервал (1d — дневные свечи) и limit (сколько последних свечей загрузить);
- Binance возвращает список, где каждая свеча — это массив из 12 чисел (open time, open, high, low, close, volume, …);
- функция возвращает этот «сырой» JSON.
Почему 61 свеча?
Потому что мы анализируем последние 60 свечей для среднего объёма + 1 закрытую свечу (для проверки условия).
💎 Открытие позиции
Когда условие выполнено, запускается блок:
bx.place_market_order(side="long", qty=qty_to_use, symbol=SYMBOL)
Здесь bx — это экземпляр класса BingxClient, который подключён к API.
Он знает ключи, умеет подписывать запросы и отправлять ордера.
- side="long" → открываем лонг-позицию
- type="MARKET" → ордер сразу исполняется по рыночной цене.
- positionSide="LONG" → важно для фьючерсов: отличает направление позиции.
- quantity=qty_to_use → количество BTC, которое задаём в настройках (QTY = 5)
⏰ Ожидание и закрытие позиции
После открытия идёт пауза ровно до следующего открытия дня.
Функция seconds_until_next_daily_open() вычисляет, сколько секунд осталось до следующего 00:00 UTC.
Мы добавляем +2, чтобы не попасть в момент пересчёта свечи и не словить ошибку API.
Как только наступает новый день — скрипт закрывает позицию:
bx.place_market_order(side="short", qty=qty_to_use, symbol=SYMBOL)
Здесь мы просто открываем рыночный ордер «в обратную сторону» —
для фьючерсов это означает закрытие текущей позиции (если до этого был LONG — теперь SELL).
🔄 6. Цикличность
Всё это помещено в бесконечный цикл while True:,
чтобы бот непрерывно работал каждый день:
- ждёт открытия новой свечи;
- проверяет условие;
- если сигнал есть — торгует;
- если нет — просто ждёт следующего дня.
⚙️ Итог: как всё работает вместе
- Ждём 00:00 UTC.
- Загружаем 61 дневную свечу с Binance.
- Проверяем:
последняя свеча была красной;
объём ≥ 2× среднего за 60 предыдущих. - Если условие выполнено → открываем лонг через BingX API.
- Ждём 24 часа, пока откроется новая дневная свеча.
- Закрываем позицию.
- Возвращаемся к пункту 1.
🧩 Итог
В этой статье я показал, как из простой рыночной идеи можно вырастить полноценную стратегию — от гипотезы до рабочего бота.
Всё началось с наблюдения: когда рынок падает на повышенных объёмах, часто за этим следует отскок.
Я проверил это через бэктест — и получил статистически значимое преимущество:
60 сделок, 36 прибыльных, общая доходность почти +95% по ETHUSDT. Аналогично и по BTCUSDT, только с меньшей просадкой - его мы и выбрали для основной стратегии.
Дальше — автоматизация.
Я написал основной скрипт, который подключается к API BingX,
сам ждёт открытия новой дневной свечи, проверяет условия,
и при их выполнении открывает и закрывает сделки полностью в автоматическом режиме.
BingX стал отличным выбором —
комиссия всего 0.05%, API стабилен. Для удобства - написал bingxClient, где есть все нужные для алго функции.
На выходе получился минималистичный, но честный подход:
- без десятков индикаторов,
- без сложных параметров оптимизации,
- с прозрачной логикой и воспроизводимым результатом.
И самое главное — всё подкреплено цифрами, а не интуицией.
Эта стратегия на дистанции может приносить отличный доход, особенно с максимальной просадкой в 10%. Ведь при такой просадке мы можем выставить для позиции 3-5 плечо, что кратко поднимет нашу прибыль, и уже сможем получать около 80% годовых. И всё же, без плеча это отличная консервативная стратегия, которая подойдет каждому.