Gestión de posiciones
StockSharp proporciona un sistema flexible de gestión de posiciones que permite realizar seguimiento del estado actual de las posiciones, calcularlas basándose en órdenes o trades, y mantener un historial de ciclo de vida (apertura, cierre, reversals).
PositionManager
La clase PositionManager implementa la interfaz IPositionManager y sirve como el componente principal para calcular posiciones actuales basándose en mensajes entrantes.
Creación del administrador
El constructor acepta dos parámetros:
var state = new PositionManagerState();
var manager = new PositionManager(byOrders: false, state);
byOrders = true-- la posición se calcula basándose en cambios del saldo de órdenes. Es adecuado cuando el sistema de trading recibe actualizaciones de estado de órdenes pero no trades individuales.byOrders = false-- la posición se calcula basándose en volúmenes de trades (modo recomendado). Proporciona una contabilidad más precisa de las operaciones ejecutadas.
Procesamiento de mensajes
El método ProcessMessage acepta un mensaje entrante (Message) y devuelve un PositionChangeMessage cuando la posición cambia, o null si la posición no ha cambiado:
var posChange = manager.ProcessMessage(executionMsg);
if (posChange != null)
{
Console.WriteLine($"Position: {posChange.CurrentValue}");
}
IPositionManagerState
La interfaz IPositionManagerState describe el estado interno del administrador de posiciones. La implementación PositionManagerState almacena información sobre órdenes y posiciones actuales.
Métodos principales
| Método | Descripción |
|---|---|
AddOrGetOrder |
Registra una nueva orden o devuelve una existente por transactionId |
TryGetOrder |
Recupera parámetros de orden (instrumento, cartera, dirección, saldo) |
UpdateOrderBalance |
Actualiza el saldo actual de la orden después de una ejecución parcial |
RemoveOrder |
Elimina una orden completada del seguimiento |
UpdatePosition |
Actualiza la posición por instrumento y cartera, devuelve el nuevo valor |
Clear |
Restablece todo el estado del administrador |
Ejemplo de trabajo con estado
var state = new PositionManagerState();
// Registrar una orden
state.AddOrGetOrder(
transactionId: 12345,
securityId: secId,
portfolioName: "MyPortfolio",
side: Sides.Buy,
volume: 100,
balance: 100
);
// Actualizar después de ejecución parcial
state.UpdateOrderBalance(12345, newBalance: 60);
// Actualizar posición directamente
var newPosition = state.UpdatePosition(secId, "MyPortfolio", diff: 40);
Console.WriteLine($"Current position: {newPosition}");
// Limpiar
state.Clear();
PositionLifecycleTracker
La clase PositionLifecycleTracker realiza seguimiento del ciclo de vida completo de las posiciones -- desde la apertura hasta el cierre (round-trip). Esto es útil para analizar operaciones individuales, calcular beneficio por cada posición y generar informes.
Características clave
- History: la propiedad
History(IReadOnlyList<ReportPosition>) contiene todas las posiciones round-trip completadas. - Evento
RoundTripClosed: se dispara cuando una posición se cierra (el valor alcanza cero) o se revierte (el signo de la posición cambia). - Método
ProcessPosition: acepta un objeto Position y actualiza el estado interno.
Estados detectados
| Estado | Descripción |
|---|---|
| Opening | La posición pasa de cero a un valor distinto de cero |
| Closing | El valor de la posición alcanza cero |
| Reversal | El signo de la posición cambia (por ejemplo, de largo a corto) |
Ejemplo de uso
var tracker = new PositionLifecycleTracker();
tracker.RoundTripClosed += report =>
{
Console.WriteLine($"Round-trip completed:");
Console.WriteLine($" Opened: {report.OpenTime}");
Console.WriteLine($" Closed: {report.CloseTime}");
};
// Procesar actualizaciones de posición
tracker.ProcessPosition(position);
// Ver historial
foreach (var report in tracker.History)
{
Console.WriteLine($" {report.OpenTime} -> {report.CloseTime}");
}
PositionMessageAdapter
La clase PositionMessageAdapter es un wrapper alrededor de un adaptador de mensajes que calcula automáticamente posiciones a partir del flujo de mensajes. Se usa dentro de la infraestructura interna del conector.
Cómo funciona
var innerAdapter = connector.Adapter;
var posManager = new PositionManager(byOrders: false, new PositionManagerState());
var posAdapter = new PositionMessageAdapter(innerAdapter, posManager);
El adaptador intercepta mensajes de ejecución de órdenes y trades, llama a PositionManager.ProcessMessage y genera las instancias PositionChangeMessage correspondientes para los manejadores superiores.
Posiciones en estrategias
En la clase Strategy, se accede a la posición actual mediante la propiedad Position:
// Posición actual del instrumento principal
decimal currentPosition = Position;
// Cerrar posición
if (Position > 0)
SellMarket(Math.Abs(Position));
else if (Position < 0)
BuyMarket(Math.Abs(Position));
// O mediante un método integrado
ClosePosition();
Para más detalles sobre operaciones de trading en estrategias, consulte la sección Operaciones de trading.