Actualización de la API Bitmex en sgcWebSockets

· Características
Integración de la API WebSocket y REST de BitMEX en Delphi

BitMEX es uno de los principales exchanges de derivados de criptomonedas, especializado en trading apalancado de futuros y contratos perpetuos. El componente TsgcWSAPI_Bitmex proporciona a los desarrolladores Delphi acceso tanto a la API WebSocket como REST, habilitando streaming de datos de mercado en tiempo real, ejecución de órdenes, gestión de posiciones y operaciones de cuenta completas desde un único componente.

Índice de contenidos

Visión general

A diferencia de muchos componentes de exchange que solo soportan WebSocket, el componente TsgcWSAPI_Bitmex ofrece un enfoque de doble interfaz. La API WebSocket proporciona streaming en tiempo real de trades, actualizaciones del order book, quotes y datos de cuenta mediante suscripciones basadas en topics. La REST API (accesible mediante la propiedad REST_API) proporciona métodos síncronos de petición/respuesta para colocar órdenes, gestionar posiciones y consultar datos de mercado. Esta combinación es ideal para construir aplicaciones de trading completas que necesiten tanto data feeds en vivo como ejecución precisa de órdenes.

Primeros pasos

Crea un componente TsgcWebSocketClient y un TsgcWSAPI_Bitmex, enlázalos y configura tus credenciales. La conexión WebSocket se activa a través del cliente, mientras que la REST API se accede mediante la propiedad REST_API.

oClient := TsgcWebSocketClient.Create(nil);
oBitmex := TsgcWSAPI_Bitmex.Create(nil);
oBitmex.Client := oClient;
oBitmex.Bitmex.ApiKey := 'your_api_key';
oBitmex.Bitmex.ApiSecret := 'your_api_secret';
oClient.Active := True;
Nota: las suscripciones WebSocket públicas y los endpoints REST públicos no requieren credenciales API. La autenticación solo es necesaria para los topics privados (execution, margin, order, position) y los métodos REST de trading/posición.

API WebSocket

La API WebSocket de BitMEX usa un modelo de suscripción basado en topics. Te suscribes a un topic (opcionalmente filtrado por instrumento) y recibes un stream continuo de actualizaciones. El componente proporciona tres métodos WebSocket principales.

Método Descripción
Subscribe Se suscribe a un stream de topic, opcionalmente filtrado por símbolo de instrumento.
Unsubscribe Se desuscribe de un stream de topic al que estabas suscrito.
Authenticate Autentica la sesión WebSocket para acceder a topics privados.

Topics disponibles

Los topics definen el tipo de datos que recibes. Puedes suscribirte a varios topics simultáneamente. El formato de suscripción es topic:symbol, donde el filtro de símbolo es opcional.

Topic Auth requerida Descripción
trade No Ejecuciones de trades en vivo en el exchange.
instrument No Datos del instrumento, incluyendo funding rates e info de settlement.
orderBookL2 No Order book Level 2 completo con actualizaciones incrementales.
quote No Mejores quotes de bid y ask en la cabecera del libro.
execution Yes Ejecuciones y fills de trades de tu cuenta.
margin Yes Actualizaciones del margin y del saldo disponible de la cuenta.
order Yes Tus órdenes abiertas y actualizaciones del estado de las órdenes.
position Yes Tus posiciones abiertas y actualizaciones de P&L no realizado.

Ejemplos de suscripción WebSocket

// Subscribe to XBTUSD trades
oBitmex.Subscribe('trade:XBTUSD');
// Subscribe to the Level 2 order book
oBitmex.Subscribe('orderBookL2:XBTUSD');
// Subscribe to best bid/ask quotes
oBitmex.Subscribe('quote:XBTUSD');
// Authenticate for private topics
oBitmex.Authenticate;
// Subscribe to your order updates (requires auth)
oBitmex.Subscribe('order');
// Subscribe to your position updates (requires auth)
oBitmex.Subscribe('position');
// Unsubscribe from trades
oBitmex.Unsubscribe('trade:XBTUSD');

