Operaciones asíncronas con órdenes

La clase Connector proporciona versiones asíncronas de todas las operaciones con órdenes. Los métodos asíncronos evitan bloquear el hilo que realiza la llamada y admiten la cancelación mediante CancellationToken.

Métodos

RegisterOrderAsync

Registro asíncrono de una nueva orden:

public async ValueTask RegisterOrderAsync(Order order, CancellationToken cancellationToken = default)

El método valida la orden (comprueba el volumen, determina automáticamente el tipo de orden -- límite o mercado), inicializa la transacción y envía el comando de registro al adaptador. En caso de error, se genera un evento de error de registro.

La contraparte síncrona RegisterOrder llama internamente a RegisterOrderAsync.

CancelOrderAsync

Cancelación asíncrona de una orden existente:

public async ValueTask CancelOrderAsync(Order order, CancellationToken cancellationToken = default)

El método crea un nuevo identificador de transacción para la operación de cancelación y envía el comando de retirada de la orden al adaptador. La orden debe haber sido registrada previamente.

Contraparte síncrona: CancelOrder.

EditOrderAsync

Edición asíncrona de una orden activa (cambio de precio y/o volumen sin cancelación):

public async ValueTask EditOrderAsync(Order order, Order changes, CancellationToken cancellationToken = default)

Parámetros:

  • order -- la orden original a editar.
  • changes -- un objeto Order con los nuevos valores de los campos (precio, volumen, etc.).

Antes de llamar, se recomienda comprobar el soporte de edición:

if (connector.IsOrderEditable(order) == true)
{
    var changes = order.CreateOrder();
    changes.Price = newPrice;
    await connector.EditOrderAsync(order, changes);
}

Contraparte síncrona: EditOrder.

ReRegisterOrderAsync

Re-registro asíncrono de una orden (cancelación de la antigua y registro de una nueva en una sola operación):

public async ValueTask ReRegisterOrderAsync(Order oldOrder, Order newOrder, CancellationToken cancellationToken = default)

Se utiliza cuando el exchange no admite la edición de órdenes, pero sí admite el reemplazo atómico. El soporte se puede comprobar mediante IsOrderReplaceable:

if (connector.IsOrderReplaceable(order) == true)
{
    var newOrder = order.CreateOrder();
    newOrder.Price = newPrice;
    await connector.ReRegisterOrderAsync(order, newOrder);
}

Cuándo usar métodos asíncronos

Use métodos asíncronos cuando:

  • El código se ejecuta en un contexto async (por ejemplo, en manejadores de ASP.NET, aplicaciones multiplataforma).
  • Necesita admitir la cancelación de la operación mediante CancellationToken.
  • Necesita evitar bloquear el hilo de la interfaz de usuario.

Use métodos síncronos cuando:

  • El código se ejecuta dentro de una estrategia (Strategy), que administra internamente los hilos.
  • Es un script simple o una aplicación de consola donde no se requiere async.

Los métodos síncronos (RegisterOrder, CancelOrder, EditOrder) llaman internamente a sus contrapartes asíncronas mediante AsyncHelper.Run, por lo que son completamente equivalentes en funcionalidad.

Ejemplo

private readonly Connector _connector = new();

public async Task PlaceAndManageOrderAsync(Security security, Portfolio portfolio, CancellationToken cancellationToken)
{
    // Crear una orden
    var order = new Order
    {
        Security = security,
        Portfolio = portfolio,
        Direction = Sides.Buy,
        Volume = 1,
        Price = security.BestBid?.Price ?? 100m,
        Type = OrderTypes.Limit,
    };

    // Registro asíncrono
    await _connector.RegisterOrderAsync(order, cancellationToken);

    // ... esperar cambios en las condiciones de mercado ...

    // 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);
    }

    // Cancelación asíncrona
    await _connector.CancelOrderAsync(order, cancellationToken);
}

Véase también

Órdenes