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


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


Проблема проявляется даже стандартном примере SampleHistoryTesting. Для обнаружения в OnProcess достаточно добавить
Код
if (Math.Abs(PositionManager.Position) > Volume)
  throw new Exception("Неверное состояние - поза превышает рабочий объем.");

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

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

Теги:


Спасибо:




52 Ответов
1 2 3  >
Alexander

Фотография
Дата: 10.11.2011
Ответить


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

Camill

Фотография
Дата: 10.11.2011
Ответить


Код
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

Фотография
Дата: 10.11.2011
Ответить


Для сравнения, тот же пример из версии 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

Фотография
Дата: 10.11.2011
Ответить


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

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

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

Camill

Фотография
Дата: 10.11.2011
Ответить


Да, версия вчерашняя, ревизия 11491.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 10.11.2011
Ответить


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


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

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

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

Camill

Фотография
Дата: 10.11.2011
Ответить


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

Фотография
Дата: 10.11.2011
Ответить


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


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 10.11.2011
Ответить


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


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


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

Camill

Фотография
Дата: 10.11.2011
Ответить


Mikhail Sukhov Перейти
Вы уверены, что параллельно не запущены несколько котирований?

Специально цеплял логирование на конкретную стратегию котирования - результат чуть выше.
Так что уверен.
Автор топика
Спасибо:

Camill

Фотография
Дата: 10.11.2011
Ответить


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

Код

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

Фотография
Дата: 10.11.2011
Ответить


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

Код
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

Фотография
Дата: 11.11.2011
Ответить


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

kenota

Фотография
Дата: 12.11.2011
Ответить


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

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

Camill

Фотография
Дата: 12.11.2011
Ответить


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 13.11.2011
Ответить


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


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

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

Camill

Фотография
Дата: 13.11.2011
Ответить


Mikhail Sukhov Перейти

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

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

Alexander

Фотография
Дата: 13.11.2011
Ответить


Camill Перейти
Mikhail Sukhov Перейти

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

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



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

Camill

Фотография
Дата: 13.11.2011
Ответить


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

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

Alexander

Фотография
Дата: 13.11.2011
Ответить


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

Если можно, скажите что именно куда добавить. "Регистрация новой заявки" - это разве не оно?


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 15.11.2011
Ответить


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


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

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

kenota

Фотография
Дата: 16.11.2011
Ответить


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

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

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

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

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

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

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

Есть варианты как это обойти можно? а то не получается стратегию оттестировать на истории вообще :(
exception.png 28,4KB (0) orderFail.png 144,8KB (0)
Спасибо:

Camill

Фотография
Дата: 16.11.2011
Ответить


kenota Перейти
через некоторое время он просто зависает

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 16.11.2011
Ответить


kenota Перейти
Явно связано с многопоточностью


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

Camill

Фотография
Дата: 16.11.2011
Ответить


Такой вот код не помог, все равно зависает:
Код
_trader.MarketEmulator = new SyncMarketEmulator(_trader);
Автор топика
Спасибо:
1 2 3  >

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy