Medição de Slippage
S# calcula o slippage através do SlippageManager. Slippage é a diferença entre o preço de execução esperado de uma ordem e o preço real do negócio.
Interface ISlippageManager
A interface ISlippageManager define o contrato base:
- Slippage - slippage total acumulado (decimal).
- Reset() - reinicia o estado do gestor.
- ProcessMessage(Message) - processa uma mensagem; devolve o slippage para a execução indicada ou
null.
Como Funciona
O gestor de slippage funciona em três etapas:
1. Atualizar Preços de Mercado
Quando é recebido um Level1ChangeMessage ou QuoteChangeMessage, o gestor guarda os melhores preços bid e ask para cada instrumento.
2. Guardar o Preço Planeado
Quando é recebida uma OrderRegisterMessage, o gestor guarda o "preço planeado" - o melhor preço de mercado no momento do registo da ordem:
- Para uma compra (
Buy), é usado o melhor ask. - Para uma venda (
Sell), é usado o melhor bid.
3. Calcular Slippage
Quando é recebida uma ExecutionMessage com um negócio, o gestor calcula o slippage:
- Para uma compra:
(TradePrice - PlannedPrice) * TradeVolume - Para uma venda:
(PlannedPrice - TradePrice) * TradeVolume
Um valor positivo significa slippage desfavorável (preço pior do que o esperado), enquanto um valor negativo significa slippage favorável (preço melhor do que o esperado).
Estado: ISlippageManagerState
A interface ISlippageManagerState armazena o estado interno do gestor:
- Melhores preços bid/ask para cada instrumento (SecurityId).
- Preços planeados e direções para cada transação (
TransactionId). - Slippage total acumulado.
A implementação predefinida é SlippageManagerState.
Definições
| Propriedade | Predefinição | Descrição |
|---|---|---|
CalculateNegative |
true |
Contabilizar slippage favorável. Se false, os valores negativos são substituídos por zero. |
Integração via Adapter
A classe SlippageMessageAdapter envolve um adapter interno e calcula automaticamente o slippage para todos os negócios.
Integração com Estratégia
A estratégia (Strategy) expõe a propriedade Slippage para acompanhar o slippage global.
Exemplo de Utilização
// Criar gerenciador com armazenamento de estado
var manager = new SlippageManager(new SlippageManagerState());
// Considerar apenas slippage desfavorável
manager.CalculateNegative = false;
// Processar dados de mercado (atualizar melhores preços)
manager.ProcessMessage(level1Msg);
manager.ProcessMessage(quoteChangeMsg);
// Processar registo de ordem (guardar o preço planeado)
manager.ProcessMessage(orderRegisterMsg);
// Processar uma negociação (calcular slippage)
decimal? slippage = manager.ProcessMessage(executionMsg);
if (slippage != null)
{
Console.WriteLine($"Slippage: {slippage.Value}");
}
// Slippage acumulado total
Console.WriteLine($"Total slippage: {manager.Slippage}");
Reiniciar o Estado
O método Reset() limpa completamente o estado interno: melhores preços, preços planeados e slippage acumulado:
manager.Reset();