金融工具查询
在为交易所创建自己的适配器时,需要实现金融工具查询方法。发送 SecurityLookupMessage 消息时会调用此方法,并通过 SecurityMessage 消息返回有关金融工具的信息。
实现 SecurityLookupAsync 方法
SecurityLookupAsync 方法通常执行以下操作:
- 从传入消息中获取支持的金融工具类型列表。
- 通过 API 向交易所请求交易品种列表。
- 为每个接收到的金融工具创建一个 SecurityMessage 消息,并填充相应的工具数据。
- 检查该金融工具是否符合搜索条件。
- 通过 SendOutMessageAsync 方法发送创建好的 SecurityMessage 消息。
- 处理完所有金融工具后,发送搜索完成的消息。
下面是基于 Coinbase 交易所适配器的 SecurityLookupAsync 方法实现示例。在创建自己的适配器时,需要将此代码适配到所使用交易所的 API。
public override async ValueTask SecurityLookupAsync(SecurityLookupMessage lookupMsg, CancellationToken cancellationToken)
{
// 获取要查找的交易品种类型列表
var secTypes = lookupMsg.GetSecurityTypes();
// 确定要搜索的最大交易品种数量
var left = lookupMsg.Count ?? long.MaxValue;
// 遍历交易所支持的交易品种类型
foreach (var type in new[] { "SPOT", "FUTURE" })
{
// 从交易所请求交易品种列表
var products = await _restClient.GetProducts(type, cancellationToken);
foreach (var product in products)
{
// 创建交易品种标识符
var secId = product.ProductId.ToStockSharp();
// 创建包含交易品种信息的消息
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(),
// 需要填写订阅标识符
// 以便外部代码理解数据属于哪个订阅
OriginalTransactionId = lookupMsg.TransactionId,
}
.TryFillUnderlyingId(product.BaseCurrencyId.ToUpperInvariant());
// 检查交易品种是否符合搜索条件
if (!secMsg.IsMatch(lookupMsg, secTypes))
continue;
// 发送包含交易品种信息的消息
await SendOutMessageAsync(secMsg, cancellationToken);
// 减少剩余交易品种计数器
if (--left <= 0)
break;
}
if (left <= 0)
break;
}
// 发送搜索完成消息
await SendSubscriptionResultAsync(lookupMsg, cancellationToken);
}
此方法可以获取交易所可用金融工具的相关信息,包括工具类型、最小交易量、价格步长等主要特征。