Definições de Teste

Esta secção descreve as principais definições de HistoryEmulationConnector para testar estratégias de negociação.

Definições Básicas do Emulador

Subscrições de Dados de Mercado

Para testar corretamente a estratégia, é necessário configurar subscrições para os tipos de dados de mercado necessários. Mesmo que a estratégia seja testada em candles, para uma emulação correta dos negócios é necessária uma subscrição de negócios tick:

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

Se a estratégia exigir dados do livro de ordens:

// Criar uma subscrição de livros de ordens
var depthSubscription = new Subscription(DataType.MarketDepth, security);
_connector.Subscribe(depthSubscription);

Geração de Livro de Ordens para Testes

Se não existirem livros de ordens históricos, mas eles forem necessários para testar a estratégia, pode ativar a geração de livros de ordens:

// Criar um gerador de livro de ordens com comportamento de tendência
var mdGenerator = new TrendMarketDepthGenerator(security.ToSecurityId());

// Enviar uma mensagem de subscrição para o gerador
_connector.MarketDataAdapter.SendInMessage(new GeneratorMessage
{
	IsSubscribe = true,
	Generator = mdGenerator
});

Definições do Gerador de Livro de Ordens

  • Intervalo de atualização do livro de ordens (MarketDataGenerator.Interval) - as atualizações não podem ser mais frequentes do que a chegada de negócios tick, pois os livros de ordens são gerados antes de cada negócio:
mdGenerator.Interval = TimeSpan.FromSeconds(1);
mdGenerator.MaxAsksDepth = 1; 
mdGenerator.MaxBidsDepth = 1;
  • Para obter um volume de nível realista no livro de ordens, pode usar a opção MarketDepthGenerator.UseTradeVolume, que usa os volumes das melhores cotações a partir do volume do negócio que está a ser gerado:
mdGenerator.UseTradeVolume = true;
mdGenerator.MinVolume = 1;
mdGenerator.MaxVolume = 1;
  • Definições de spread - o spread mínimo gerado é igual a Security.PriceStep. Recomenda-se não gerar um spread entre as melhores cotações superior a 5 passos de preço, para que, ao gerar a partir de candles, o spread não se torne demasiado amplo:
mdGenerator.MinSpreadStepCount = 1;
mdGenerator.MaxSpreadStepCount = 5;

Exemplo Completo de Configuração de Testes

// Criar uma ligação histórica
var connector = new HistoryEmulationConnector();

// Configurar parâmetros básicos
connector.MarketTimeChangedInterval = TimeSpan.FromSeconds(10);
connector.EmulationAdapter.Emulator.Settings.Latency = TimeSpan.FromMilliseconds(100);
connector.EmulationAdapter.Emulator.Settings.MatchOnTouch = false;

// Carregar dados históricos
var storage = new StorageRegistry();
var security = new Security { Id = "AAPL", PriceStep = 0.01m };

// Criar uma subscrição de candles
var candleSubscription = new Subscription(
	TimeSpan.FromMinutes(5).TimeFrame(),
	security)
{
	MarketData =
	{
		From = DateTime.Today.Subtract(TimeSpan.FromDays(30)),
		To = DateTime.Today,
		BuildMode = MarketDataBuildModes.Load
	}
};
connector.Subscribe(candleSubscription);

// Criar uma subscrição de ticks para emulação correta
var tickSubscription = new Subscription(DataType.Ticks, security);
connector.Subscribe(tickSubscription);

// Configurar geração de livro de ordens
var mdGenerator = new TrendMarketDepthGenerator(security.ToSecurityId())
{
	Interval = TimeSpan.FromSeconds(1),
	MaxAsksDepth = 5,
	MaxBidsDepth = 5,
	UseTradeVolume = true,
	MinVolume = 1,
	MaxVolume = 100,
	MinSpreadStepCount = 1,
	MaxSpreadStepCount = 5
};

connector.MarketDataAdapter.SendInMessage(new GeneratorMessage
{
	IsSubscribe = true,
	Generator = mdGenerator
});

// Subscrever receção de dados
connector.CandleReceived += OnCandleReceived;
connector.TickTradeReceived += OnTickReceived;
connector.OrderBookReceived += OnOrderBookReceived;

// Iniciar testes
connector.Connect();

Tratamento de Eventos

private void OnCandleReceived(Subscription subscription, ICandleMessage candle)
{
	// Processar candles recebidas
	Console.WriteLine($"Vela: {candle.OpenTime}, O:{candle.OpenPrice}, H:{candle.HighPrice}, L:{candle.LowPrice}, C:{candle.ClosePrice}");
}

private void OnTickReceived(Subscription subscription, ITickTradeMessage tick)
{
	// Processar ticks recebidos
	Console.WriteLine($"Tick: {tick.ServerTime}, Preço: {tick.Price}, Volume: {tick.Volume}");
}

private void OnOrderBookReceived(Subscription subscription, IOrderBookMessage orderBook)
{
	// Usar métodos de extensão para IOrderBookMessage
	var bestBid = orderBook.GetBestBid();
	var bestAsk = orderBook.GetBestAsk();
	var spreadMiddle = orderBook.GetSpreadMiddle(Security.PriceStep);
	
	// Processar livros de ordens recebidos
	Console.WriteLine($"Livro de ordens: {orderBook.ServerTime}, melhor compra: {bestBid?.Price}, melhor venda: {bestAsk?.Price}, meio do spread: {spreadMiddle}");
	
	// Obter preço por lado da ordem
	var bidPrice = orderBook.GetPrice(Sides.Buy);
	var askPrice = orderBook.GetPrice(Sides.Sell);
	
	Console.WriteLine($"Preço de compra: {bidPrice}, preço de venda: {askPrice}");
}

Trabalhar com Dados do Livro de Ordens

Ao trabalhar com livros de ordens como IOrderBookMessage, pode usar os seguintes métodos de extensão:

// Obter o melhor bid
var bestBid = orderBook.GetBestBid();

// Obter o melhor ask
var bestAsk = orderBook.GetBestAsk();

// Obter o meio do spread
var spreadMiddle = orderBook.GetSpreadMiddle(Security.PriceStep);

// Obter o preço por lado da ordem
var price = orderBook.GetPrice(Sides.Buy); // ou Sides.Sell, ou null para o meio do spread

Ao trabalhar com dados Level1, também pode obter o meio do spread:

// Obter o meio do spread a partir de uma mensagem Level1
var spreadMiddle = level1.GetSpreadMiddle(Security.PriceStep);

Estes métodos de extensão simplificam o acesso a dados do livro de ordens e permitem escrever código mais limpo e compreensível ao trabalhar com cotações da bolsa.