← Назад

Ошибка: котирование порождает несколько выполненных заявок

Проблема проявляется даже стандартном примере SampleHistoryTesting. Для обнаружения в OnProcess достаточно добавить

if (Math.Abs(PositionManager.Position) > Volume)
  throw new Exception("Неверное состояние - поза превышает рабочий объем.");

и после получения эксепшена посмотреть Trader.Orders - последние две заявки будут исполненными, а перед ними будет несколько отмененных с примерно тем же временем.

Ошибка плавающая, возникает иногда на первой же заявке, а иногда несколько первых заявок проходят нормально.

Комментарии (52)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Alexander
Alexander
  1. Какая версия S#?
  2. PositionManager.Position может обновиться чуть позднее
  3. Добавьте логгер для стратегии (FileLogListener, к примеру) и скиньте сюда.
andy_baka_
andy_baka_

Alexander Mukhanchikov: 2) PositionManager.Position может обновиться чуть позднее

Александр, а насколько к PositionManager.Position можно привязываться как к индикатору состояния позиции?

Camill
Camill Автор
10:45:00.000 |            | MQS             | Стратегия запущена.
10:45:06.890 |            | MQS             | Регистрация новой заявки на Sell с ценой 115795 и объемом 1.
10:45:06.890 |            | MQS             | Заявка 2789119 на Sell отправлена с ценой 115795 объемом 1.
10:45:10.627 | Warning    | MQS             | Заявка 2789119 не имеет состояния.
... 9 повторов удалено ...
10:46:08.830 | Warning    | MQS             | Заявка 2789119 не имеет состояния.
10:46:11.110 |            | MQS             | Цена текущей 115795 и лучшей 116000.
10:46:11.110 |            | MQS             | Лучший бид 115770 и лучший аск 116000.
10:46:11.110 |            | MQS             | Котирование заявки 2789119 на Sell с ценой 115795 объемом 1.
10:46:11.110 |            | MQS             | Отмена заявки 2789119.
10:46:13.860 |            | MQS             | Отмена заявки 2789119 прошло успешно.
10:46:13.860 |            | MQS             | Регистрация новой заявки на Sell с ценой 116000 и объемом 1.
10:46:13.860 |            | MQS             | Заявка 2789120 на Sell отправлена с ценой 116000 объемом 1.
10:46:15.097 | Warning    | MQS             | Заявка 2789120 не имеет состояния.
... 96 повторов удалено ...
11:10:40.650 | Warning    | MQS             | Заявка 2789120 не имеет состояния.
11:10:40.660 |            | SS              | Новая Sell сделка 1 по цене 116500 на 1 заявки 2789119.
11:10:53.837 | Warning    | MQS             | Заявка 2789120 не имеет состояния.
... 22 повтора удалено ...
11:12:12.430 | Warning    | MQS             | Заявка 2789120 не имеет состояния.
11:12:12.440 |            | MQS             | Новая Sell сделка 1 по цене 116500 на 1 заявки 2789119.
11:12:30.447 | Warning    | MQS             | Заявка 2789120 не имеет состояния.
... 23 повтора удалено ...
11:14:59.027 | Warning    | MQS             | Заявка 2789120 не имеет состояния.
11:15:00.243 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
11:15:00.243 |            | MQS             | Стратегия останавливается.
11:15:00.243 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
11:15:00.243 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
11:15:00.243 |            | MQS             | Стратегия остановлена.
Camill
Camill Автор

Для сравнения, тот же пример из версии 3.2.1