REST API: datos de mercado

La REST API se accede a través de la propiedad REST_API del componente. Los métodos de datos de mercado devuelven cadenas JSON que puedes parsear en tu aplicación. Son llamadas síncronas que devuelven inmediatamente los datos solicitados.

Método Descripción
GetInstruments Recupera una lista de todos los instrumentos disponibles en el exchange.
GetInstrumentsActive Recupera solo instrumentos con trading activo.
GetOrderBook Recupera el snapshot actual del order book de un instrumento.
GetQuotes Recupera datos recientes de quote (bid/ask).
GetTrades Recupera datos de trades públicos recientes.
GetExecutions Recupera los datos de ejecución en bruto de tu cuenta.
GetExecutionsTradeHistory Recupera el historial de ejecuciones de trade de tu cuenta.
// Get the order book for XBTUSD
ShowMessage(oBitmex.REST_API.GetOrderBook('XBTUSD'));
// Get all active instruments
ShowMessage(oBitmex.REST_API.GetInstrumentsActive);
// Get recent trades
ShowMessage(oBitmex.REST_API.GetTrades('XBTUSD'));
// Get recent quotes
ShowMessage(oBitmex.REST_API.GetQuotes('XBTUSD'));

REST API: trading

Los métodos de trading permiten colocar, modificar y cancelar órdenes. La REST API soporta varios tipos de orden, incluidos market, limit, stop y stop-limit. Todos los métodos de trading requieren autenticación.

Método Descripción
PlaceOrder Coloca una nueva orden con control total de los parámetros.
PlaceMarketOrder Coloca una orden market que se ejecuta de inmediato al mejor precio.
PlaceLimitOrder Coloca una orden limit al precio especificado.
PlaceStopOrder Coloca una orden stop (market) que se dispara a un precio stop.
PlaceStopLimitOrder Coloca una orden stop-limit con precio de disparo y precio límite.
AmendOrder Modifica el precio, cantidad u otros parámetros de una orden existente.
CancelOrder Cancela una orden concreta por su identificador.
CancelAllOrders Cancela todas las órdenes abiertas a la vez.
CancelAllOrdersAfter Establece un dead man's switch que cancela todas las órdenes tras un timeout.
GetOrders Recupera todas las órdenes, opcionalmente filtradas por estado.

Ejemplos de colocación de órdenes

// Place a limit order: Buy 100 contracts of XBTUSD at $30,000
ShowMessage(oBitmex.REST_API.PlaceLimitOrder(bmsBuy, 'XBTUSD', 100, 30000));
// Place a market order: Sell 50 contracts of XBTUSD
ShowMessage(oBitmex.REST_API.PlaceMarketOrder(bmsSell, 'XBTUSD', 50));
// Place a stop order: triggers when price reaches $28,000
ShowMessage(oBitmex.REST_API.PlaceStopOrder(bmsSell, 'XBTUSD', 100, 28000));
// Place a stop-limit order: triggers at $28,000, limit price $27,500
ShowMessage(oBitmex.REST_API.PlaceStopLimitOrder(bmsSell, 'XBTUSD', 100, 28000, 27500));
// Cancel a specific order
ShowMessage(oBitmex.REST_API.CancelOrder('order-id-here'));
// Cancel all open orders
ShowMessage(oBitmex.REST_API.CancelAllOrders);
Nota: el método CancelAllOrdersAfter funciona como un dead man's switch. Cancela todas las órdenes si no se renueva dentro del timeout especificado. Es útil como mecanismo de seguridad para evitar órdenes descontroladas si tu aplicación pierde conectividad.

REST API: posiciones

Los métodos de gestión de posiciones permiten consultar, cerrar y configurar tus posiciones abiertas, incluyendo apalancamiento y ajustes de margen.

Método Descripción
GetPosition Recupera la posición actual de un instrumento.
ClosePosition Cierra una posición abierta colocando una orden market de cierre.
SetPositionIsolate Alterna entre modo de margin cross e isolated para una posición.
SetPositionLeverage Establece el multiplicador de apalancamiento de una posición.
SetPositionRiskLimit Establece el risk limit de una posición.
SetPositionTransferMargin Transfiere margin desde o hacia una posición isolated.

