Escrevendo um Conector com IA
Um guia passo a passo para criar um conector de bolsa para o StockSharp usando ferramentas de IA.
Preparação
1. Estude a API da Bolsa
Antes de começar, prepare:
- Documentação da API REST/WebSocket da bolsa
- Chaves de API de teste (sandbox/testnet)
- Lista de tipos de dados suportados (candles, livro de ofertas, ticks, negociações)
- Lista de tipos de ordem suportados (limit, market, stop)
2. Crie um Projeto
dotnet new classlib -n StockSharp.MyExchange --framework net10.0
cd StockSharp.MyExchange
dotnet add package StockSharp.Messages
dotnet add package StockSharp.Algo
3. Prepare o Contexto para a IA
Crie um arquivo CLAUDE.md:
# Regras do projeto — conector de exchange
- Framework: StockSharp 5.x, .NET 10
- O conector é implementado como um MessageAdapter
- Herdar de AsyncMessageAdapter para async/await
- Todos os pedidos HTTP via HttpClient com CancellationToken
- Subscrições WebSocket via cliente nativo ou ClientWebSocket
- Mapeamento de tipos: tipos da bolsa → StockSharp Messages
- Tratamento de erros: SendOutError() para erros de ligação
- Todas as strings em recursos de localização (ou pelo menos como const)
Arquitetura do Conector
Um conector no StockSharp é um MessageAdapter que:
- Recebe mensagens de entrada (requisições) do núcleo
- Processa-as (chama a API da bolsa)
- Envia de volta mensagens de resposta (resultados)
StockSharp Core → [Message] → MessageAdapter → [HTTP/WS] → Exchange
Exchange → [HTTP/WS] → MessageAdapter → [Message] → StockSharp Core
Exemplo Passo a Passo
Passo 1: Estrutura Básica do Adaptador
Prompt:
Crie com StockSharp um MessageAdapter básico para um conector de bolsa
de criptomoedas chamado MyExchange:
- herdar de AsyncMessageAdapter
- implementar ligação/desligação (ConnectMessage, DisconnectMessage)
- adicionar definições: ApiKey, Secret, modo demo
- usar HttpClient para a REST API
- URL base da API: https://api.myexchange.com/v1
Passo 2: Busca de Instrumentos
Prompt:
Adicione ao adaptador o tratamento de SecurityLookupMessage:
- O pedido GET /api/v1/symbols devolve uma lista JSON de instrumentos
- Cada instrumento contém: symbol, baseAsset, quoteAsset,
minQty, maxQty, tickSize, status
- Mapeamento: symbol → SecurityId, baseAsset/quoteAsset → name,
tickSize → SecurityMessage.PriceStep
- Enviar SecurityMessage para cada instrumento
- Enviar SubscriptionFinishedMessage no final
Passo 3: Dados de Mercado
Prompt:
Adicione ao adaptador a subscrição de dados 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. Livro de ordens (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
Passo 4: Operações de Negociação
Prompt:
Adicione ao adaptador suporte para operações de negociação:
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
Passo 5: Revisão de Código
Após gerar cada etapa, pergunte à IA:
Reveja o adaptador gerado quanto à conformidade com a API StockSharp:
1. Todos os tipos de mensagens são tratados?
2. CancellationToken é usado corretamente?
3. O tratamento de erros HTTP está implementado?
4. SubscriptionFinishedMessage é enviado após a conclusão?
5. A reconexão WebSocket funciona após uma desconexão?
Detalhes-Chave da Implementação
MessageAdapter — O Que Tratar
| Mensagem de Entrada | Ação | Mensagem de Resposta |
|---|---|---|
ConnectMessage |
Conectar à API | ConnectMessage (resposta) |
DisconnectMessage |
Desconectar | DisconnectMessage (resposta) |
SecurityLookupMessage |
Solicitar instrumentos | SecurityMessage × N |
MarketDataMessage (subscribe) |
Assinar dados | SubscriptionResponseMessage |
OrderRegisterMessage |
Criar ordem | ExecutionMessage |
OrderCancelMessage |
Cancelar ordem | ExecutionMessage |
PortfolioLookupMessage |
Solicitar portfólios | PortfolioMessage, PositionChangeMessage |
Padrão Assí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
}
// ... outros métodos
}
Assinatura de Requisições
A maioria das bolsas exige assinatura HMAC para requisições 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 Verificação de Revisão do Conector
Conexão
- Conectar/desconectar funciona corretamente
- Erros de autenticação são tratados
- Reconexão funciona após desconexão
Instrumentos
- Lista de instrumentos carrega com sucesso
- Mapeamento correto: SecurityId, PriceStep, VolumeStep
-
SubscriptionFinishedMessageé enviada
Dados de Mercado
- Candles: carregamento de histórico + assinatura de novos
- Livro de ofertas: profundidade correta, atualizações
- Ticks: horário, volume e direção corretos
Negociação
- Ordens limit: criação, cancelamento
- Ordens market: criação
- Atualizações de status de ordem
- Atualizações de saldo do portfólio
Geral
- Todos os
CancellationTokensão propagados - Erros são registrados via
SendOutError() - Sem vazamentos de recursos (WebSocket, HttpClient)
- Compila sem erros ou avisos
Exemplos de Prompts
Adicionando um Novo Tipo de Dado
Adicione ao meu conector suporte para dados de Nível 1 (BestBid/BestAsk):
- Canal WebSocket: ticker_{symbol}
- Fazer parse de bid, ask, last, volume
- Enviar Level1ChangeMessage com os campos:
Level1Fields.BestBidPrice, Level1Fields.BestAskPrice,
Level1Fields.LastTradePrice, Level1Fields.Volume
Tratamento de Limites de Taxa
Adicione ao meu conector o tratamento de limites de frequência:
- A API devolve os cabeçalhos X-RateLimit-Remaining e X-RateLimit-Reset
- Quando o limite for atingido: aguardar até Reset e registar um aviso
- Usar SemaphoreSlim para limitar pedidos concorrentes
Dicas
- Comece somente leitura — primeiro implemente conexão, instrumentos e dados de mercado. Adicione operações de negociação após a verificação
- Use o sandbox — teste no ambiente de testes da bolsa
- Referencie conectores existentes — forneça à IA código de um conector StockSharp existente como referência
- Registre tudo — logs detalhados são inestimáveis ao depurar um conector
- Trate casos extremos — reconexão, mudanças de instrumentos, tipos de ordem não padronizados