SS 02.06.2009 10:45:00.000 [MQS] Стратегия запущена.
SS 02.06.2009 10:45:06.890 [MQS] Регистрация новой заявки на Sell с ценой 115795 и объемом 1.
SS 02.06.2009 10:45:06.890 [MQS] Заявка 1385140 на Sell отправлена с ценой 115795 объемом 1.
SS 02.06.2009 10:45:06.900 [MQS] Новая Limit заявка 1385140 на Sell с номером 1.
SS 02.06.2009 10:45:06.900 Новая Limit заявка 1385140 на Sell с номером 1.
SS 02.06.2009 10:45:26.423 [MQS] Цена текущей 115795 и лучшей 115800.
SS 02.06.2009 10:45:26.423 [MQS] Лучший бид 115770 и лучший аск 115800.
SS 02.06.2009 10:45:26.423 [MQS] Котирование заявки 1385140 на Sell с ценой 115795 объемом 1.
SS 02.06.2009 10:45:26.423 [MQS] Отмена заявки 1385140.
SS 02.06.2009 10:45:26.433 [MQS] Отмена заявки 1385140 прошло успешно.
SS 02.06.2009 10:45:26.433 [MQS] Регистрация новой заявки на Sell с ценой 115800 и объемом 1.
SS 02.06.2009 10:45:26.433 [MQS] Заявка 1385141 на Sell отправлена с ценой 115800 объемом 1.
SS 02.06.2009 10:45:32.220 [MQS] Новая Limit заявка 1385141 на Sell с номером 2.
SS 02.06.2009 10:45:32.220 Новая Limit заявка 1385141 на Sell с номером 2.
SS 02.06.2009 10:45:36.403 Новая Sell сделка 1 на 1 заявки 1385141.
SS 02.06.2009 10:45:36.403 [MQS] Новая Sell сделка 1 на 1 заявки 1385141.
SS 02.06.2009 10:45:36.403 [MQS] Позиция изменилась на -1.
SS 02.06.2009 10:45:36.403 [MQS] Заканчиваем котирование с неисполненным объемом равный 0.
SS 02.06.2009 10:45:36.403 [MQS] Стратегия останавливается.
SS 02.06.2009 10:45:36.403 [MQS] Заканчиваем котирование с неисполненным объемом равный 0.
SS 02.06.2009 10:45:36.403 [MQS] Заканчиваем котирование с неисполненным объемом равный 0.
SS 02.06.2009 10:45:36.403 [MQS] Стратегия остановлена.
Alexander
Alexander

Это немного не тот лог, который я ожидал увидеть. у нас в класс Strategy добавлен дополнительный логгер, его вывести необходимо.

Который по событию Log срабатывает.

И да, на вопрос о номере версии ответ я не вижу :)

Camill
Camill Автор

Alexander Mukhanchikov: у нас в класс Strategy добавлен дополнительный логгер, его вывести необходимо.

Который по событию Log срабатывает.

Это именно то, что выдается по событию Strategy.Log основной стратегии.

Вот пример того, что выдает непосредственно стратегия котирования (обратите внимание на два сообщения "Новая Sell сделка"):