Ejemplos de gestión de posiciones

// Get current position for XBTUSD
ShowMessage(oBitmex.REST_API.GetPosition('XBTUSD'));
// Set leverage to 10x
ShowMessage(oBitmex.REST_API.SetPositionLeverage('XBTUSD', 10));
// Switch to isolated margin mode
ShowMessage(oBitmex.REST_API.SetPositionIsolate('XBTUSD', True));
// Close the position at market price
ShowMessage(oBitmex.REST_API.ClosePosition('XBTUSD'));

Ejemplo de código

El siguiente ejemplo muestra un workflow completo combinando suscripciones WebSocket y llamadas REST API: conectar, suscribirse a trades en vivo, consultar el order book y colocar una orden limit.

oClient := TsgcWebSocketClient.Create(nil);
oBitmex := TsgcWSAPI_Bitmex.Create(nil);
oBitmex.Client := oClient;
oBitmex.Bitmex.ApiKey := 'your_api_key';
oBitmex.Bitmex.ApiSecret := 'your_api_secret';
oClient.Active := True;
// Subscribe to trades
oBitmex.Subscribe('trade:XBTUSD');
// REST: Get order book
ShowMessage(oBitmex.REST_API.GetOrderBook('XBTUSD'));
// REST: Place a limit order
ShowMessage(oBitmex.REST_API.PlaceLimitOrder(bmsBuy, 'XBTUSD', 100, 30000));

Configuración y notas

Credenciales API

Genera tu API key y secret desde la configuración de cuenta de BitMEX. Puedes crear keys con permisos específicos (order, withdraw, etc.). Para bots de trading, crea una key solo con los permisos que necesites y evita habilitar permisos de retirada salvo que sea estrictamente necesario.

Soporte de testnet

BitMEX proporciona un entorno testnet en testnet.bitmex.com para desarrollo y pruebas. Configura el componente para usar el endpoint de testnet y probar tu integración con fondos simulados antes de pasar a producción. El grupo de propiedades Bitmex incluye ajustes para seleccionar entre entornos de producción y testnet.

Importante: prueba siempre tu lógica de trading en el testnet de BitMEX antes de desplegar a producción. Las API keys del testnet se generan por separado desde la interfaz testnet y no son intercambiables con las de producción.

Enumeración del lado de la orden

Los métodos de trading usan los valores de enumeración bmsBuy y bmsSell para especificar la dirección de la orden. Son específicos del componente BitMEX.

Uso de WebSocket vs REST

Usa suscripciones WebSocket para streaming de datos en tiempo real donde la baja latencia es crítica (visualización de precios en vivo, visualización del order book, monitorización de ejecuciones). Usa la REST API para operaciones bajo demanda como colocar órdenes, consultar posiciones y obtener datos históricos. Las dos interfaces se complementan y pueden usarse simultáneamente.

Rate limits

BitMEX aplica rate limits a las llamadas a la REST API. Los límites varían según el endpoint pero suelen ser 60 solicitudes por minuto para la mayoría de endpoints de trading y 30 por minuto para modificación y cancelación de órdenes. Monitoriza las cabeceras de rate limit en las respuestas para evitar ser bloqueado temporalmente. Las suscripciones WebSocket no están sujetas a los rate limits REST.

Símbolos de instrumento

BitMEX usa su propio formato de símbolo de instrumento. El contrato perpetual de Bitcoin es XBTUSD, mientras que los contratos de futuros incluyen un sufijo de fecha de expiración (p. ej. XBTM25). Usa GetInstrumentsActive para descubrir todos los instrumentos negociables actualmente y sus símbolos.

Consejo: combina el método CancelAllOrdersAfter con un timer periódico en tu aplicación como red de seguridad. Si tu aplicación se cae o pierde conectividad, todas las órdenes se cancelarán automáticamente tras el timeout especificado, protegiéndote de movimientos inesperados del mercado.