Pesquisa de instrumentos
Ao criar seu próprio adaptador para trabalhar com uma exchange, você precisa implementar o método de busca de instrumentos. Esse método é chamado ao enviar uma mensagem SecurityLookupMessage e retorna informações sobre os instrumentos através de mensagens SecurityMessage.
Implementando o Método SecurityLookupAsync
O método SecurityLookupAsync geralmente executa as seguintes ações:
- Recupera a lista de tipos de instrumentos suportados a partir da mensagem de entrada.
- Solicita a lista de instrumentos da exchange via API.
- Para cada instrumento recebido, cria uma mensagem SecurityMessage, preenchendo-a com os dados do instrumento.
- Verifica se o instrumento corresponde aos critérios de busca.
- Envia a mensagem SecurityMessage criada através do método SendOutMessageAsync.
- Após processar todos os instrumentos, envia uma mensagem sobre a conclusão da busca.
Abaixo está um exemplo da implementação do método SecurityLookupAsync com base no adaptador para a exchange Coinbase. Ao criar seu próprio adaptador, você precisa adaptar esse código à API da exchange utilizada.
public override async ValueTask SecurityLookupAsync(SecurityLookupMessage lookupMsg, CancellationToken cancellationToken)
{
// Obter a lista de tipos de instrumentos a procurar
var secTypes = lookupMsg.GetSecurityTypes();
// Determinar o número máximo de instrumentos a procurar
var left = lookupMsg.Count ?? long.MaxValue;
// Iterar pelos tipos de instrumentos suportados pela exchange
foreach (var type in new[] { "SPOT", "FUTURE" })
{
// Solicitar a lista de instrumentos da exchange
var products = await _restClient.GetProducts(type, cancellationToken);
foreach (var product in products)
{
// Criar identificador do instrumento
var secId = product.ProductId.ToStockSharp();
// Criar mensagem com informações do instrumento
var secMsg = new SecurityMessage
{
SecurityType = product.ProductType.ToSecurityType(),
SecurityId = secId,
Name = product.DisplayName,
PriceStep = product.QuoteIncrement?.ToDecimal(),
VolumeStep = product.BaseIncrement?.ToDecimal(),
MinVolume = product.BaseMinSize?.ToDecimal(),
MaxVolume = product.BaseMaxSize?.ToDecimal(),
ExpiryDate = product.FutureProductDetails?.ContractExpiry,
Multiplier = product.FutureProductDetails?.ContractSize?.ToDecimal(),
// é necessário preencher o identificador da assinatura
// para que o código externo entenda para qual assinatura os dados foram recebidos
OriginalTransactionId = lookupMsg.TransactionId,
}
.TryFillUnderlyingId(product.BaseCurrencyId.ToUpperInvariant());
// Verificar se o instrumento corresponde aos critérios de busca
if (!secMsg.IsMatch(lookupMsg, secTypes))
continue;
// Enviar mensagem com informações do instrumento
await SendOutMessageAsync(secMsg, cancellationToken);
// Diminuir o contador de instrumentos restantes
if (--left <= 0)
break;
}
if (left <= 0)
break;
}
// Enviar mensagem sobre a conclusão da busca
await SendSubscriptionResultAsync(lookupMsg, cancellationToken);
}
Esse método permite recuperar informações sobre os instrumentos disponíveis na exchange, incluindo suas principais características, como tipo de instrumento, volume mínimo, passo de preço, etc.