Configuración de pruebas

Esta sección describe los ajustes principales de HistoryEmulationConnector para probar estrategias de trading.

Configuración básica del emulador

Suscripciones a datos de mercado

Para probar correctamente una estrategia, es necesario configurar suscripciones a los tipos de datos de mercado requeridos. Incluso si la estrategia se prueba con velas, para una emulación correcta de operaciones se requiere una suscripción a operaciones tick:

// Crear una suscripción a operaciones tick
var tickSubscription = new Subscription(DataType.Ticks, security);
_connector.Subscribe(tickSubscription);

Si la estrategia requiere datos del libro de órdenes:

// Crear una suscripción a libros de órdenes
var depthSubscription = new Subscription(DataType.MarketDepth, security);
_connector.Subscribe(depthSubscription);

Generación del libro de órdenes para pruebas

Si no hay libros de órdenes históricos, pero se necesitan para probar la estrategia, puede activar la generación del libro de órdenes:

// Crear un generador de libro de órdenes con comportamiento de tendencia
var mdGenerator = new TrendMarketDepthGenerator(security.ToSecurityId());

// Enviar un mensaje de suscripción al generador
_connector.MarketDataAdapter.SendInMessage(new GeneratorMessage
{
	IsSubscribe = true,
	Generator = mdGenerator
});

Configuración del generador de libro de órdenes

  • Intervalo de actualización del libro de órdenes (MarketDataGenerator.Interval) - las actualizaciones no pueden ser más frecuentes que la llegada de operaciones tick, ya que los libros de órdenes se generan antes de cada operación:
mdGenerator.Interval = TimeSpan.FromSeconds(1);
mdGenerator.MaxAsksDepth = 1; 
mdGenerator.MaxBidsDepth = 1;
  • Para obtener un volumen realista de nivel en el libro de órdenes, puede usar la opción MarketDepthGenerator.UseTradeVolume, que toma los volúmenes de las mejores cotizaciones a partir del volumen de operación que se genera:
mdGenerator.UseTradeVolume = true;
mdGenerator.MinVolume = 1;
mdGenerator.MaxVolume = 1;
  • Configuración del spread - el spread mínimo generado es igual a Security.PriceStep. Se recomienda no generar un spread entre las mejores cotizaciones mayor de 5 pasos de precio, para que al generar desde velas el spread no se vuelva demasiado amplio:
mdGenerator.MinSpreadStepCount = 1;
mdGenerator.MaxSpreadStepCount = 5;

Ejemplo completo de configuración de pruebas

// Crear una conexión 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;

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

// Crear una suscripción a velas
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);

// Crear una suscripción a ticks para una emulación correcta
var tickSubscription = new Subscription(DataType.Ticks, security);
connector.Subscribe(tickSubscription);

// Configurar la generación del libro de órdenes
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
});

// Suscribirse a la recepción de datos
connector.CandleReceived += OnCandleReceived;
connector.TickTradeReceived += OnTickReceived;
connector.OrderBookReceived += OnOrderBookReceived;

// Iniciar las pruebas
connector.Connect();

Manejo de eventos

private void OnCandleReceived(Subscription subscription, ICandleMessage candle)
{
	// Procesamiento de las velas recibidas
	Console.WriteLine($"Vela: {candle.OpenTime}, O:{candle.OpenPrice}, H:{candle.HighPrice}, L:{candle.LowPrice}, C:{candle.ClosePrice}");
}

private void OnTickReceived(Subscription subscription, ITickTradeMessage tick)
{
	// Procesamiento de los ticks recibidos
	Console.WriteLine($"Tick: {tick.ServerTime}, Precio: {tick.Price}, Volumen: {tick.Volume}");
}

private void OnOrderBookReceived(Subscription subscription, IOrderBookMessage orderBook)
{
	// Uso de métodos de extensión para IOrderBookMessage
	var bestBid = orderBook.GetBestBid();
	var bestAsk = orderBook.GetBestAsk();
	var spreadMiddle = orderBook.GetSpreadMiddle(Security.PriceStep);
	
	// Procesamiento de los libros de órdenes recibidos
	Console.WriteLine($"Libro de órdenes: {orderBook.ServerTime}, mejor compra: {bestBid?.Price}, mejor venta: {bestAsk?.Price}, centro del spread: {spreadMiddle}");
	
	// Obtener el precio por lado de la orden
	var bidPrice = orderBook.GetPrice(Sides.Buy);
	var askPrice = orderBook.GetPrice(Sides.Sell);
	
	Console.WriteLine($"Precio de compra: {bidPrice}, precio de venta: {askPrice}");
}

Trabajo con datos del libro de órdenes

Al trabajar con libros de órdenes como IOrderBookMessage, puede usar los siguientes métodos de extensión:

// Obtener el mejor bid
var bestBid = orderBook.GetBestBid();

// Obtener el mejor ask
var bestAsk = orderBook.GetBestAsk();

// Obtener el punto medio del spread
var spreadMiddle = orderBook.GetSpreadMiddle(Security.PriceStep);

// Obtener el precio por lado de la orden
var price = orderBook.GetPrice(Sides.Buy); // o Sides.Sell, o null para el punto medio del spread

Al trabajar con datos Level1, también puede obtener el punto medio del spread:

// Obtener el punto medio del spread a partir de un mensaje Level1
var spreadMiddle = level1.GetSpreadMiddle(Security.PriceStep);

Estos métodos de extensión simplifican el acceso a los datos del libro de órdenes y permiten escribir código más limpio y comprensible al trabajar con cotizaciones de exchange.