Table of Contents

Загрузка заявок и сделок

При старте стратегии может возникнуть необходимость загрузки ранее совершённых заявок и сделок (например, когда робот был перезагружен в течении торговой сессии или сделки и заявки переносятся через ночь). Для этого нужно:

  1. Найти те заявки, которые необходимо загрузить в стратегию, и вернуть их из метода (например, загрузить идентификаторы заявок, если стратегия записывает каждый раз при регистрации через метод Strategy.ProcessNewOrders(System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Order> newOrders ) из файла).
  2. Объединить полученный результат с базовым методом Strategy.ProcessNewOrders(System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Order> newOrders ).
  3. После того, как заявки будут загружены в стратегию, загрузятся и все совершенные по ним сделки. Это будет сделано автоматически.

Следующий пример показывает загрузку всех сделок в стратегию:

Загрузка в стратегию ранее совершенных заявок и сделок

  1. Для этого, чтобы Strategy загрузила свое предыдущее состояние, необходимо переопределить Strategy.ProcessNewOrders(System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Order> newOrders ). На вход данному методу из Strategy.OnStarted поступят все IConnector.Orders и IConnector.StopOrders, и их необходимо отфильтровать:
   private bool _isOrdersLoaded;
   private bool _isStopOrdersLoaded;
   		  	
   protected override IEnumerable<Order> ProcessNewOrders(IEnumerable<Order> newOrders, bool isStopOrders)
   {
   	// если заявки уже были ранее загружены
   	if ((!isStopOrders && _isOrdersLoaded) || (isStopOrders && _isStopOrdersLoaded))
   		return base.ProcessNewOrders(newOrders, isStopOrders);
   	return Filter(newOrders);
   }
  1. Чтобы реализовать фильтрацию заявок, необходимо определить критерий отсеивания. Например, если в процессе работы стратегии сохранять все регистрируемые заявки в файл, то можно сделать фильтр по номеру транзакции Order.TransactionId. Если такой номер присутствует в файле, значит заявка была зарегистрирована через данную стратегию:
   private IEnumerable<Order> Filter(IEnumerable<Order> orders)
   {
   	// считываем номера транзакций из файла
   	var transactions = File.ReadAllLines("orders_{0}.txt".Put(Name)).Select(l => l.To<long>()).ToArray();
   	
   	// находим наши заявки по считанным номерам
   	return orders.Where(o => transactions.Contains(o.TransactionId));
   }
  1. Запись номеров транзакций заявок, регистрируемых через стратегию, можно осуществить, переопределив метод Strategy.RegisterOrder(StockSharp.BusinessEntities.Order order ):
   protected override void RegisterOrder(Order order)
   {
   	// отравляем заявку дальше на регистрацию
   	base.RegisterOrder(order);
   	
   	// добавляем новый номер транзакции
   	File.AppendAllLines("orders_{0}.txt".Put(Name), new[]{ order.TransactionId.ToString() });
   }
  1. После того, как заявки будут загружены в стратегию, загрузятся и все совершенные по ним сделки. Это будет сделано автоматически.