Búsqueda de Instrumentos
Al crear su propio adaptador para trabajar con un exchange, necesita implementar el método de búsqueda de instrumentos. Este método se llama al enviar un mensaje SecurityLookupMessage y devuelve información sobre los instrumentos a través de mensajes SecurityMessage.
Implementación del Método SecurityLookupAsync
El método SecurityLookupAsync generalmente realiza las siguientes acciones:
- Obtiene la lista de tipos de instrumentos admitidos del mensaje entrante.
- Solicita la lista de instrumentos del exchange a través de la API.
- Para cada instrumento recibido, crea un mensaje SecurityMessage, rellenándolo con los datos del instrumento.
- Comprueba si el instrumento coincide con los criterios de búsqueda.
- Envía el mensaje SecurityMessage creado a través del método SendOutMessageAsync.
- Después de procesar todos los instrumentos, envía un mensaje sobre la finalización de la búsqueda.
A continuación se muestra un ejemplo de la implementación del método SecurityLookupAsync basado en el adaptador para el exchange Coinbase. Al crear su propio adaptador, necesita adaptar este código a la API del exchange que se esté utilizando.
public override async ValueTask SecurityLookupAsync(SecurityLookupMessage lookupMsg, CancellationToken cancellationToken)
{
// Obtener la lista de tipos de instrumentos a buscar
var secTypes = lookupMsg.GetSecurityTypes();
// Determinar el número máximo de instrumentos a buscar
var left = lookupMsg.Count ?? long.MaxValue;
// Iterar por los tipos de instrumentos admitidos por el exchange
foreach (var type in new[] { "SPOT", "FUTURE" })
{
// Solicitar la lista de instrumentos al exchange
var products = await _restClient.GetProducts(type, cancellationToken);
foreach (var product in products)
{
// Crear identificador del instrumento
var secId = product.ProductId.ToStockSharp();
// Crear mensaje con información del 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(),
// es necesario rellenar el identificador de suscripción
// para que el código externo entienda para qué suscripción se recibieron los datos
OriginalTransactionId = lookupMsg.TransactionId,
}
.TryFillUnderlyingId(product.BaseCurrencyId.ToUpperInvariant());
// Comprobar si el instrumento coincide con los criterios de búsqueda
if (!secMsg.IsMatch(lookupMsg, secTypes))
continue;
// Enviar mensaje con información del instrumento
await SendOutMessageAsync(secMsg, cancellationToken);
// Disminuir contador de instrumentos restantes
if (--left <= 0)
break;
}
if (left <= 0)
break;
}
// Enviar mensaje de finalización de la búsqueda
await SendSubscriptionResultAsync(lookupMsg, cancellationToken);
}
Este método le permite recuperar información sobre los instrumentos disponibles en el exchange, incluyendo sus características principales como el tipo de instrumento, el volumen mínimo, el paso de precio, etc.