11:20:00.000 |            | MQS             | Стратегия запущена.
11:20:15.147 |            | MQS             | Регистрация новой заявки на Sell с ценой 115795 и объемом 1.
11:20:15.147 |            | MQS             | Заявка 5239420 на Sell отправлена с ценой 115795 объемом 1.
11:20:32.567 | Warning    | MQS             | Заявка 5239420 не имеет состояния.
11:20:35.990 |            | MQS             | Цена текущей 115795 и лучшей 115570.
11:20:35.990 |            | MQS             | Лучший бид 115505 и лучший аск 115570.
11:20:35.990 |            | MQS             | Котирование заявки 5239420 на Sell с ценой 115795 объемом 1.
11:20:35.990 |            | MQS             | Отмена заявки 5239420.
11:20:37.160 |            | MQS             | Отмена заявки 5239420 прошло успешно.
11:20:37.160 |            | MQS             | Регистрация новой заявки на Sell с ценой 115570 и объемом 1.
11:20:37.160 |            | MQS             | Заявка 5239421 на Sell отправлена с ценой 115570 объемом 1.
11:20:39.160 | Warning    | MQS             | Заявка 5239421 не имеет состояния.
11:21:00.490 |            | MQS             | Цена текущей 115570 и лучшей 115620.
11:21:00.490 |            | MQS             | Лучший бид 115560 и лучший аск 115620.
11:21:00.490 |            | MQS             | Котирование заявки 5239421 на Sell с ценой 115570 объемом 1.
11:21:00.490 |            | MQS             | Отмена заявки 5239421.
11:21:00.500 |            | MQS             | Отмена заявки 5239421 прошло успешно.
11:21:20.583 |            | MQS             | Регистрация новой заявки на Sell с ценой 115620 и объемом 1.
11:21:20.583 |            | MQS             | Заявка 5239422 на Sell отправлена с ценой 115620 объемом 1.
11:21:20.583 |            | MQS             | Котируемая заявка 5239422 исполнилась.
11:21:20.583 |            | MQS             | Регистрация новой заявки на Sell с ценой 115800 и объемом 1.
11:21:20.583 |            | MQS             | Заявка 5239423 на Sell отправлена с ценой 115800 объемом 1.
11:21:22.397 | Warning    | MQS             | Заявка 5239423 не имеет состояния.
11:21:22.397 |            | MQS             | Новая Sell сделка 12 по цене 115620 на 1 заявки 5239422.
11:21:28.007 | Warning    | MQS             | Заявка 5239423 не имеет состояния.
11:21:28.007 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
11:21:28.007 |            | MQS             | Позиция изменилась на -1.
11:21:28.007 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
11:21:28.007 |            | MQS             | Стратегия останавливается.
11:21:28.007 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
11:21:28.007 |            | MQS             | Стратегия остановлена.
11:21:28.007 |            | MQS             | Новая Sell сделка 13 по цене 115800 на 1 заявки 5239423.
Camill
Camill Автор

Да, версия вчерашняя, ревизия 11491.

Mikhail Sukhov
Mikhail Sukhov

Camill: Ошибка плавающая, возникает иногда на первой же заявке, а иногда несколько первых заявок проходят нормально.

Посмотрели и код. Увидели следующие. Когда пример разрабатывался, дочерние стратегии блокировали исполнение родительской (OnProcess не вызывался). Теперь он вызывается не зависимо от наличия дочерних стратегий (в данном случае котирования). Я думаю, тут ситуация такая, что котирование в один момент времени создается в нескольких экземплярах.

Еще такой момент. В последней версии S# матчинг происходит в отдельном потоке. Это тоже определенный фактор для остановки стратегии котирования.

Вывод - надо пример переделывать под событийную модель. Попробуете?

Camill
Camill Автор

Mikhail Sukhov: Вывод - надо пример переделывать под событийную модель. Попробуете?

У меня свой проект, в котором используется событийная модель, там то же самое. Сейчас ее лог сделаю.

Mikhail Sukhov
Mikhail Sukhov

Camill:

Mikhail Sukhov: Вывод - надо пример переделывать под событийную модель. Попробуете?

У меня свой проект, в котором используется событийная модель, там то же самое. Сейчас ее лог сделаю.

Вы уверены, что параллельно не запущены несколько котирований? Меняйте им имена, чтобы их можно было различать.

Camill
Camill Автор

Mikhail Sukhov: Вы уверены, что параллельно не запущены несколько котирований? Специально цеплял логирование на конкретную стратегию котирования - результат чуть выше. Так что уверен.

Camill
Camill Автор

Цеплял вот таким кодом:


