Загрузка заявок и сделок
При старте стратегии может возникнуть необходимость загрузки ранее совершённых заявок и сделок (например, когда робот был перезагружен в течении торговой сессии или сделки и заявки переносятся через ночь). Для этого нужно:
- Найти те заявки, которые необходимо загрузить в стратегию, и вернуть их из метода (например, загрузить идентификаторы заявок, если стратегия записывает каждый раз при регистрации через метод Strategy.ProcessNewOrders(System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Order> newOrders ) из файла).
- Объединить полученный результат с базовым методом Strategy.ProcessNewOrders(System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.Order> newOrders ).
- После того, как заявки будут загружены в стратегию, загрузятся и все совершенные по ним сделки. Это будет сделано автоматически.
Следующий пример показывает загрузку всех сделок в стратегию:
Загрузка в стратегию ранее совершенных заявок и сделок
- Для этого, чтобы 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);
}
- Чтобы реализовать фильтрацию заявок, необходимо определить критерий отсеивания. Например, если в процессе работы стратегии сохранять все регистрируемые заявки в файл, то можно сделать фильтр по номеру транзакции 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));
}
- Запись номеров транзакций заявок, регистрируемых через стратегию, можно осуществить, переопределив метод 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() });
}
- После того, как заявки будут загружены в стратегию, загрузятся и все совершенные по ним сделки. Это будет сделано автоматически.