异步订单操作
Connector 类提供了所有订单操作的异步版本。异步方法可以避免阻塞调用线程,并通过 CancellationToken 支持取消。
方法
RegisterOrderAsync
新订单的异步注册:
public async ValueTask RegisterOrderAsync(Order order, CancellationToken cancellationToken = default)
该方法会验证订单(检查数量,自动确定订单类型——限价还是市价),初始化交易,并将注册命令发送到适配器。如果发生错误,将生成注册错误事件。
同步对应方法 RegisterOrder 内部会调用 RegisterOrderAsync。
CancelOrderAsync
异步取消现有订单:
public async ValueTask CancelOrderAsync(Order order, CancellationToken cancellationToken = default)
该方法会为取消操作创建一个新的交易标识符,并将撤单命令发送给适配器。该订单必须已经预先注册。
同步对应方法:CancelOrder。
EditOrderAsync
对活动订单进行异步编辑(在不取消的情况下修改价格和/或数量):
public async ValueTask EditOrderAsync(Order order, Order changes, CancellationToken cancellationToken = default)
参数:
order-- 要编辑的原始订单。changes-- 一个包含新字段值(价格、数量等)的 Order 对象。
在调用之前,建议先检查是否支持编辑:
if (connector.IsOrderEditable(order) == true)
{
var changes = order.CreateOrder();
changes.Price = newPrice;
await connector.EditOrderAsync(order, changes);
}
同步对应方法:EditOrder。
ReRegisterOrderAsync
订单的异步重新注册(在一次操作中取消旧订单并注册新订单):
public async ValueTask ReRegisterOrderAsync(Order oldOrder, Order newOrder, CancellationToken cancellationToken = default)
当交易所不支持订单编辑,但支持原子替换时使用。可以通过 IsOrderReplaceable 检查是否支持:
if (connector.IsOrderReplaceable(order) == true)
{
var newOrder = order.CreateOrder();
newOrder.Price = newPrice;
await connector.ReRegisterOrderAsync(order, newOrder);
}
何时使用异步方法
使用异步方法,当:
- 代码在
async上下文中执行(例如在 ASP.NET 处理程序、跨平台应用程序中)。 - 你需要通过
CancellationToken支持操作取消。 - 你需要避免阻塞 UI 线程。
使用同步方法,当:
- 代码在策略(
Strategy)内部运行,策略内部会自行管理线程。 - 一个不需要异步的简单脚本或控制台应用程序。
同步方法(RegisterOrder、CancelOrder、EditOrder)内部通过 AsyncHelper.Run 调用其异步对应方法,因此它们在功能上完全等效。
示例
private readonly Connector _connector = new();
public async Task PlaceAndManageOrderAsync(Security security, Portfolio portfolio, CancellationToken cancellationToken)
{
// 创建订单
var order = new Order
{
Security = security,
Portfolio = portfolio,
Direction = Sides.Buy,
Volume = 1,
Price = security.BestBid?.Price ?? 100m,
Type = OrderTypes.Limit,
};
// 异步注册
await _connector.RegisterOrderAsync(order, cancellationToken);
// ... 等待市场条件变化 ...
// Async price edit (if supported)
if (_connector.IsOrderEditable(order) == true)
{
var changes = order.CreateOrder();
changes.Price = order.Price - 0.01m;
await _connector.EditOrderAsync(order, changes, cancellationToken);
}
// 异步撤销
await _connector.CancelOrderAsync(order, cancellationToken);
}