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 поступят все заявки из коннектора, и их необходимо отфильтровать:
	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. После того, как заявки будут загружены в стратегию, загрузятся и все совершенные по ним сделки. Это будет сделано автоматически.