Escribir un conector con IA

Una guía paso a paso para crear un conector de bolsa para StockSharp usando herramientas de IA.

Preparación

1. Estudie la API de la bolsa

Antes de empezar, prepare:

  • Documentación de la API REST/WebSocket de la bolsa
  • Claves de API de prueba (sandbox/testnet)
  • Lista de tipos de datos admitidos (velas, libro de órdenes, ticks, operaciones)
  • Lista de tipos de órdenes admitidos (limit, market, stop)

2. Cree un proyecto

dotnet new classlib -n StockSharp.MyExchange --framework net10.0
cd StockSharp.MyExchange
dotnet add package StockSharp.Messages
dotnet add package StockSharp.Algo

3. Prepare el contexto para la IA

Cree un archivo CLAUDE.md:

# Reglas del proyecto — conector de exchange

- Framework: StockSharp 5.x, .NET 10
- El conector se implementa como un MessageAdapter
- Heredar de AsyncMessageAdapter para async/await
- Todas las peticiones HTTP mediante HttpClient con CancellationToken
- Suscripciones WebSocket mediante cliente nativo o ClientWebSocket
- Mapeo de tipos: tipos del exchange → StockSharp Messages
- Gestión de errores: SendOutError() para errores de conexión
- Todas las cadenas en recursos de localización (o al menos como const)

Arquitectura del conector

Un conector en StockSharp es un MessageAdapter que:

  1. Recibe mensajes entrantes (solicitudes) del núcleo
  2. Los procesa (llama a la API de la bolsa)
  3. Envía de vuelta mensajes de respuesta (resultados)
StockSharp Core → [Message] → MessageAdapter → [HTTP/WS] → Exchange
Exchange → [HTTP/WS] → MessageAdapter → [Message] → StockSharp Core

Ejemplo paso a paso

Paso 1: Estructura básica del adaptador

Prompt:

Cree con StockSharp un MessageAdapter básico para un conector de exchange
de criptomonedas llamado MyExchange:
- heredar de AsyncMessageAdapter
- implementar conexión/desconexión (ConnectMessage, DisconnectMessage)
- añadir ajustes: ApiKey, Secret, modo demo
- usar HttpClient para la REST API
- URL base de la API: https://api.myexchange.com/v1

Paso 2: Búsqueda de instrumentos

Prompt:

Añada al adaptador el manejo de SecurityLookupMessage:
- La petición GET /api/v1/symbols devuelve una lista JSON de instrumentos
- Cada instrumento tiene: symbol, baseAsset, quoteAsset,
  minQty, maxQty, tickSize, status
- Mapeo: symbol → SecurityId, baseAsset/quoteAsset → name,
  tickSize → SecurityMessage.PriceStep
- Enviar SecurityMessage para cada instrumento
- Enviar SubscriptionFinishedMessage al final

Paso 3: Datos de mercado

Prompt:

Añada al adaptador la suscripción a datos de mercado:

1. Candles (MarketDataTypes.CandleTimeFrame):
   - REST: GET /api/v1/klines?symbol={}&interval={}&limit=1000
   - WebSocket: subscribe to channel kline_{symbol}_{interval}
   - Interval mapping: 1m, 5m, 15m, 1h, 4h, 1d

2. Libro de órdenes (MarketDataTypes.MarketDepth):
   - WebSocket: subscribe to channel depth_{symbol}
   - Parse bids/asks into QuoteChangeMessage

3. Ticks (MarketDataTypes.Trades):
   - WebSocket: subscribe to channel trades_{symbol}
   - Parse into ExecutionMessage with ExecutionTypes.Tick

Paso 4: Operaciones de trading

Prompt:

Añada al adaptador soporte para operaciones de trading:

1. Order registration (OrderRegisterMessage):
   - POST /api/v1/order with params: symbol, side, type, quantity, price
   - Return ExecutionMessage with ExecutionTypes.Transaction

2. Order cancellation (OrderCancelMessage):
   - DELETE /api/v1/order/{orderId}
   - Return ExecutionMessage with status OrderStates.Done

3. Portfolio retrieval (PortfolioLookupMessage):
   - GET /api/v1/account
   - Parse balances into PositionChangeMessage

4. WebSocket for order updates:
   - Channel orders_{listenKey}
   - Parse order status updates

Paso 5: Revisión de código