private int count = 0;
protected override ProcessResults OnProcess()
{
  ...

  var strategy = new MarketQuotingStrategy(order, new Unit(), new Unit());
  var log = new FileLogListener("log" + (count++).ToString() + ".txt");
  strategy.Log += new Action<LogMessage>(message => log.WriteMessage(message));
  base.ChildStrategies.Add(strategy);
Camill
Camill Автор

Еще пример, уже из моего проекта, с событийной моделью:

var strat = new MarketQuotingStrategy(LastOrder, new Unit(0), new Unit(50));
var log = new FileLogListener("log" + (++count).ToString() + ".txt");
strat.Name = "котирование " + (count).ToString();
strat.Log += new Action<LogMessage>(message => log.WriteMessage(message));
ChildStrategies.Add(strat);
23:40:34.163 |            | котирование 4   | Стратегия запущена.
23:40:38.823 |            | котирование 4   | Регистрация новой заявки на Buy с ценой 126870 и объемом 1.
23:40:38.823 |            | котирование 4   | Заявка 7167731 на Buy отправлена с ценой 126870 объемом 1.
23:40:56.560 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:41:17.933 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:41:36.310 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:41:43.060 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:41:56.390 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:42:42.827 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:42:57.373 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:43:20.500 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:44:06.733 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:44:17.687 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:44:27.157 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:44:29.703 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:44:34.703 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:44:55.093 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:45:40.017 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:46:03.720 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:46:29.970 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:46:32.873 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:46:38.233 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:46:56.797 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:47:35.563 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:47:59.733 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:48:26.627 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:48:28.000 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:48:34.437 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:48:52.063 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:48:56.283 | Warning    | котирование 4   | Заявка 7167731 не имеет состояния.
23:49:20.360 |            | котирование 4   | Цена текущей 126870 и лучшей 127350.
23:49:20.360 |            | котирование 4   | Лучший бид 127300 и лучший аск 127620.
23:49:20.360 |            | котирование 4   | Котирование заявки 7167731 на Buy с ценой 126870 объемом 1.
23:49:20.360 |            | котирование 4   | Отмена заявки 7167731.
23:49:20.370 |            | котирование 4   | Отмена заявки 7167731 прошло успешно.
23:49:25.750 |            | котирование 4   | Регистрация новой заявки на Buy с ценой 127350 и объемом 1.
23:49:25.750 |            | котирование 4   | Заявка 7167732 на Buy отправлена с ценой 127350 объемом 1.
23:49:54.893 |            | котирование 4   | Цена текущей 127350 и лучшей 127600.
23:49:54.893 |            | котирование 4   | Лучший бид 127550 и лучший аск 127655.
23:49:54.893 |            | котирование 4   | Котирование заявки 7167732 на Buy с ценой 127350 объемом 1.
23:49:54.893 |            | котирование 4   | Отмена заявки 7167732.
23:49:54.903 |            | котирование 4   | Отмена заявки 7167732 прошло успешно.
10:30:02.310 |            | котирование 4   | Регистрация новой заявки на Buy с ценой 127600 и объемом 1.
10:30:02.310 |            | котирование 4   | Заявка 7167733 на Buy отправлена с ценой 127600 объемом 1.
10:30:02.310 |            | котирование 4   | Котируемая заявка 7167733 исполнилась.
10:30:02.310 |            | котирование 4   | Регистрация новой заявки на Buy с ценой 127995 и объемом 1.
10:30:02.310 |            | котирование 4   | Новая Buy сделка 7 по цене 127550 на 1 заявки 7167733.
10:30:02.310 |            | котирование 4   | Заявка 7167734 на Buy отправлена с ценой 127995 объемом 1.
10:30:02.310 |            | котирование 4   | Заканчиваем котирование с неисполненным объемом равный 0.
10:30:02.310 |            | котирование 4   | Позиция изменилась на 1.
10:30:02.310 |            | котирование 4   | Заканчиваем котирование с неисполненным объемом равный 0.
10:30:02.310 |            | котирование 4   | Стратегия останавливается.
10:30:02.310 |            | котирование 4   | Заканчиваем котирование с неисполненным объемом равный 0.
10:30:02.310 |            | котирование 4   | Новая Buy сделка 8 по цене 127950 на 1 заявки 7167734.
10:30:02.310 |            | котирование 4   | Стратегия остановлена.
10:30:02.310 |            | котирование 4   | Заканчиваем котирование с неисполненным объемом равный -1.
Camill
Camill Автор

Я кого-нибудь убедил в существовании проблемы, или еще что-то нужно уточнить?

Mikhail Sukhov
Mikhail Sukhov

Camill: Я кого-нибудь убедил в существовании проблемы, или еще что-то нужно уточнить?

Небольшой вопрос. А позиция учитывает стандартно, по заявкам, или по сделкам?

В принципе нашел несколько мест. Так что будем лечить как лечили проблему с позами - в несколько этапов.

kenota
kenota

Я тоже сталкивался с такой проблемой. Только в другом виде: при попытке использования StopLoss и TakeProfit стратегий на бектесте все сходит с ума, потому что выполняется пара ордеров в определенный момент и баланс стратегии нарушается.

Уважаемая команда stocksharp вы можете посмотреть на эту проблему? Или подсказать где нам самим чинить, хотя я думаю что это в закрытой части стокшарпа.

andy_baka_
Camill
Camill Автор

kenota, подсказывайте, конечно. Чем подробнее мы объясним, где искать, тем больше вероятность, что они полезут исправлять.

Mikhail Sukhov
Mikhail Sukhov

Camill: kenota, подсказывайте, конечно. Чем подробнее мы объясним, где искать, тем больше вероятность, что они полезут исправлять.

Полезем смотреть обязательно. Только времени не было. Плюс у меня очередной отпуск на следующей неделе.

зы По котированию надеюсь народ начнет понимать, что если не помогать с простыми задачами (кстати, спасибо вам за помощь по Гидре), то команда S# будет эти простые задачи сама делать. А на сложные руки не дойдут. Вот и получается, что если кому-то не нужна та же самая Гидра, на самом деле она ему нужна, только он об этом еще не знает.😀

Camill
Camill Автор

Mikhail Sukhov: Полезем смотреть обязательно. Только времени не было. Плюс у меня очередной отпуск на следующей неделе. Михаил, да я бы с удовольствием помог, хотя бы в том, что сам использую. Но с котированием - увы - без исходников дебажить это в ассемблере я не смогу. Если времени нет править, то хоть старую версию котирования верните. А то с фактически нерабочим тестированием использовать новую версию невозможно. А если еще и в боевом режиме такие косяки будут, то вообще караул.

Alexander
Alexander

Camill:

Mikhail Sukhov: Полезем смотреть обязательно. Только времени не было. Плюс у меня очередной отпуск на следующей неделе. Михаил, да я бы с удовольствием помог, хотя бы в том, что сам использую. Но с котированием - увы - без исходников дебажить это в ассемблере я не смогу. Если времени нет править, то хоть старую версию котирования верните. А то с фактически нерабочим тестированием использовать новую версию невозможно. А если еще и в боевом режиме такие косяки будут, то вообще караул.

Посмотрите, пожалуйста, когда поднимается событие NewOrder - добавьте вывод этого сообщения в лог.

Camill
Camill Автор

Alexander Mukhanchikov: Посмотрите, пожалуйста, когда поднимается событие NewOrder - добавьте вывод этого сообщения в лог. Если можно, скажите что именно куда добавить. "Регистрация новой заявки" - это разве не оно?

Alexander
Alexander

Camill:

Alexander Mukhanchikov: Посмотрите, пожалуйста, когда поднимается событие NewOrder - добавьте вывод этого сообщения в лог. Если можно, скажите что именно куда добавить. "Регистрация новой заявки" - это разве не оно?

Совсем не оно. Подпишитесь на событие NewOrders у стратегии MQS и добавьте сообщение о id заявки и времени вывода (с милисекундами).

kenota
kenota

А может эта ошибка быть связана с сообщениями о том что заявка не имеет состояния?

Я экспериментировал с демо примером из последней версии стокшарпа, так там через некоторое время он просто зависает, а в логах постоянно появляется сообщение о заявке без состояния, потом, когда срабатывает условие на выставление нового ордера, сообщения начинают чередоваться.

Это возникает в разное время от начала эмуляции.

Явно связано с многопоточностью, увелечиение параметра LoadingThreadCount у EmulationTrader вроде дает шанс получить ошибку еще раньше. То есть чем больше потоков тем больше вероятность наступления. При LoadingThreadCount=1 ошибка все равно проявляется.

Прикладываю скриншот логов о которых я говорю (это сообщение повторяется вечно и ордер никогда не выполняется).

Так же, один раз при тесте, когда я экспериментировал с количеством потоков выскочило окно с эксепшеном (мессадж бокс, то есть кто то его обработал), скрин этого эксепшена прикладываю к сообщению тоже.

Да, единственные изменения от тестового примера у меня это вывод логов в окно и период тестирования с 20 числа, что бы рынок поактивней был.

Есть варианты как это обойти можно? а то не получается стратегию оттестировать на истории вообще :(

Camill
Camill Автор

kenota: через некоторое время он просто зависает Аналогично, моя стратегия тоже зависает где-то после десятка-другого сделок.

Mikhail Sukhov
Mikhail Sukhov

kenota: Явно связано с многопоточностью

Попробуйте EmulationTrader.MarketEmulator установить не ParallelEmulator а Sync.

Camill
Camill Автор

Такой вот код не помог, все равно зависает:

_trader.MarketEmulator = new SyncMarketEmulator(_trader);

esper
esper

Camill: Такой вот код не помог, все равно зависает:

_trader.MarketEmulator = new SyncMarketEmulator(_trader);

Сама стратегия у вас из примера, только окно логов добавлено? Если просто взять стандартный пример ошибка повторяется? Можете выложить ваш проект на котором повторяется ошибка? Какая конфигурация компа, т.е. сколько ядер и памяти?
Camill
Camill Автор

esper: Если просто взять стандартный пример ошибка повторяется? Можете выложить ваш проект на котором повторяется ошибка? Какая конфигурация компа, т.е. сколько ядер и памяти? Пример SampleHistoryTesting, 4 ядра, 16 гигов памяти. На нем проявляются и зависание и дублирование заявок. Мы уже разбирались вчера вечером с Михаилом Суховым, у него ошибка с зависанием повторилась, так что по этому поводу он теперь больше знает. Но пока еще не понятно, возможно, дублирование заявок - это другая ошибка, не связанная с зависанием.

Camill
Camill Автор

Похоже, ошибка исправлена, но стало работать в несколько раз медленнее, и памяти жрать чуть ли не в два раза больше.

Mikhail Sukhov
Mikhail Sukhov

Camill: Похоже, ошибка исправлена, но стало работать в несколько раз медленнее, и памяти жрать чуть ли не в два раза больше.

Обычное в сравнительном приложении в русском языке пишут 2 части. Вторую часть пишут через слово "чем". Собственно, чем что?

Camill
Camill Автор

Mikhail Sukhov: Обычное в сравнительном приложении в русском языке пишут 2 части. Вторую часть пишут через слово "чем". Собственно, чем что? Чем 3.2.11 при прогоне на одинаковой истории с той же стратегией.

Mikhail Sukhov
Mikhail Sukhov

Camill:

Mikhail Sukhov: Обычное в сравнительном приложении в русском языке пишут 2 части. Вторую часть пишут через слово "чем". Собственно, чем что? Чем 3.2.11 при прогоне на одинаковой истории с той же стратегией.

Сейчас проверим по памяти и скорости. Могу только зрительно.

Mikhail Sukhov
Mikhail Sukhov

Может стоит сделать визуально в примере отображение производительности?

kenota
kenota

Camill: Похоже, ошибка исправлена, но стало работать в несколько раз медленнее, и памяти жрать чуть ли не в два раза больше.

А где исправленную версию взять? На codeplex?

Camill
Camill Автор

Проверил на SampleHistoryTesting - запускал по два раза. По времени стало 23:17 и 24:19 против 13:17 и 9:33, а вот по памяти разница небольшая - 1,5 против 1,2.

Camill
Camill Автор

Но на моем проекте прогоняется истории fRTS с 2009 года, и могут быть нюансы с работой GC. По факту посчитались только два года, а съедено уже 8 гигов, раньше было 4-5. Ну и дополнительные тормоза за счет работы свопа появились, видимо.

Mikhail Sukhov
Mikhail Sukhov

Camill: По факту посчитались только два года, а съедено уже 8 гигов, раньше было 4-5.

Ничего не понимаю. Вы пишите, что было 1.2 стало 1.5 гига. Теперь цифры другие, с 4 до 8. Какие цифры правильные?

Camill
Camill Автор

На тестовом примере - 1,5 и 1,2. На моем - 8 и 4.

Mikhail Sukhov
Mikhail Sukhov

Camill: На тестовом примере - 1,5 и 1,2. На моем - 8 и 4.

Тогда нужно смотреть профайлером, что так много кушает у вас. Пример то мало потребляет, а данные все те же генерирует.

Camill
Camill Автор

Пример проходит один фьючерс, а я всю серию, с RIH9 по RIZ1. Скорее всего, где-то утечка памяти. Профайлером пытаться смотреть, но пока не разобрался, как им пользоваться.

И в любом случае, это не может влиять на скорость тестового примера. 16 гигов оперативки ему более чем достаточно. Так что тормоза надо лечить отдельно.

Mikhail Sukhov
Mikhail Sukhov

Camill: Так что тормоза надо лечить отдельно.

Параллельным матчингом.

Camill
Camill Автор

Mikhail Sukhov: Параллельным матчингом. Буду благодарен за пример кода. Нашел в документации ParallelMarketEmulator, но не нашел, куда его надо вписать.

Mikhail Sukhov
Mikhail Sukhov

Camill:

Mikhail Sukhov: Параллельным матчингом. Буду благодарен за пример кода. Нашел в документации ParallelMarketEmulator, но не нашел, куда его надо вписать.

Вы же мне пример присылали, где синхронный устанавливали.

Camill
Camill Автор

Еще один аргумент за утечку - когда я ставил запуск GC в конце каждого дня истории, вылетала ошибка где-то внутри генератора свечей. Попробую повторить, напишу подробнее.

Camill
Camill Автор

И правда. Но подключение параллельного не помголо - те же 25 минут на тестовый пример. Подключал так: ```csharp _trader.MarketEmulator = new ParallelMarketEmulator(_trader);

Mikhail Sukhov
Mikhail Sukhov

Camill: И правда. Но подключение параллельного не помголо - те же 25 минут на тестовый пример. Подключал так: ```csharp _trader.MarketEmulator = new ParallelMarketEmulator(_trader);


Значит это точно не матчинг заявок увеличил время. Свечки используете?
Camill
Camill Автор

Mikhail Sukhov: Значит это точно не матчинг заявок увеличил время. Свечки используете? Конечно. Собственно, я к тестовому примеру со скользящими средними его и подключал.

Mikhail Sukhov
Mikhail Sukhov

Camill:

Mikhail Sukhov: Значит это точно не матчинг заявок увеличил время. Свечки используете? Конечно. Собственно, я к тестовому примеру со скользящими средними его и подключал.

Наверное, они тормозят. Раньше был один алгоритм компрессии, затем другой (опять же, с фиксами). Ничего не поделать, свечки сейчас (да и раньше тоже) самый тормозящий участок в тестировании. Я уже предлагал в Гидре сделать компрессию для ускорения. Не знаю, работает ли.

Camill
Camill Автор

Вроде что-то сделали, но непонятно, как это использовать - ни примера, ни мануала внятного я не видел.

Mikhail Sukhov
Mikhail Sukhov

Camill: Вроде что-то сделали, но непонятно, как это использовать - ни примера, ни мануала внятного я не видел.

Вот такая помощь. К таким помощникам еще парочка помощников нужна.

russ
russ

По поводу проблемы с неработающим котированием, описанной здесь http://stocksharp.com/forum/2129/Nie-rabotaiet-kotirovaniie/

  1. Взял с codeplex версию 4.0.6
  2. К стратегии котирования прикрепил лог

var strategy = new MarketQuotingStrategy(order, new Unit(5), new Unit(5));
var log = new FileLogListener("log" + (count++).ToString() + ".txt");
strategy.Log += new Action<LogMessage>(message => log.WriteMessage(message)); 

В итоге все нормально, но появилось очень много сообщение о том, что в стакан пустой:


00:05:00.000 |            | MQS             | Стратегия запущена.
00:05:00.000 | Warning    | MQS             | Стакан пустой.
00:10:00.000 | Warning    | MQS             | Стакан пустой.
00:15:00.000 | Warning    | MQS             | Стакан пустой.
00:20:00.000 | Warning    | MQS             | Стакан пустой.
00:25:00.000 | Warning    | MQS             | Стакан пустой.
00:30:00.000 | Warning    | MQS             | Стакан пустой.
00:35:00.000 | Warning    | MQS             | Стакан пустой.
00:40:00.000 | Warning    | MQS             | Стакан пустой.
00:45:00.000 | Warning    | MQS             | Стакан пустой.

Лог обрезал т.к. очень длинный, т.е. каждые 5 минут выдается сообщение Стакан Пустой.

23:20:00.000 | Warning    | MQS             | Стакан пустой.
23:25:00.000 | Warning    | MQS             | Стакан пустой.
23:30:00.000 | Warning    | MQS             | Стакан пустой.
23:35:00.000 | Warning    | MQS             | Стакан пустой.
23:40:00.000 | Warning    | MQS             | Стакан пустой.
23:45:00.000 | Warning    | MQS             | Стакан пустой.
23:50:00.000 | Warning    | MQS             | Стакан пустой.
23:55:00.000 | Warning    | MQS             | Стакан пустой.
23:59:59.990 |            | MQS             | Регистрация новой заявки на Buy с ценой 155010 и объемом 1.
23:59:59.990 |            | MQS             | Заявка 52981109 на Buy отправлена с ценой 155010 объемом 1.
00:04:59.990 |            | MQS             | Цена текущей 155010 и лучшей 154965.
00:04:59.990 |            | MQS             | Лучший бид 154960 и лучший аск 155005.
00:04:59.990 |            | MQS             | Котирование заявки 52981109 на Buy с ценой 155010 объемом 1.
00:04:59.990 |            | MQS             | Отмена заявки 52981109.
00:04:59.990 |            | MQS             | Новая Buy сделка 1 по цене 155005 на 1 заявки 52981109.
00:04:59.990 |            | MQS             | Позиция изменилась на 1.
00:04:59.990 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
00:04:59.990 |            | MQS             | Стратегия останавливается.
00:04:59.990 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
00:04:59.990 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
00:04:59.990 |            | MQS             | Заканчиваем котирование с неисполненным объемом равный 0.
00:04:59.990 |            | MQS             | Стратегия остановлена.

Непонятно почему стакан пустой, исходные данные формирую как в примере:


var portfolio = new Portfolio { Name = "test account" };
                    var timeFrame = TimeSpan.FromMinutes(5);
                    var security = new Security
                    {
                        Id = "RIU9@RTS",
                        Code = "RIU9",
                        Name = "RTS-9.09",
                        MinStepSize = 5,
                        MinStepPrice = 2,
                        Decimals = 0,
                        Exchange = Exchange.Test,
                    };
                    
                    _trader = new EmulationTrader(
                    new[] { security },
                    new[] { portfolio })
                        {
                            MarketTimeChangedInterval = timeFrame
                        };

                        _trader.TradeGenerators[security] = new RandomWalkTradeGenerator(security, 155000);

                        _trader.DepthGenerators[security] = new TrendMarketDepthGenerator(security);
kenota
kenota

Забрал последнюю версию из svn, спасибо за исправления, вроде теперь эта часть работает!