Trading algorítmico en MATba-ROFEX con .Net - Parte 2
- Parte 1: Introducción, instrumentos negociados y datos históricos.
- Parte 2: Ordenes.
- Parte 3: Eventos y datos en tiempo real.
- Parte 4: Ejemplo de una estrategia de trading.
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:
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 sertrue
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.