⚠️ Важное предупреждение
Перед чтением и использованием данной стратегии обязательно обратите внимание на три следующих момента:
1. Стратегия требует терпеливого ожидания момента для открытия позиции
Делистинг контрактов на Binance — это событие с низкой частотой, которое происходит не каждый день. После запуска стратегии может потребоваться несколько дней или даже больше времени, прежде чем сработает первое открытие позиции. В течение работы программы большую часть времени она будет находиться в режиме "ожидания и мониторинга". Пожалуйста, будьте готовы к длительному ожиданию и не воспринимайте отсутствие сделок в краткосрочной перспективе как признак неработоспособности стратегии.
2. Момент обнаружения открытия позиции всё ещё можно оптимизировать
В данной статье используется метод опроса интерфейса fapi/v1/exchangeInfo каждые 15 секунд для идентификации сигнала делистинга по изменению поля deliveryDate. Этот метод имеет некоторую задержку в реальной торговле и не является самым быстрым путём. Читатели могут оптимизировать способ обнаружения в соответствии со своими потребностями, например: сократить интервал опроса, параллельно мониторить API объявлений Binance, подписаться на WebSocket-уведомления, комбинировать перекрёстную проверку нескольких источников сигналов и т.д., чтобы занять позицию как можно раньше. Чем раньше войдёте в позицию, тем больше сможете получить от первого резкого падения.
3. Обязательно своевременно останавливайте стратегию, чтобы предотвратить откат прибыли
В реальной торговле наблюдалось, что не все монеты, подлежащие делистингу, непрерывно падают до момента делистинга. Некоторые инструменты резко падают после объявления, а затем в течение нескольких часов или суток постепенно отскакивают, и цена может даже вернуться к уровню, предшествовавшему объявлению. Если вовремя не остановить стратегию, накопленная ранее плавающая прибыль может быть значительно съедена при отскоке, и даже возможен переход от прибыли к убытку.
Рекомендуется установить любое из следующих условий в качестве сигнала для активного выхода:
-- Достижение заранее установленной цели по прибыли — немедленное закрытие позиции;
-- Принудительное закрытие позиции при отскоке цены выше определённого процента от минимума после объявления (например, 20–30%);
-- Срабатывание защиты по прибыли при просадке позиции до определённой доли от пиковой прибыли (например, 30–50%).
Ни в коем случае не пассивно ждать за 60 минут до делистинга — это механизм страховки, а не оптимальный момент для выхода.
Предисловие
На рынке контрактов Binance существует особый класс торговых возможностей, который часто упускается из виду большинством — события делистинга контрактов.
Время от времени Binance публикует объявление о делистинге некоторых бессрочных контрактов с низкой ликвидностью или снижающимся объёмом торгов. В момент публикации объявления рынок быстро реагирует: трейдеры, держащие длинные позиции, вынуждены закрывать их, панические продажи следуют одна за другой, цена монеты часто резко падает в течение нескольких минут после объявления, а затем переходит в длительный период колебаний с нисходящим трендом вплоть до окончательного делистинга.
Возьмём, к примеру, недавний MLNUSDT:
За полчаса цена упала почти на треть, а весь период делистинга обычно длится несколько дней, в течение которых цена остаётся на низких уровнях с колебаниями. Такая ситуация — естественная благоприятная среда для коротких стратегий.
Однако ручное отслеживание таких возможностей сопряжено с двумя трудностями:
Первое: чрезвычайно высокая временная актуальность информации. Первые 5 минут после объявления — это окно с наибольшим падением. Если упустить момент входа, риск последующего шорта значительно возрастает. Ручной мониторинг не может обеспечить круглосуточную реакцию в реальном времени.
Второе: цена идёт не просто однонаправленным водопадом. В процессе падения постоянно возникают отскоки. Простое удержание короткой позиции позволяет заработать на тренде, но упускает множество возможностей для высокочастотной разницы цен во время отскоков.
Именно для решения этих двух проблем в данной статье представлена полная автоматизированная стратегия: с помощью программы в реальном времени отслеживать сигналы делистинга на Binance, автоматически открывать базовую короткую позицию в первый момент после объявления, одновременно запускать динамическую короткую сетку для постоянного захвата разницы на колебаниях в условиях общего нисходящего тренда и, в конечном итоге, автоматически закрывать позицию перед делистингом без какого-либо ручного вмешательства.
1. Почему именно такая ситуация на рынке
Прежде чем углубляться в объяснение стратегии, необходимо понять характеристики движения цены монет, подлежащих делистингу. Это основа проектирования всей стратегии.
1.1 Рыночное воздействие объявления о делистинге
Когда Binance объявляет о делистинге какого-либо бессрочного контракта, первой реакцией рынка является паника. Трейдеры, имеющие длинные позиции, знают, что контракт скоро исчезнет, и они должны закрыть свои позиции до делистинга, иначе будут принудительно расчитаны. Это массовое давление продаж создаёт сильное предложение в краткосрочной перспективе, что приводит к быстрому снижению цены.
В то же время маркет-мейкеры быстро сужают спреды или выводят ликвидность, что ещё больше усиливает волатильность цены. Именно поэтому первые несколько минут после объявления о делистинге часто являются периодом наибольшего падения во всём цикле делистинга.
1.2 Закономерность колебаний с нисходящим трендом
После первого резкого падения цена не падает по прямой до дна, а демонстрирует типичное колебательное снижение:
Такое формирование имеет свою внутреннюю логику: каждый отскок — это попытка краткосрочных трейдеров, считающих, что цена упала слишком сильно и пора покупать на дне. Однако, поскольку фундаментальные показатели не изменились (контракт скоро исчезнет), эти покупки быстро оказываются в убытке, и цена снова идёт вниз. Высота отскоков становится всё ниже, пока ликвидность не иссякнет полностью перед делистингом.
Такие регулярные колебания — наиболее подходящая рыночная ситуация для сеточной стратегии.
1.3 Два источника дохода
На основе вышеизложенного анализа можно разработать два независимых пути получения прибыли:
| Источник дохода | Соответствующий инструмент | Условие прибыльности |
|---|---|---|
| Трендовое падение | Базовая короткая позиция | Цена в целом идёт вниз |
| Колебательная разница | Короткая сетка | Цена колеблется в пределах диапазона |
Их комбинация делает стратегию весьма прибыльной в условиях делистинга. Даже если цена существенно отскочит, сеточная часть всё равно будет продолжать собирать разницу; а пока общий тренд остаётся нисходящим, базовая позиция будет приносить прибыль.
2. Принцип мониторинга: как обнаружить сигнал делистинга в первый момент
Для мониторинга информации о контрактах данная стратегия использует более прямой метод: непосредственный мониторинг изменений данных в интерфейсе контрактов Binance.
2.1 Секрет поля deliveryDate
Интерфейс Binance fapi/v1/exchangeInfo возвращает подробную информацию по всем контрактам, и среди них есть поле под названием deliveryDate, указывающее время поставки контракта.
Для бессрочных контрактов это поле обычно устанавливается на далёкую будущую метку времени:
4133404800000 → соответствует 31 декабря 2100 года
Это своего рода заполнитель "бессрочности".
Ключевой момент: когда Binance решает исключить какой-либо бессрочный контракт, одновременно с публикацией объявления он изменяет deliveryDate этого контракта на реальную временную метку делистинга.
Нормальный бессрочный контракт: deliveryDate = 4133404800000 (бессрочный)
Контракт, подлежащий делистингу: deliveryDate = 1744106400000 (2026-04-08 17:00:00)
Это изменение сразу же отражается в данных интерфейса, что происходит быстрее, чем рендеринг страницы объявления, и является более структурированным — не требуется парсить HTML.
2.2 Реализация кода мониторинга
Каждые 15 секунд вызывается интерфейс, фильтруются USDT-бессрочные контракты, у которых deliveryDate изменился на реальную временную метку:
python
def fetch_delist_symbols():
body = HttpQuery("https://fapi.binance.com/fapi/v1/exchangeInfo")
data = json.loads(body)
now_ms = get_now_ms()
result = {}
for s in data.get("symbols", []):
if not s["symbol"].endswith("USDT"):
continue
if s.get("contractType") != "PERPETUAL":
continue
dd = s.get("deliveryDate", PERPETUAL_END)
if dd < PERPETUAL_END and dd > now_ms:
result[s["symbol"]] = dd
return result
Пример возвращаемого результата:
python
{
"HIPPOUSDT": 1744106400000, # 2026-04-08 17:00:00
"OLUSDT": 1744106400000,
"RLSUSDT": 1744106400000,
"PUFFERUSDT":1744106400000,
}
Примечание: после реального тестирования обнаружена небольшая задержка; можно выбрать более своевременный метод проверки.
3. Архитектура стратегии
Вся стратегия состоит из двух параллельно работающих модулей:
После обнаружения нового контракта для каждого контракта независимо создаётся объект task, содержащий всё состояние этого контракта:
python
task = {
"symbol": "HIPPO_USDT",
"delist_time_ms": 1744106400000,
"fund_per_task": 250.0, # выделенный капитал
"base_short_qty": 1500000, # количество базовой короткой позиции
"range_high": 0.0005287, # верхняя граница сетки
"range_low": 0.0004758, # нижняя граница сетки
"grid_width": 0.0000529, # ширина диапазона (фиксированная)
"grids": [...], # состояние 10 ячеек
"shift_count": 0, # количество уже совершённых сдвигов
...
}
Объекты task для разных контрактов независимы друг от друга, не мешают и работают параллельно.
4. Распределение капитала
После обнаружения N контрактов, подлежащих делистингу, доступный остаток на счёте динамически делится поровну:
Выделенный капитал на контракт = Доступный остаток × 80% / N
Оставшиеся 20% оставляются в качестве буфера маржи, чтобы предотвратить ликвидацию при краткосрочном отскоке цены.
Ключевая деталь: при последовательной инициализации нескольких контрактов каждый раз, когда инициализируется один контракт, доступный остаток на счёте уменьшается (базовая позиция занимает маржу). Поэтому нельзя рассчитать выделенный капитал для всех контрактов один раз в начале цикла; необходимо запрашивать заново перед каждой инициализацией:
python
for idx, (binance_sym, delist_ms) in enumerate(delist_map.items()):
update_global_account()
remaining_count = total_new - idx
available_now = total_balance - margin_used
fund_per_task = available_now * 0.8 / remaining_count
task = init_task(binance_sym, delist_ms, fund_per_task)
Это гарантирует, что каждый контракт получит разумное распределение средств и последующие контракты не останутся без средств из-за того, что предыдущие заняли слишком много маржи.
V. Детальное описание базовой позиции и сетки
5.1 Базовая короткая позиция
Сразу после объявления, при инициализации, открываем короткую позицию по рыночной цене, не дожидаясь сетки:
Номинальный объем базовой короткой позиции = Распределенные средства × 50% × Кредитное плечо
Пример: Распределено 250 USDT, плечо 10x
Номинальный объем = 250 × 50% × 10 = 1250 USDT
Базовая позиция удерживается на протяжении всего периода, не участвует в повторных открытиях/закрытиях сетки, а закрывается только при принудительной ликвидации перед делистингом.
Базовая позиция – это часть стратегии с наибольшей доходностью. Если монета, подлежащая делистингу, упадет на 50% от объявления до делистинга, базовая позиция принесет эти 50% дохода от короткой позиции (с учетом плеча).
5.2 Настройка сетки для коротких позиций
Верхняя граница – текущая цена, нижняя – на 10% ниже. Сетка равномерно делится на 10 уровней:
Пример (текущая цена 0,0005287, ширина диапазона 10%):
Верхняя граница = 0,0005287
Нижняя граница = 0,0005287 × (1 - 10%) = 0,0004758
Шаг сетки = (0,0005287 - 0,0004758) / 10 = 0,0000053
Уровень 9: open_short@0,0005287 → close_short@0,0005234
Уровень 8: open_short@0,0005234 → close_short@0,0005181
Уровень 7: open_short@0,0005181 → close_short@0,0005128
...
Уровень 0: open_short@0,0004811 → close_short@0,0004758
Средства распределяются равномерно по уровням. Логика проста: цена подскакивает до цены открытия короткой позиции – размещается ордер на открытие, цена падает до цены закрытия короткой позиции – размещается ордер на закрытие. После завершения одного цикла снова размещается ордер на открытие короткой позиции в ожидании следующего отскока.
5.3 Стратегия размещения ордеров при старте
При запуске ордера размещаются на всех уровнях, где цена открытия короткой позиции >= текущей цене:
Текущая цена 0,0005287
Уровень 9: цена открытия = 0,0005287 ≥ 0,0005287 → ордер размещён ✅
Уровень 8: цена открытия = 0,0005234 < 0,0005287 → skip_below (цена уже прошла ниже)
Уровень 7 и ниже – все skip_below
Причина, по которой выставляются ордера на все уровни выше текущей цены, заключается в том, что в нисходящем тренде цена может неожиданно подскочить выше ожидаемого, и наличие заранее размещённых ордеров гарантирует, что не будет упущена ни одна возможность открыть короткую позицию при таком отскоке.
VI. Динамическое смещение диапазона
Это центральный механизм всей стратегии. Цена не остаётся навсегда в начальном диапазоне. Сетка должна следовать за ценой, чтобы непрерывно захватывать спред.
6.1 Смещение вниз (пробой нижней границы)
Когда цена пробивает нижнюю границу сетки, это означает, что падение вышло за пределы текущего диапазона, и смещаем диапазон вниз:
Старый диапазон: 0,0004758 ~ 0,0005287
Текущая цена: 0,0004500 (пробой нижней границы 0,0004758)
Расчёт нового диапазона (шаг смещения 5%):
shift_step = 0,0004500 × 5% = 0,0000225
Новая верхняя граница = 0,0005287 - 0,0000225 = 0,0005062
Новая нижняя граница = 0,0005062 - 0,0000529 = 0,0004533
Новый диапазон: 0,0004533 ~ 0,0005062
6.2 Смещение вверх (отскок выше верхней границы)
Когда цена отскакивает и превышает верхнюю границу, диапазон смещается вверх вслед за ней:
Старый диапазон: 0,0004494 ~ 0,0005023
Текущая цена: 0,0005100 (выше верхней границы 0,0005023)
Новый диапазон смещается вверх так, чтобы текущая цена оказалась внутри
Новый диапазон: 0,0004758 ~ 0,0005287
Этот механизм гарантирует, что независимо от колебаний цены сетка всегда следует за ней, и не возникает ситуации, когда цена выходит за пределы диапазона, и все уровни остаются пустыми.
6.3 Ширина диапазона остаётся неизменной
При каждом смещении изменяется только положение диапазона, а не его ширина:
python
grid_width = round(range_high - range_low, 8) # фиксируется при инициализации
# При смещении вниз
range_high = fp(task, range_high - shift_step)
range_low = fp(task, range_high - grid_width) # рассчитывается по фиксированной ширине
Это предотвращает накопление ошибок с плавающей точкой, которые со временем сужают или расширяют диапазон.
6.4 Механизм защиты позиций
При смещении диапазона все ордера отменяются, и сетка перестраивается. Но что делать с уровнями, где уже открыта короткая позиция и ожидается закрытие?
Если просто перестроить сетку, эти позиции «потеряются» – останутся короткие позиции без соответствующих ордеров на закрытие, превратившись в «голые» позиции, полностью подверженные риску отскока.
Решение: перед смещением записать количество контрактов во всех открытых позициях, а после смещения разместить ордер на закрытие короткой позиции на самом нижнем уровне нового диапазона:
python
# Суммируем позиции перед смещением
holding_contracts = sum(
g.get("sell_contracts", 0)
for g in task["grids"]
if g["status"] in ("pending_cover", "holding_no_cover")
)
cancel_all_orders(task)
activate_grids(task, new_high, new_low)
# После смещения размещаем защитный ордер на закрытие на нижнем уровне
if holding_contracts > 0:
_place_grid_cover(task, 0, holding_contracts)
Таким образом, независимо от того, как смещается диапазон, уже открытые короткие позиции не теряют отслеживания.
VII. Параллельное управление несколькими контрактами
7.1 Логика обработки при обнаружении нового контракта
Средства, высвобожденные при закрытии старых контрактов, повторно распределяются, чтобы новый контракт получил достаточное финансирование.
7.2 Управление жизненным циклом
Жизненный цикл каждого контракта:
VIII. Несколько ключевых деталей
8.1 Ловушка точности для монет с малой ценой
Для таких монет, как HIPPOUSDT с ценой порядка 0,0003, при расчёте шага смещения диапазона возникают проблемы с точностью:
shift_step = 0,0003 × 5% = 0,000015
Если PricePrecision = 4 (4 знака после запятой)
round(0,000015, 4) = 0,0 ← шаг становится 0!
→ цикл while никогда не завершится, бесконечный цикл
Решение: не округлять шаг и установить минимальный шаг в качестве защиты:
python
shift_step = price * SHIFT_STEP_PCT
min_step = 10 ** (-PricePrecision)
shift_step = max(shift_step, min_step) # как минимум одна единица минимальной точности
8.2 Обработка ошибок при открытии базовой короткой позиции
Открытие короткой позиции по рыночной цене может не удаться из-за нехватки средств или проблем с сетью. В этом случае нельзя продолжать строить сетку, иначе получится «голая» сетка без базовой позиции:
python
def open_base_short(task):
oid = place_market_short(task, usdt_amount)
Sleep(1000)
amt, _, _ = get_short_position(task)
task["base_short_qty"] = amt
if amt <= 0:
Log(f"Не удалось открыть базовую короткую позицию, пропускаем контракт")
return False
return True
# В init_task
if not open_base_short(task):
return None # Инициализация не удалась, не добавляем в tasks
8.3 Время и способ принудительного закрытия
Выбираем время за 60 минут до делистинга (а не за 30, когда Binance запрещает открытие новых позиций), чтобы оставить достаточное окно для закрытия. Чем ближе к делистингу, тем хуже ликвидность и сложнее закрыть позицию.
При закрытии используем лимитный ордер с ценой чуть выше рыночной, а не настоящий рыночный ордер, чтобы избежать невыгодного исполнения при крайне низкой ликвидности:
python
buy_p = fp(task, price * 1.005) # на 0,5% выше рыночной
exchange.CreateOrder(swapcode, "closesell", buy_p, fc)
Если с первой попытки закрыть не удалось, повторяем до 10 раз, каждый раз получая новую цену.
8.4 Дополнительный доход от ставки финансирования
На нисходящем рынке ставка финансирования обычно благоприятна для коротких позиций (короткие продавцы получают платежи). Это дополнительный доход от удержания базовой позиции, который не отображается в статистике спреда сетки, но отражается в росте капитала счёта.
IX. Рекомендации по настройке параметров
python
LEVERAGE = 10 # Кредитное плечо, рекомендуется 5~10, не слишком высокое
GRID_WIDTH_PCT = 0.10 # Ширина диапазона 10%, покрывает нормальную амплитуду колебаний
SHIFT_STEP_PCT = 0.05 # Шаг сдвига 5%, примерно половина ширины диапазона
GRID_COUNT = 10 # Количество ячеек, чем больше ячеек, тем меньше средств на каждую
BASE_SHORT_RATIO = 0.5 # Базовая позиция 50%, сетка 40%, резерв 10%
FORCE_CLOSE_MINS = 60 # Принудительное закрытие за 60 минут до делистинга
MONITOR_INTERVAL = 15000 # Мониторинг каждые 15 секунд, баланс между оперативностью и лимитами частоты
Выбор ширины диапазона: Чем шире диапазон, тем больший размах колебаний он покрывает, но и шаг сетки становится больше, а частота сбора прибыли снижается. Рекомендуется корректировать в зависимости от исторической волатильности монеты; обычно 10% – разумная отправная точка.
Выбор количества ячеек: Чем больше ячеек, тем меньше шаг сетки и выше частота сбора прибыли, но при этом средств на каждую ячейку становится меньше, а прибыль за одну сделку снижается. Слишком большое количество ячеек также может привести к тому, что средств на ячейку не хватит для минимального ордера. 10 ячеек – достаточно сбалансированный выбор.
10. Предупреждение о рисках
Перед использованием данной стратегии необходимо полностью осознавать следующие риски:
Риск отскока: Если новость уже была заранее учтена рынком (price in), после объявления может произойти отскок («покупка на новостях»), и базовая позиция временно окажется в убытке. Сеточная часть всё ещё будет собирать разницу при отскоке, но в целом возможна временная просадка.
Риск ликвидности: Чем ближе время делистинга, тем ниже ликвидность контракта, увеличивается спред, растёт проскальзывание при закрытии. В стратегии предусмотрены надбавка 0,5% и 10 попыток повторной отправки, но в экстремальных ситуациях полное закрытие всё равно может быть невозможным.
Риск ложных сигналов: В редких случаях Binance отменяет или откладывает планы делистинга; в этом случае стратегия будет продолжать удерживать короткие позиции до ручного вмешательства или следующего обновления мониторинга.
Риск высокого кредитного плеча: Волатильность монет, подлежащих делистингу, чрезвычайно высока. При плече 10x даже отскок на 10% может привести к потере почти всего счёта. Рекомендуется корректировать плечо в соответствии с собственной толерантностью к риску и контролировать общий размер позиции.
Своевременный запуск и остановка стратегии: По опыту реальной торговли, у некоторых инструментов цена после дня бокового движения вниз может постепенно вернуться к уровню до объявления; необходимо вовремя отключать стратегию.
Продолжительность работы: Стратегии может потребоваться длительное время для выявления возможностей; необходимо набраться терпения.
11. Заключение
Основная ценность данной стратегии заключается в преобразовании информационного преимущества (обнаружение сигнала делистинга в кратчайшие сроки) в торговое преимущество (автоматизированное исполнение), а также, благодаря двойной структуре «базовая позиция + сетка», в одновременном захвате как трендовой прибыли, так и разницы колебаний при однонаправленном нисходящем движении.
Ключевые конструктивные особенности всей системы:
| Модуль | Основная конструкция | Решаемая проблема |
|---|---|---|
| Мониторинг deliveryDate | Прямое чтение изменений полей интерфейса | Обнаружение сигнала делистинга за секунды |
| Динамическое распределение средств | Перепроверка баланса перед каждой инициализацией | Равномерное распределение средств по нескольким контрактам |
| Открытие базового шорта по рыночной цене | Немедленное исполнение после объявления | Не упустить первую волну резкого падения |
| Размещение ордеров по всем ячейкам | Размещение ордеров во всех ячейках выше текущей цены | Не упустить неожиданный отскок |
| Фиксированная ширина диапазона | Сохранение ширины при сдвиге | Предотвращение дрейфа float |
| Защита позиции | Переразмещение ордеров на закрытие шорта после сдвига | Предотвращение голой позиции |
| Принудительное закрытие за 60 минут | Оставление достаточного временного окна для закрытия | Борьба с низкой ликвидностью |
Ситуации с делистингом происходят не каждый день, но каждый раз они предоставляют относительно высокую степень определённости для торговли. Благодаря автоматизированному мониторингу и исполнению можно стабильно участвовать в таких возможностях без необходимости постоянного наблюдения за рынком.
Исходный код стратегии: Стратегия сетки с делистингом контракта
- 1