Después de generar cada paso, pregunte a la IA:

Revise el adaptador generado para comprobar su compatibilidad con la API de StockSharp:
1. ¿Se gestionan todos los tipos de mensajes?
2. ¿Se usa CancellationToken correctamente?
3. ¿Está implementada la gestión de errores HTTP?
4. ¿Se envía SubscriptionFinishedMessage al finalizar?
5. ¿Funciona la reconexión WebSocket tras una desconexión?

Detalles clave de implementación

MessageAdapter — qué manejar

Mensaje entrante Acción Mensaje de respuesta
ConnectMessage Conectar a la API ConnectMessage (respuesta)
DisconnectMessage Desconectar DisconnectMessage (respuesta)
SecurityLookupMessage Solicitar instrumentos SecurityMessage × N
MarketDataMessage (suscripción) Suscribirse a datos SubscriptionResponseMessage
OrderRegisterMessage Crear orden ExecutionMessage
OrderCancelMessage Cancelar orden ExecutionMessage
PortfolioLookupMessage Solicitar carteras PortfolioMessage, PositionChangeMessage

Patrón asíncrono

public class MyExchangeAdapter : AsyncMessageAdapter
{
    private HttpClient _httpClient;

    protected override ValueTask OnConnectAsync(ConnectMessage msg, CancellationToken token)
    {
        _httpClient = new HttpClient();
        _httpClient.BaseAddress = new Uri("https://api.myexchange.com/v1/");
        _httpClient.DefaultRequestHeaders.Add("X-API-KEY", Key.To<string>());

        SendOutMessage(new ConnectMessage());
        return default;
    }

    protected override ValueTask OnSecurityLookupAsync(SecurityLookupMessage msg, CancellationToken token)
    {
        // ... solicitar instrumentos
    }

    // ... otros métodos
}

Firma de solicitudes

La mayoría de las bolsas requieren firma HMAC para solicitudes privadas:

private string SignRequest(string payload)
{
    using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(Secret.To<string>()));
    var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(payload));
    return Convert.ToHexString(hash).ToLowerInvariant();
}

Lista de verificación de revisión del conector

Conexión

  • La conexión/desconexión funciona correctamente
  • Los errores de autenticación se manejan
  • La reconexión funciona tras la desconexión

Instrumentos

  • La lista de instrumentos se carga correctamente
  • Correctamente mapeados: SecurityId, PriceStep, VolumeStep
  • Se envía SubscriptionFinishedMessage

Datos de mercado

  • Velas: carga del histórico + suscripción a nuevas
  • Libro de órdenes: profundidad correcta, actualizaciones
  • Ticks: tiempo, volumen y dirección correctos

Trading

  • Órdenes límite: creación, cancelación
  • Órdenes de mercado: creación
  • Actualizaciones del estado de las órdenes
  • Actualizaciones del saldo de la cartera

General

  • Todos los CancellationToken se propagan
  • Los errores se registran mediante SendOutError()
  • No hay fugas de recursos (WebSocket, HttpClient)
  • Compila sin errores ni advertencias

Ejemplos de prompts

Agregar un nuevo tipo de datos

Añada a mi conector soporte para datos de Nivel 1 (BestBid/BestAsk):
- Canal WebSocket: ticker_{symbol}
- Parsear bid, ask, last, volume
- Enviar Level1ChangeMessage con los campos:
  Level1Fields.BestBidPrice, Level1Fields.BestAskPrice,
  Level1Fields.LastTradePrice, Level1Fields.Volume

Manejo de límites de tasa

Añada a mi conector la gestión de límites de frecuencia:
- La API devuelve las cabeceras X-RateLimit-Remaining y X-RateLimit-Reset
- Cuando se alcance el límite: esperar hasta Reset y registrar una advertencia
- Usar SemaphoreSlim para limitar las peticiones concurrentes

Consejos

  1. Empiece solo con lectura — implemente primero la conexión, los instrumentos y los datos de mercado. Añada las operaciones de trading después de verificar
  2. Use el sandbox — pruebe en el entorno de prueba de la bolsa
  3. Tome como referencia conectores existentes — proporcione a la IA código de un conector existente de StockSharp como referencia
  4. Registre todo — los logs detallados son invaluables al depurar un conector
  5. Maneje los casos límite — reconexión, cambios de instrumentos, tipos de órdenes no estándar