⚠️ Recordatorio importante
Antes de leer y utilizar esta estrategia, tenga en cuenta los siguientes tres puntos:
1. La estrategia requiere paciencia para esperar oportunidades de apertura de posiciones.
La exclusión de contratos perpetuos en Binance es un evento de baja frecuencia que no ocurre a diario. Una vez iniciada la estrategia, puede tardar días o incluso más tiempo en activar la primera apertura de posición. Durante la mayor parte del tiempo de ejecución, el programa estará en modo de "monitoreo en espera". Prepárese mentalmente para una larga espera y no asuma erróneamente que la estrategia ha fallado por la falta de operaciones en el corto plazo.
2. El momento de la detección de apertura de posición aún puede optimizarse.
Este artículo utiliza un método de sondeo cada 15 segundos de la interfaz fapi/v1/exchangeInfo, identificando las señales de exclusión a través del cambio en el campo deliveryDate. Este enfoque tiene cierto retraso en las pruebas reales y no es la ruta más rápida. Los lectores pueden optimizar el método de detección según sus necesidades, por ejemplo: acortar el intervalo de sondeo, monitorear en paralelo la API de anuncios de Binance, suscribirse a la transmisión WebSocket, combinar señales de múltiples fuentes para verificación cruzada, etc., con el objetivo de lograr una entrada más temprana. Cuanto antes se entre, mayor será la caída máxima de la primera ola de desplome.
3. Asegúrese de detener la estrategia a tiempo para evitar la reversión de ganancias.
En las pruebas reales se ha observado que no todos los pares excluidos caen de manera constante hasta el momento de la exclusión. Algunos pares, después del anuncio, caen bruscamente y luego se recuperan gradualmente en cuestión de horas o un día, e incluso pueden volver al nivel anterior al anuncio. Si no se detiene a tiempo, las ganancias flotantes acumuladas inicialmente pueden ser devoradas en gran medida durante la recuperación, e incluso se puede pasar de ganancias a pérdidas.
Se recomienda establecer cualquiera de las siguientes condiciones como señal de salida activa:
- Cerrar todas las posiciones inmediatamente después de alcanzar el objetivo de ganancias preestablecido;
- Forzar el cierre cuando el precio se recupere más allá de un cierto porcentaje (por ejemplo, 20%~30%) desde el punto más bajo después del anuncio;
- Activar la protección de toma de ganancias cuando la retrocesión de la posición alcance un cierto porcentaje de las ganancias máximas (por ejemplo, 30%~50%).
No espere pasivamente hasta 60 minutos antes de la exclusión para cerrar la posición; ese es un mecanismo de respaldo, no el momento óptimo de salida.
Prefacio
En el mercado de futuros perpetuos de Binance, existe un tipo especial de oportunidad de trading que la mayoría de las personas suele pasar por alto: los eventos de exclusión de contratos.
Periódicamente, Binance publica anuncios declarando la exclusión de ciertos contratos perpetuos con baja liquidez o volumen de negociación reducido. En el momento del anuncio, el mercado reacciona rápidamente: los traders con posiciones largas se ven obligados a cerrar, se desata una venta por pánico, y el precio a menudo cae violentamente en cuestión de minutos, seguido de un largo período de movimiento lateral y bajista hasta la exclusión final.
Tomemos como ejemplo MLNUSDT:
Cae casi un tercio en media hora, y todo el ciclo de exclusión suele durar varios días, durante los cuales el precio se mantiene en un rango bajo. Este tipo de comportamiento del mercado es un caldo de cultivo natural para estrategias bajistas.
Sin embargo, operar manualmente estas oportunidades tiene dos dificultades:
Primero, la inmediatez de la información. Los primeros 5 minutos después del anuncio son la ventana de mayor caída. Si se pierde la entrada inicial, el riesgo de seguir la tendencia bajista aumenta significativamente. Es difícil lograr una respuesta en tiempo real las 24 horas del día, los 7 días de la semana con monitoreo manual.
Segundo, el movimiento no es un desplome lineal. Durante la caída del precio, ocurren rebotes constantes. Mantener simplemente una posición corta permite obtener ganancias de tendencia, pero se pierden las numerosas oportunidades de diferenciales de alta frecuencia durante los rebotes.
Para resolver estos dos problemas, este artículo presenta una estrategia automatizada completa: monitorear en tiempo real las señales de exclusión de contratos de Binance mediante un programa, abrir automáticamente una posición corta base en el momento del anuncio, y al mismo tiempo iniciar una rejilla dinámica bajista para capturar continuamente los diferenciales de volatilidad dentro de la tendencia bajista general, y finalmente cerrar automáticamente la posición antes de la exclusión, sin intervención manual.
I. ¿Por qué este tipo de mercado?
Antes de profundizar en la estrategia, debemos entender las características del movimiento de precios de los pares excluidos, ya que son la base del diseño de la estrategia.
1.1 Impacto del anuncio de exclusión en el mercado
Cuando Binance anuncia la exclusión de un contrato perpetuo, la primera reacción del mercado es el pánico. Los traders con posiciones largas saben que el contrato desaparecerá y deben cerrar antes de la exclusión, o serán liquidados forzosamente. Esta venta concentrada genera una fuerte presión vendedora a corto plazo, llevando el precio a la baja rápidamente.
Al mismo tiempo, los market makers reducen sus cotizaciones o retiran liquidez, lo que intensifica aún más la volatilidad del precio. Por eso, los primeros minutos después del anuncio suelen ser el período de mayor caída en todo el ciclo de exclusión.
1.2 Patrón de movimiento lateral bajista
Después de la primera caída brusca, el precio no desciende en línea recta hasta el fondo, sino que muestra un típico movimiento lateral bajista:
Este patrón tiene una lógica interna: cada rebote se debe a que los traders de corto plazo creen que la caída es excesiva y compran en el fondo, pero como el fundamento no ha cambiado (el contrato está por desaparecer), las compras pronto quedan atrapadas y el precio vuelve a bajar. La altura de los rebotes es cada vez menor, hasta que la liquidez se agota por completo antes de la exclusión.
Este vaivén regular es el mercado más adecuado para una estrategia de rejilla.
1.3 Dos fuentes de ganancias
Basándonos en lo anterior, podemos diseñar dos vías de ganancia independientes:
| Fuente de ganancia | Herramienta correspondiente | Condición de ganancia |
|---|---|---|
| Tendencia bajista | Posición corta base | Precio general a la baja |
| Diferencial de volatilidad | Rejilla bajista | Precio oscila repetidamente en un rango |
La combinación de ambas hace que la estrategia sea altamente rentable en mercados de exclusión. Incluso si el precio experimenta un rebote considerable, la rejilla aún puede cosechar diferenciales; mientras la tendencia general sea bajista, la posición base sigue generando ganancias.
II. Principio de monitoreo: cómo detectar la señal de exclusión en el primer momento
Para monitorear la información del contrato, esta estrategia adopta un método más directo: monitorear directamente los cambios en los datos de la interfaz de contratos de Binance.
2.1 El secreto del campo deliveryDate
La interfaz fapi/v1/exchangeInfo de Binance devuelve información detallada de todos los contratos. Uno de los campos es deliveryDate, que indica la fecha de entrega del contrato.
Para los contratos perpetuos, este campo generalmente se establece en una marca de tiempo futura muy lejana:
4133404800000 → corresponde al 31 de diciembre de 2100
Esto es un marcador de posición que significa "nunca expira".
La clave está en: cuando Binance decide excluir un contrato perpetuo, simultáneamente al anuncio, modifica el deliveryDate de ese contrato a la marca de tiempo real de exclusión.
Contrato perpetuo normal: deliveryDate = 4133404800000 (nunca expira)
Contrato próximo a excluir: deliveryDate = 1744106400000 (2026-04-08 17:00:00)
Este cambio se refleja inmediatamente en los datos de la interfaz, más rápido y más estructurado que la representación de la página de anuncios, sin necesidad de analizar HTML.
2.2 Implementación del código de monitoreo
Llamar a la interfaz cada 15 segundos, filtrar los contratos perpetuos USDT cuyo deliveryDate haya cambiado a una marca de tiempo real:
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
Ejemplo de resultado:
python
{
"HIPPOUSDT": 1744106400000, # 2026-04-08 17:00:00
"OLUSDT": 1744106400000,
"RLSUSDT": 1744106400000,
"PUFFERUSDT":1744106400000,
}
Nota: En pruebas reales, hay un ligero retraso; se puede elegir un método de verificación más rápido.
III. Arquitectura de la estrategia
Toda la estrategia consta de dos módulos que se ejecutan en paralelo:
Cuando se detecta un nuevo contrato, se crea un objeto task independiente para ese contrato, que contiene todo su estado:
python
task = {
"symbol": "HIPPO_USDT",
"delist_time_ms": 1744106400000,
"fund_per_task": 250.0, # Fondos asignados
"base_short_qty": 1500000, # Cantidad de la posición base corta
"range_high": 0.0005287, # Límite superior de la rejilla
"range_low": 0.0004758, # Límite inferior de la rejilla
"grid_width": 0.0000529, # Ancho de la rejilla (fijo)
"grids": [...], # Estado de los 10 niveles
"shift_count": 0, # Número de desplazamientos realizados
...
}
Los task de múltiples contratos son independientes entre sí, no interfieren y se ejecutan en paralelo.
IV. Asignación de fondos
Al detectar N contratos excluidos, se divide dinámicamente el saldo disponible de la cuenta:
Fondos asignados por contrato = Saldo disponible × 80% / N
Se reserva un 20% como colchón de margen para evitar liquidaciones por rebotes de precio a corto plazo.
Detalle clave: Al inicializar varios contratos secuencialmente, cada vez que se inicializa uno, el saldo disponible de la cuenta disminuye (la posición base ocupa margen). Por lo tanto, no se puede calcular la asignación de todos los contratos de una vez antes del bucle; en su lugar, se debe consultar nuevamente antes de cada inicialización:
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)
Esto asegura que cada contrato reciba una asignación de capital razonable, evitando que los contratos anteriores consuman demasiado margen y dejen sin fondos a los posteriores.
V. Explicación detallada de la posición base y la rejilla
5.1 Apertura de posición corta base
Inmediatamente después del anuncio, al inicializar, se abre una posición corta a precio de mercado, sin esperar a la rejilla:
Posición nominal base = Capital asignado × 50% × Apalancamiento
Ejemplo: Capital asignado 250U, apalancamiento 10x
Posición nominal base = 250 × 50% × 10 = 1250U
La posición base se mantiene durante todo el proceso, no participa en las aperturas y cierres repetidos de la rejilla, y solo se liquida junto con el cierre forzado antes del delisting.
La posición base es la parte más rentable de toda la estrategia: si el token cae un 50% desde el anuncio hasta el delisting, la posición base contribuye con ese 50% de ganancia en corto (multiplicado por el apalancamiento).
5.2 Configuración de la rejilla de cortos
Tomando el precio actual como borde superior y un 10% por debajo como borde inferior, dividido uniformemente en 10 niveles:
Ejemplo (precio actual 0.0005287, ancho del rango 10%):
Borde superior = 0.0005287
Borde inferior = 0.0005287 × (1 - 10%) = 0.0004758
Distancia entre niveles = (0.0005287 - 0.0004758) / 10 = 0.0000053
Nivel 9: Abrir corto @0.0005287 → Cerrar corto @0.0005234
Nivel 8: Abrir corto @0.0005234 → Cerrar corto @0.0005181
Nivel 7: Abrir corto @0.0005181 → Cerrar corto @0.0005128
...
Nivel 0: Abrir corto @0.0004811 → Cerrar corto @0.0004758
El capital se distribuye equitativamente entre los niveles. La lógica es simple: cuando el precio rebota hasta el precio de apertura del corto, se ejecuta la orden de apertura; cuando el precio baja hasta el precio de cierre del corto, se ejecuta la orden de cierre; completado un ciclo, se vuelve a colocar la orden de apertura, esperando el próximo rebote.
5.3 Estrategia de colocación de órdenes al inicio
Al iniciar, se colocan órdenes en todos los niveles cuyo precio de apertura de corto >= precio actual:
Precio actual 0.0005287
Nivel 9 Precio apertura = 0.0005287 ≥ 0.0005287 → Colocar orden ✅
Nivel 8 Precio apertura = 0.0005234 < 0.0005287 → skip_below (el precio ya ha caído por debajo)
Niveles 7 e inferiores: todos skip_below
La razón para colocar órdenes en todos los niveles por encima del precio actual es que, en una tendencia bajista, el precio puede tener rebotes inesperados en cualquier momento. Tener todos los niveles pre-colocados asegura no perder ninguna oportunidad de abrir cortos en esos rebotes.
VI. Desplazamiento dinámico del rango
Este es el mecanismo central de toda la estrategia. El precio no se queda para siempre en el rango inicial; la rejilla debe seguir el movimiento del precio para seguir capturando diferenciales.
6.1 Desplazamiento hacia abajo (ruptura del borde inferior)
Cuando el precio cae por debajo del borde inferior de la rejilla, significa que la caída ha superado la cobertura del rango actual, por lo que es necesario desplazar todo el rango hacia abajo:
Rango antiguo: 0.0004758 ~ 0.0005287
Precio actual: 0.0004500 (por debajo del borde inferior 0.0004758)
Calcular nuevo rango (paso de desplazamiento 5%):
shift_step = 0.0004500 × 5% = 0.0000225
Nuevo borde superior = 0.0005287 - 0.0000225 = 0.0005062
Nuevo borde inferior = 0.0005062 - 0.0000529 = 0.0004533
Nuevo rango: 0.0004533 ~ 0.0005062
6.2 Desplazamiento hacia arriba (rebote por encima del borde superior)
Cuando el precio rebota por encima del borde superior de la rejilla, el rango se desplaza hacia arriba:
Rango antiguo: 0.0004494 ~ 0.0005023
Precio actual: 0.0005100 (por encima del borde superior 0.0005023)
El nuevo rango se desplaza hacia arriba, asegurando que el precio actual esté dentro del nuevo rango.
Nuevo rango: 0.0004758 ~ 0.0005287
Este mecanismo garantiza que, sin importar cómo fluctúe el precio, la rejilla siempre lo siga, evitando que el precio se salga del rango y deje todos los niveles vacíos.
6.3 El ancho del rango permanece constante
Cada desplazamiento solo cambia la posición del rango, no su ancho:
python
grid_width = round(range_high - range_low, 8) # Fijado al inicializar
# Al desplazar hacia abajo
range_high = fp(task, range_high - shift_step)
range_low = fp(task, range_high - grid_width) # Calculado con el ancho fijo
Esto evita que errores de redondeo acumulados hagan que el rango se vuelva cada vez más estrecho o más ancho.
6.4 Mecanismo de protección de posiciones
Al desplazar el rango, se cancelan todas las órdenes y se reconstruye la rejilla. Pero, ¿qué hacer con los niveles que ya tienen una posición corta abierta esperando cerrar?
Si se reconstruye directamente, esas posiciones se "pierden": hay posiciones cortas sin órdenes de cierre correspondientes, convirtiéndose en posiciones descubiertas, totalmente expuestas al riesgo de rebote.
La solución es: antes del desplazamiento, registrar la cantidad de contratos en todas las posiciones abiertas; después del desplazamiento, colocar una orden de cierre de corto en el nivel más bajo del nuevo rango:
python
# Resumir posiciones antes del desplazamiento
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)
# Después del desplazamiento, colocar orden de cierre de protección en el nivel más bajo
if holding_contracts > 0:
_place_grid_cover(task, 0, holding_contracts)
De esta manera, sin importar cómo se desplace el rango, las posiciones cortas ya abiertas no perderán su seguimiento.
VII. Gestión paralela de múltiples contratos
7.1 Lógica de procesamiento al detectar un nuevo contrato
Los fondos liberados al cerrar contratos antiguos se redistribuyen, asegurando que los nuevos contratos reciban suficiente capital.
7.2 Gestión del ciclo de vida
Ciclo de vida de cada contrato:
VIII. Algunos detalles clave
8.1 La trampa de precisión en tokens de precio pequeño
Para tokens como HIPPOUSDT, cuyo precio ronda 0.0003, al calcular el paso de desplazamiento del rango surgen problemas de precisión:
shift_step = 0.0003 × 5% = 0.000015
Si PricePrecision = 4 (4 decimales)
round(0.000015, 4) = 0.0 ← ¡el paso se vuelve 0!
→ el bucle while nunca termina, bucle infinito
La solución es no truncar la precisión del paso y establecer un paso mínimo de respaldo:
python
shift_step = price * SHIFT_STEP_PCT
min_step = 10 ** (-PricePrecision)
shift_step = max(shift_step, min_step) # Al menos igual a la unidad mínima de precisión
8.2 Manejo de fallos en la apertura de la posición base corta
La apertura de corto a mercado puede fallar por falta de fondos o problemas de red. En ese caso, no se debe continuar construyendo la rejilla, ya que resultaría en una rejilla sin posición base:
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"Fallo al abrir posición base corta, saltando este contrato")
return False
return True
# En init_task
if not open_base_short(task):
return None # Inicialización fallida, no se agrega a tasks
8.3 Momento y forma del cierre forzado
Elegir 60 minutos antes del delisting en lugar de 30 minutos (cuando Binance prohíbe abrir nuevas posiciones) es para dejar suficiente ventana de tiempo para el cierre. Cuanto más cerca del delisting, menor es la liquidez y más difícil es cerrar.
Para el cierre, se usa una orden limitada ligeramente por encima del precio de mercado, en lugar de una orden de mercado real, para evitar ser perjudicado en condiciones de liquidez extremadamente baja:
python
buy_p = fp(task, price * 1.005) # 0.5% por encima del mercado
exchange.CreateOrder(swapcode, "closesell", buy_p, fc)
Si no se cierra todo de una vez, se reintenta hasta 10 veces, obteniendo el precio más reciente cada vez.
8.4 Ingresos adicionales por tasas de financiación
En una tendencia bajista, las tasas de financiación suelen ser favorables para los cortos (los cortos reciben dinero). Este es un ingreso adicional de mantener la posición base, que no se refleja en las estadísticas de diferenciales de la rejilla, pero sí en el crecimiento del capital de la cuenta.
IX. Recomendaciones de configuración de parámetros
python
LEVERAGE = 10 # Apalancamiento, recomendado 5~10, no demasiado alto
GRID_WIDTH_PCT = 0.10 # Ancho de la cuadrícula 10%, cubre la amplitud de oscilación normal
SHIFT_STEP_PCT = 0.05 # Paso de desplazamiento 5%, aproximadamente la mitad del ancho de la cuadrícula
GRID_COUNT = 10 # Número de cuadrículas, a más cuadrículas menos capital por cuadrícula
BASE_SHORT_RATIO = 0.5 # Posición base 50%, cuadrícula 40%, dejar 10% de margen
FORCE_CLOSE_MINS = 60 # Cerrar 60 minutos antes
MONITOR_INTERVAL = 15000 # Monitorear cada 15 segundos, equilibrando oportunidad y límite de frecuencia
Elección del ancho de la cuadrícula: Cuanto mayor sea el ancho, mayor será el rango de oscilación cubierto, pero también mayor será la distancia entre cuadrículas, reduciendo la frecuencia de cosecha. Se recomienda ajustar según la volatilidad histórica del par, generalmente un 10% es un punto de partida razonable.
Elección del número de cuadrículas: Cuantas más cuadrículas, menor será la distancia entre ellas y mayor la frecuencia de cosecha, pero menor el capital por cuadrícula y menor la ganancia por operación. Demasiadas cuadrículas también pueden provocar que el capital por cuadrícula sea insuficiente para la cantidad mínima de orden. 10 cuadrículas es una elección equilibrada.
X. Advertencia de riesgos
Antes de utilizar esta estrategia, es necesario comprender completamente los siguientes riesgos:
Riesgo de rebote: Si la noticia ya ha sido descontada por el mercado de antemano, tras el anuncio puede producirse un rebote de "agotamiento de las malas noticias", y la posición base sufrirá pérdidas temporales. La parte de la cuadrícula aún puede cosechar diferenciales durante el rebote, pero en general puede haber un retroceso temporal.
Riesgo de liquidez: Cuanto más cerca esté la fecha de exclusión, menor será la liquidez del contrato, mayor el diferencial entre compra y venta, y mayor el deslizamiento al cerrar. La estrategia establece una prima del 0,5% y 10 reintentos para mitigarlo, pero en casos extremos aún podría no ser posible cerrar todas las posiciones.
Riesgo de señales falsas: En raras ocasiones, Binance cancela o retrasa los planes de exclusión, en cuyo caso la estrategia seguirá manteniendo posiciones cortas hasta la intervención manual o la próxima actualización del monitoreo.
Riesgo de alto apalancamiento: Los pares excluidos son extremadamente volátiles; con un apalancamiento de 10x, incluso un rebote del 10% puede causar una pérdida cercana a todo el capital. Se recomienda ajustar el apalancamiento según la tolerancia al riesgo propia y controlar el tamaño total de la posición.
Inicio y detención oportunos de la estrategia: Según la experiencia en operaciones reales, algunos pares después de caer con fluctuaciones durante un día pueden recuperar gradualmente su precio anterior al anuncio, por lo que es necesario cerrar la estrategia a tiempo.
Duración de la ejecución: La estrategia requiere esperar un tiempo considerable para encontrar oportunidades; se necesita paciencia.
XI. Resumen
El valor central de esta estrategia radica en convertir la ventaja informativa (detectar señales de exclusión en el primer momento) en una ventaja de negociación (ejecución automatizada), mientras que mediante la estructura dual de posición base + cuadrícula, captura tanto las ganancias de tendencia como los diferenciales de oscilación en mercados en caída unilateral.
Puntos clave de diseño de todo el sistema:
| Módulo | Diseño central | Problema resuelto |
|---|---|---|
| Monitoreo de deliveryDate | Lectura directa de cambios en el campo de la interfaz | Detección de señales de exclusión en segundos |
| Asignación dinámica de capital | Consultar saldo nuevamente antes de cada inicialización | Asignación equilibrada de capital entre múltiples contratos |
| Apertura de corto a precio de mercado en posición base | Ejecución inmediata tras el anuncio | No perder la primera caída brusca |
| Órdenes en todas las cuadrículas | Colocar órdenes en todas las cuadrículas por encima del precio actual | No perder rebotes inesperados |
| Ancho de cuadrícula fijo | Mantener el ancho constante al desplazarse | Prevenir desviaciones de punto flotante |
| Protección de posición | Volver a colocar órdenes de cierre de corto tras el desplazamiento | Prevenir posiciones sin cobertura |
| Cierre 60 minutos antes | Dejar suficiente ventana de tiempo para cerrar | Hacer frente a la baja liquidez |
Las exclusiones no ocurren todos los días, pero cada vez que aparecen son oportunidades de trading con una certeza relativamente alta. Mediante el monitoreo y la ejecución automatizados, se puede participar de manera estable en este tipo de oportunidades sin necesidad de estar frente a la pantalla.
Código fuente de la estrategia: Estrategia de rejilla para contratos excluidos
- 1







