Ciclo de Vida de Órdenes
Descripción completa del flujo de una orden C2C desde la creación del anuncio hasta la finalización del trade. Cada transición de estado se mapea a endpoints específicos y condiciones de error.
Flujo de Estados
┌──────────────────────────────────────────────────────────────────────────────┐
│ Ciclo de Vida de una Orden Binance C2C │
└──────────────────────────────────────────────────────────────────────────────┘
[Anuncio Publicado]
│
│ EP-7: actualizar precio EP-8: toggle online/offline
│ ────────────────────── ───────────────────────────
▼
╔══════════════╗
║ ANUNCIO VIVO ║ ◀── EP-4 listar tus anuncios EP-0 el comprador ve tu anuncio
╚══════════════╝
│
│ Comprador coloca orden (EP-18, lado comprador)
│ EP-11: checkIfCanPlaceOrder (pre-check del comprador)
▼
╔══════════════════╗
║ PAGO PENDIENTE ║ ─── EP-13: detalle de la orden
╚══════════════════╝ EP-15: listar órdenes
│
│ Comprador marca como pagado (EP-17, lado comprador)
│ Chat: comprador envía comprobante (EP-34 recuperar, EP-31 marcar leído)
▼
╔════════════════════╗
║ PAGADO / PROCESANDO║ ─── Verificar pago en banco / app de pago
╚════════════════════╝ EP-12: checkIfCanReleaseCoin
│
│ Vendedor libera monedas (EP-20, tu lado)
▼
╔══════════════╗
║ COMPLETADA ║ ─── EP-16: aparece en historial de órdenes
╚══════════════╝
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ Caminos de Error ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
PAGO PENDIENTE ── Comprador cancela ────────────────▶ [CANCELADA]
EP-10: checkIfAllowedCancelOrder
EP-9: cancelOrder (lado comprador)
PAGADO ─────────── Se abre disputa ─────────────────▶ [EN APELACIÓN]
Mediación de Binance
(sin endpoint SAPI dedicado)
CUALQUIER ESTADO ── EP-21: verifyAdditionalKyc ─────▶ Gate de KYC adicional
El comprador necesita KYC extra
antes de continuar el trade
Desglose Paso a Paso
Anuncio Publicado
EP-5 (crear) / EP-4 (listar)Crea tu anuncio via la UI de Binance o EP-5 (requiere 2FA). Una vez activo, EP-4 lista tus anuncios. Tu bot usa EP-0 para ver cómo rankea tu anuncio frente a la competencia.
# Verificar ranking de tu anuncio
sellers = await fetch_order_book("USDT", "USD", "BUY")
my_ads = await list_my_ads(client, api_key, api_secret)
for ad in my_ads:
rank = next((i for i, s in enumerate(sellers)
if s["advNo"] == ad["advNo"]), None)
print(f"Anuncio {ad['advNo']} rank: {rank}")Orden Colocada
EP-13, EP-15Un comprador coloca una orden contra tu anuncio. Tu bot la detecta via EP-15 (listar órdenes) o via eventos WebSocket. Usa EP-13 para obtener el detalle completo de la orden incluyendo info del comprador, monto en fiat y método de pago.
surplusAmount de tu anuncio disminuye automáticamente. Por eso incluir surplusAmount en actualizaciones de precio EP-7 causa el error 187049 — el valor en caché puede ya estar desactualizado.Pago Marcado
EP-17 (comprador), EP-31, EP-34El comprador marca la orden como pagada (EP-17) y típicamente envía comprobante de pago por chat. Tu bot lee los mensajes via EP-34 y los marca como leídos via EP-31. La orden entra en una ventana de verificación de pago.
# Leer mensajes nuevos cuando llega la orden
messages = await get_chat_messages(client, api_key, api_secret, order_no)
for msg in messages:
if msg.get("msgType") == "image":
# Comprador envió imagen de comprobante de pago
print(f"Comprobante recibido: {msg['content']}")Monedas Liberadas
EP-12, EP-20Tras verificar el pago, llama EP-12 para confirmar que la liberación está permitida, luego EP-20 para liberar. La mayoría de los bots P2P hacen esto manualmente — libera solo después de confirmar el pago de forma independiente en tu banco o app de pago.
Completada
EP-16La orden alcanza el estado COMPLETE. Aparece en EP-16 (historial de órdenes). ElsurplusAmount de tu anuncio se reduce permanentemente. Si el anuncio se ha negociado completamente, se desactiva solo.
Escenarios de Error y Recuperación
Anuncio → Repricing
187049Causa: surplusAmount incluido en el body de EP-7
Recuperación: Eliminar surplusAmount. Enviar solo advNo + price.
Anuncio → Repricing
187055Causa: Precio fuera del rango permitido para la moneda
Recuperación: Búsqueda binaria dentro del rango. EP-3 (getReferencePrice) puede ayudar a encontrar los límites.
Anuncio → Repricing
83229 / 83230Causa: Anuncio desactivado por el sistema de riesgo de Binance
Recuperación: Marcar anuncio como pausado. Inspeccionar via EP-2. No repricear hasta confirmar estado.
Cualquier llamada HMAC
-1021 / -1022Causa: Drift de reloj — timestamp fuera de la ventana de 1000ms
Recuperación: Sincronizar tiempo via /api/v3/time (UTIL-1), recalcular offset, reconstruir query y reintentar.
Orden colocada
EP-13 devuelve 401Causa: Auth adaptativa: intento sin firma rechazado
Recuperación: Reintentar con firma HMAC completa. Comportamiento esperado — no es un error.
Historial de órdenes
EP-16 devuelve -1104Causa: GET no aceptado en este entorno
Recuperación: Reintentar como POST con parámetros idénticos. La cadena de tres fallbacks lo maneja automáticamente.