Subscrições

A API StockSharp oferece um modelo de aquisição de dados baseado em subscrições. Este é um mecanismo universal para receber tanto dados de mercado como informação de transacções. Esta abordagem tem vantagens significativas:

  • Isolamento da subscrição — cada subscrição funciona de forma independente, permitindo executar em paralelo qualquer número de subscrições com diferentes parâmetros (com ou sem pedido de histórico).
  • Acompanhamento de estado — as subscrições têm estados específicos que permitem controlar se os dados históricos estão actualmente a ser transmitidos ou se a subscrição mudou para modo em tempo real.
  • Universalidade — o código para trabalhar com subscrições é o mesmo independentemente dos tipos de dados pedidos, tornando o desenvolvimento mais eficiente.

Para trabalhar com subscrições, tem de utilizar a classe Subscription. Vejamos exemplos de utilização de subscrições para obter vários tipos de dados.

Exemplo de Subscrição de Velas

// Criar uma subscrição para velas de 5 minutos
var subscription = new Subscription(DataType.TimeFrame(TimeSpan.FromMinutes(5)), security)
{
	// Configurar parâmetros da subscrição através da propriedade MarketData
	MarketData =
	{
		// Pedir dados dos últimos 30 dias
		From = DateTimeOffset.Now.Subtract(TimeSpan.FromDays(30)),
		// null significa que a subscrição mudará para modo em tempo real após receber o histórico
		To = null
	}
};

// Processar velas recebidas
_connector.CandleReceived += (sub, candle) =>
{
	if (sub != subscription)
		return;

	// Processar a vela
	Console.WriteLine($"Vela: {candle.OpenTime} - O:{candle.OpenPrice} H:{candle.HighPrice} L:{candle.LowPrice} C:{candle.ClosePrice} V:{candle.TotalVolume}");
};

// Tratar a transição da subscrição para modo online
_connector.SubscriptionOnline += (sub) =>
{
	if (sub != subscription)
		return;

	Console.WriteLine("A subscrição mudou para o modo em tempo real");
};

// Tratar erros da subscrição
_connector.SubscriptionFailed += (sub, error, isSubscribe) =>
{
	if (sub != subscription)
		return;

	Console.WriteLine($"Erro de subscrição: {error}");
};

// Iniciar a subscrição
_connector.Subscribe(subscription);

Exemplo de Subscrição de Livro de Ofertas

// Criar uma subscrição para o livro de ofertas do instrumento seleccionado
var depthSubscription = new Subscription(DataType.MarketDepth, security);

// Processar livros de ofertas recebidos
_connector.OrderBookReceived += (sub, depth) =>
{
	if (sub != depthSubscription)
		return;

	// Processar o livro de ofertas
	Console.WriteLine($"Livro de ofertas: {depth.SecurityId}, hora: {depth.ServerTime}");
	Console.WriteLine($"Compras: {depth.Bids.Count}, Vendas: {depth.Asks.Count}");
};

// Iniciar a subscrição
_connector.Subscribe(depthSubscription);

Exemplo de Subscrição de Negócios Tick

// Criar uma subscrição de negócios tick para o instrumento seleccionado
var tickSubscription = new Subscription(DataType.Ticks, security);

// Processar ticks recebidos
_connector.TickTradeReceived += (sub, tick) =>
{
	if (sub != tickSubscription)
		return;

	// Processar o tick
	Console.WriteLine($"Tick: {tick.SecurityId}, Hora: {tick.ServerTime}, Preço: {tick.Price}, Volume: {tick.Volume}");
};

// Iniciar a subscrição
_connector.Subscribe(tickSubscription);

Exemplo de Subscrição com Configuração do Modo de Construção de Velas

// Subscrição de velas de 5 minutos que serão construídas a partir de ticks
var candleSubscription = new Subscription(DataType.TimeFrame(TimeSpan.FromMinutes(5)), security)
{
	MarketData =
	{
		// Especificar o modo de construção e a fonte de dados
		BuildMode = MarketDataBuildModes.Build,
		BuildFrom = DataType.Ticks,
		// Também pode activar a construção do perfil de volume
		IsCalcVolumeProfile = true,
	}
};

_connector.Subscribe(candleSubscription);

Exemplo de Subscrição Level1 (Informação Básica do Instrumento)

// Criar uma subscrição para informação básica do instrumento
var level1Subscription = new Subscription(DataType.Level1, security);

// Processar dados Level1 recebidos
_connector.Level1Received += (sub, level1) =>
{
	if (sub != level1Subscription)
		return;

	Console.WriteLine($"Level1: {level1.SecurityId}, Hora: {level1.ServerTime}");

	// Escrever valores dos campos Level1
	foreach (var pair in level1.Changes)
	{
		Console.WriteLine($"Campo: {pair.Key}, Valor: {pair.Value}");
	}
};

// Iniciar a subscrição
_connector.Subscribe(level1Subscription);

Anular Subscrição de Dados

Para parar de receber dados, utilize o método UnSubscribe:

// Anular a subscrição de uma subscrição específica
_connector.UnSubscribe(subscription);

// Ou pode anular todas as subscrições
foreach (var sub in _connector.Subscriptions)
{
	_connector.UnSubscribe(sub);
}

Estados da Subscrição

As subscrições podem estar nos seguintes estados: