Saltar al contenido principal

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

1

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}")
2

Orden Colocada

EP-13, EP-15

Un 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.

Nota: Cuando llega una nueva orden, el 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.
3

Pago Marcado

EP-17 (comprador), EP-31, EP-34

El 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']}")
4

Monedas Liberadas

EP-12, EP-20

Tras 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.

Advertencia: Nunca automatices la liberación de monedas sin verificación independiente del pago. Los estafadores explotan bots que liberan solo con imágenes de comprobante de pago.
5

Completada

EP-16

La 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

187049

Causa: surplusAmount incluido en el body de EP-7

Recuperación: Eliminar surplusAmount. Enviar solo advNo + price.

Anuncio → Repricing

187055

Causa: 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 / 83230

Causa: 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 / -1022

Causa: 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 401

Causa: 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 -1104

Causa: 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.