Subscrições de Dados de Mercado em Estratégias
Em StockSharp, as estratégias usam um mecanismo de subscrição para receber dados de mercado. Esta abordagem é o método principal e preferencial para obter dados em estratégias de negociação.
Noções Básicas de Subscrições
As subscrições em estratégias baseiam-se no mecanismo geral de subscrições do StockSharp. Fornecem uma forma centralizada e unificada de obter todos os tipos de dados de mercado.
Criar uma Subscrição numa Estratégia
No método OnStarted2 da estratégia, pode criar e iniciar uma subscrição para os dados necessários:
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// Criar uma subscrição para candles de 5 minutos diretamente através de DataType
var subscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)),
Security);
// Se forem necessários parâmetros adicionais, pode configurar a subscrição
subscription.From = DateTimeOffset.Now.Subtract(TimeSpan.FromDays(7));
// Criar uma regra para processar candles recebidas
Connector
.WhenCandlesFinished(subscription)
.Do(ProcessCandle)
.Apply(this);
// Iniciar a subscrição
Connector.Subscribe(subscription);
}
Neste exemplo, é criada uma subscrição para candles de 5 minutos usando um construtor conveniente que aceita DataType e Security. Se necessário, pode configurar adicionalmente os parâmetros da subscrição, como o período de histórico.
Vantagens das Subscrições em Estratégias
Usar subscrições em estratégias tem várias vantagens em comparação com a subscrição direta de eventos de Strategy.Connector:
Isolamento - cada subscrição funciona de forma independente, permitindo receber diferentes tipos de dados para diferentes instrumentos sem interferência mútua. Isto também protege a estratégia contra a receção de dados destinados a outras estratégias executadas em paralelo. Com a subscrição direta de eventos do conector, teria de filtrar adicionalmente os dados para excluir informação de outras estratégias.
Gestão de Estado - as subscrições têm estados claros (SubscriptionStates), que permitem determinar com precisão se os dados históricos estão atualmente a ser recebidos ou se a subscrição já transitou para o modo online.
Controlo Automático do Estado da Estratégia - a estratégia acompanha automaticamente o estado de todas as suas subscrições e transita para o modo online (IsOnline) apenas quando todas as subscrições ficaram online.
Uniformidade do Código - as subscrições usam uma abordagem unificada, independente do tipo de dados solicitado.
Integração com Regras - as subscrições integram-se facilmente com o Modelo de Eventos da estratégia através de regras.
Gestão Automática de Subscrições - quando a estratégia para, todas as suas subscrições são automaticamente canceladas, libertando recursos.
Suporte para Dados Históricos - capacidade de carregar dados históricos antes de transitar para dados em tempo real.
Monitorizar Estados de Subscrição
A estratégia acompanha automaticamente o estado de todas as subscrições para controlar o seu modo de operação:
private void CheckRefreshOnlineState()
{
bool nowOnline = ProcessState == ProcessStates.Started;
if (nowOnline)
nowOnline = _subscriptions.CachedKeys
.Where(s => !s.SubscriptionMessage.IsHistoryOnly())
.All(s => s.State == SubscriptionStates.Online);
// Atualizar o estado IsOnline da estratégia
IsOnline = nowOnline;
}
A propriedade Strategy.IsOnline será true apenas quando todas as subscrições da estratégia tiverem transitado para o estado SubscriptionStates.Online. Isto permite à estratégia compreender o momento em que está a trabalhar com dados de mercado atuais.
Tipos de Subscrições
Em estratégias, pode usar subscrições para vários tipos de dados de mercado:
// Subscrição de candles
var candleSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(1)),
Security);
// Subscrição de profundidade de mercado
var depthSubscription = new Subscription(
DataType.MarketDepth,
Security);
// Subscrição de negócios tick
var tickSubscription = new Subscription(
DataType.Ticks,
Security);
// Subscrição de Level1 (melhor bid/ask e outra informação básica)
var level1Subscription = new Subscription(
DataType.Level1,
Security);
Processar Dados de Subscrição Através de Regras
Para processar dados recebidos através de uma subscrição, recomenda-se usar regras:
// Subscrição de candles
var subscription = new Subscription(DataType.TimeFrame(TimeSpan.FromMinutes(5)), Security);
// Criar uma regra para processar candles recebidas
Connector
.WhenCandlesFinished(subscription) // Ativação da regra quando é recebida uma candle concluída
.Do(ProcessCandle) // Chamar o método de processamento
.Apply(this); // Aplicar a regra à estratégia
// Iniciar a subscrição
Connector.Subscribe(subscription);
No exemplo acima, é criada uma regra que chamará o método ProcessCandle quando cada candle concluída for recebida.
Solicitar Dados Históricos
A estratégia define automaticamente o período de carregamento do histórico através da propriedade Strategy.HistorySize:
// Definir o período de carregamento do histórico para 30 dias
strategy.HistorySize = TimeSpan.FromDays(30);
Ao criar uma subscrição, a estratégia define automaticamente o parâmetro From para carregar histórico, caso este não tenha sido especificado explicitamente.
Cancelar Subscrições
As subscrições podem ser canceladas manualmente chamando o método UnSubscribe:
// Cancelar subscrição
Connector.UnSubscribe(subscription);
Ao parar a estratégia, se o parâmetro UnsubscribeOnStop estiver definido como true (predefinição), todas as subscrições serão canceladas automaticamente.