Sistema de Snapshots
No StockSharp, os snapshots representam um mecanismo para guardar o estado atual mais recente dos dados de mercado. Em vez de percorrer todo o histórico, os snapshots permitem obter instantaneamente o valor Level1 atual, o livro de ofertas, a posição ou a transação.
Objetivo dos Snapshots
Ao trabalhar com dados em streaming, é frequentemente necessário conhecer o estado mais recente de um instrumento -- preço atual, livro de ofertas, posição aberta. Sem snapshots, obter esta informação exigiria carregar e processar todo o histórico. O sistema de snapshots resolve este problema guardando o estado mais recente de cada objeto e disponibilizando acesso ao mesmo no menor tempo possível.
ISnapshotStorage -- Interface de Armazenamento de Snapshots
A interface ISnapshotStorage define o contrato base para trabalhar com snapshots. A versão tipada ISnapshotStorage<TKey, TMessage> disponibiliza os seguintes métodos:
- Update(message) -- guardar ou atualizar um snapshot. Se já existir um snapshot para a chave indicada, será atualizado.
- Get(key) -- obter um snapshot pela chave (por exemplo, pelo identificador do instrumento).
- GetAll(from, to) -- obter todos os snapshots para o intervalo de datas especificado.
- Clear(key) -- eliminar o snapshot de uma chave específica.
- ClearAll() -- eliminar todos os snapshots.
ISnapshotSerializer -- Serialização de Snapshots
A interface ISnapshotSerializer é responsável por converter snapshots para representação binária e vice-versa:
- DataType -- informação do tipo de dados do snapshot.
- Version -- versão do formato de serialização.
- Serialize(version, message) -- serializar uma mensagem para uma matriz de bytes.
- Deserialize(version, buffer) -- desserializar uma matriz de bytes de volta para uma mensagem.
- GetKey(message) -- extrair a chave de uma mensagem.
- Update(message, changes) -- aplicar alterações incrementais a um snapshot existente.
SnapshotRegistry -- Registo de Snapshots
A classe SnapshotRegistry é o componente central para a gestão de snapshots. Implementa a interface ISnapshotRegistry e coordena o funcionamento de todos os armazenamentos de snapshots.
Funcionalidades Principais
- Gestão de armazenamento -- disponibiliza acesso aos armazenamentos de snapshots para vários tipos de dados.
- Escrita periódica -- as alterações são descarregadas para disco a cada 10 segundos, garantindo um equilíbrio entre desempenho e fiabilidade.
- Segurança entre threads -- todas as operações são seguras para utilização a partir de várias threads.
Organização dos Ficheiros
Os ficheiros de snapshot são armazenados no seguinte caminho:
{path}/{yyyy_MM_dd}/{serializer_name}.bin
Serializadores Integrados
O StockSharp inclui quatro serializadores para os principais tipos de dados de mercado:
| Serializador | Tipo de Mensagem | Objetivo |
|---|---|---|
| Level1BinarySnapshotSerializer | Level1ChangeMessage |
Dados Level1 (preços, volumes, spreads) |
| QuotesBinarySnapshotSerializer | QuoteChangeMessage |
Livro de ofertas |
| PositionBinarySnapshotSerializer | PositionChangeMessage |
Posições |
| TransactionBinarySnapshotSerializer | ExecutionMessage |
Transações (ordens e negócios) |
Cada serializador suporta versionamento do formato, garantindo compatibilidade retroativa ao atualizar o StockSharp.
Exemplo de Código
Criar um Registo de Snapshots
var snapshotRegistry = new SnapshotRegistry(Path.Combine(
Directory.GetCurrentDirectory(), "Snapshots"));
Trabalhar com Snapshots Level1
// Obter armazenamento de snapshots Level1
var level1Snapshots = snapshotRegistry.GetSnapshotStorage(
DataType.Level1);
// Salvar snapshot
var level1Msg = new Level1ChangeMessage
{
SecurityId = "AAPL@NASDAQ".ToSecurityId(),
ServerTime = DateTimeOffset.Now,
};
level1Msg.TryAdd(Level1Fields.LastTradePrice, 260.5m);
level1Msg.TryAdd(Level1Fields.BestBidPrice, 260.4m);
level1Msg.TryAdd(Level1Fields.BestAskPrice, 260.6m);
level1Snapshots.Update(level1Msg);
Obter um Snapshot
// Obter snapshot mais recente para um instrumento
var secId = "AAPL@NASDAQ".ToSecurityId();
var snapshot = level1Snapshots.Get(secId);
if (snapshot != null)
{
Console.WriteLine($"Last price: {snapshot.Changes[Level1Fields.LastTradePrice]}");
}