Gestão de Posições

StockSharp fornece um sistema flexível de gestão de posições que permite acompanhar o estado atual das posições, calculá-las com base em ordens ou negócios, e manter um histórico do ciclo de vida (abertura, fecho, reversões).

PositionManager

A classe PositionManager implementa a interface IPositionManager e serve como componente principal para calcular posições atuais com base nas mensagens recebidas.

Criar o Gestor

O construtor aceita dois parâmetros:

var state = new PositionManagerState();
var manager = new PositionManager(byOrders: false, state);
  • byOrders = true -- a posição é calculada com base nas alterações do saldo das ordens. Adequado quando o sistema de negociação recebe atualizações do estado das ordens, mas não negócios individuais.
  • byOrders = false -- a posição é calculada com base nos volumes dos negócios (modo recomendado). Fornece uma contabilização mais precisa das operações executadas.

Processar Mensagens

O método ProcessMessage aceita uma mensagem de entrada (Message) e devolve uma PositionChangeMessage quando a posição muda, ou null se a posição não tiver mudado:

var posChange = manager.ProcessMessage(executionMsg);

if (posChange != null)
{
    Console.WriteLine($"Position: {posChange.CurrentValue}");
}

IPositionManagerState

A interface IPositionManagerState descreve o estado interno do gestor de posições. A implementação PositionManagerState armazena informações sobre ordens e posições atuais.

Métodos Principais

Método Descrição
AddOrGetOrder Regista uma nova ordem ou devolve uma existente por transactionId
TryGetOrder Obtém parâmetros da ordem (instrumento, portefólio, direção, saldo)
UpdateOrderBalance Atualiza o saldo atual da ordem após execução parcial
RemoveOrder Remove uma ordem concluída do acompanhamento
UpdatePosition Atualiza a posição por instrumento e portefólio, devolve o novo valor
Clear Reinicia todo o estado do gestor

Exemplo de Trabalho com Estado

var state = new PositionManagerState();

// Registrar uma ordem
state.AddOrGetOrder(
    transactionId: 12345,
    securityId: secId,
    portfolioName: "MyPortfolio",
    side: Sides.Buy,
    volume: 100,
    balance: 100
);

// Atualizar após execução parcial
state.UpdateOrderBalance(12345, newBalance: 60);

// Atualizar posição diretamente
var newPosition = state.UpdatePosition(secId, "MyPortfolio", diff: 40);
Console.WriteLine($"Current position: {newPosition}");

// Clear
state.Clear();

PositionLifecycleTracker

A classe PositionLifecycleTracker acompanha o ciclo de vida completo das posições -- desde a abertura até ao fecho (round-trip). Isto é útil para analisar negócios individuais, calcular o lucro de cada posição e gerar relatórios.

Características Principais

  • History: a propriedade History (IReadOnlyList<ReportPosition>) contém todas as posições round-trip concluídas.
  • Evento RoundTripClosed: é acionado quando uma posição é fechada (valor chegou a zero) ou revertida (sinal da posição mudou).
  • Método ProcessPosition: aceita um objeto Position e atualiza o estado interno.

Estados Detetados

Estado Descrição
Opening A posição transita de zero para um valor diferente de zero
Closing O valor da posição chega a zero
Reversal O sinal da posição muda (por exemplo, de longa para curta)

Exemplo de Utilização

var tracker = new PositionLifecycleTracker();

tracker.RoundTripClosed += report =>
{
    Console.WriteLine($"Round-trip completed:");
    Console.WriteLine($"  Opened: {report.OpenTime}");
    Console.WriteLine($"  Closed: {report.CloseTime}");
};

// Processar atualizações de posição
tracker.ProcessPosition(position);

// Ver histórico
foreach (var report in tracker.History)
{
    Console.WriteLine($"  {report.OpenTime} -> {report.CloseTime}");
}

PositionMessageAdapter

A classe PositionMessageAdapter é um wrapper em torno de um adapter de mensagens que calcula automaticamente posições a partir do fluxo de mensagens. É usada dentro da infraestrutura interna do conector.

Como Funciona

var innerAdapter = connector.Adapter;
var posManager = new PositionManager(byOrders: false, new PositionManagerState());
var posAdapter = new PositionMessageAdapter(innerAdapter, posManager);

O adapter intercepta mensagens de execução de ordens e de negócios, chama PositionManager.ProcessMessage e gera instâncias PositionChangeMessage correspondentes para handlers a montante.

Posições em Estratégias

Na classe Strategy, a posição atual é acedida através da propriedade Position:

// Posição atual do instrumento principal
decimal currentPosition = Position;

// Fechar posição
if (Position > 0)
    SellMarket(Math.Abs(Position));
else if (Position < 0)
    BuyMarket(Math.Abs(Position));

// Ou por meio de um método integrado
ClosePosition();

Para mais detalhes sobre operações de negociação em estratégias, consulte a secção Operações de Negociação.

Ver Também