MATBa-ROFEX


En la primera parte de esta serie presentamos Primary.Net y como acceder a la lista de instrumentos operados y sus datos históricos. En esta segunda parte, vamos a ver como operar con órdenes.

Identificando una orden

Las órdenes en Primary.Net están representadas por una jerarquía de tres clases:

Diagrama de clases

  • OrderId: Identifica a una orden.
  • Order: Contiene la información necesaria para ingresar una orden al mercado.
  • OrderStatus: Contiene el estado de una orden enviada al mercado.

Enviando una orden

Una orden en Primary.Net está representada por la clase Order. Las propiedades básicas que tenemos que tener en cuenta son:

  • Instrument: Sobre que instrumento queremos operar.
  • Type: Si es una orden al precio de mercado y a un precio específico.
  • Side: Orden de compra o de venta.
  • Expiration: El tiempo de vida de la orden.
  • Quantity: La cantidad de instrumentos a operar.

Una vez creada la orden, se envia con el método SubmitOrder.

Por ejemplo, así se enviaría una orden de compra por 100 contratos del futuro de dolar con vencimiento en julio 2020 al precio de mercado:

var api = new Api(Api.DemoEndpoint);
await api.Login(Api.DemoUsername, Api.DemoPassword);

var order = new Order
{
    Instrument = new Instrument { Market = "ROFX", Symbol = "DOJul20" },
    Expiration = OrderExpiration.Day,
    Quantity = 100,
    Type = OrderType.Market
};

var orderId = await api.SubmitOrder(Api.DemoAccount, order);
Console.WriteLine($"{orderId.ClientId} / {orderId.Proprietary}");

La salida va mostrar el identificador de la orden, por ejemplo:

327697141000025 / PBCP

Si quisíeramos cursar una orden con un precio límite, simplemente hay que cambiar el tipo y poner el precio:

var order = new Order
{
    Instrument = new Instrument { Market = "ROFX", Symbol = "DOJul20" },
    Expiration = OrderExpiration.Day,
    Quantity = 100,
    Type = OrderType.Limit,
    Price = 77.99m
};

Consultando el estado de una orden

Una vez enviada una orden, podemos consultar su estado utilizando el método GetOrderStatus.

var orderStatus = await _api.GetOrderStatus(orderId);
Console.WriteLine($"{orderStatus.Status} / {orderStatus.StatusText}");

Si la orden fue correctamente cursada, se mostrará:

New / Aceptada

Si la orden fue rechazada, la propiedad StatusText mostrará más información del motivo del rechazo, por ejemplo:

Rejected / Saldo insuficiente

Los estados posibles de la orden se encuentran en la enumeración Status dentro del namespace Primary.Data.Orders.

Ordenes iceberg

Para enviar una orden iceberg, hay tres propiedades que hay que tener en cuenta:

  • Iceberg: Debe ser true para identificar esta orden como una orden iceberg.
  • Quantity: La cantidad real que queremos operar.
  • DisplayQuantity: La cantidad que queremos mostrar públicamente.

Una vez cursada la orden, podemos ver como se desarrolla la operación obteniendo la información de la orden con GetOrderStatus y examinando las siguientes propiedades:

  • LastQuantity: La última cantidad operada.
  • CumulativeQuantity: La cantidad operada desde que fue enviada la orden.
  • LeavesQuantity: La cantidad que queda por operar.

Conclusiones

Pudiendo cursar órdenes al mercado, ya tenemos lo básico para implementar una estrategia de trading. En la próxima parte de esta serie, vamos a ver como responder a eventos y datos en tiempo real.

Para conocer más acerca de la biblioteca, se puede acceder al repositorio de GitHub y a la documentación.