Сравнение багов при тестирования 4.1.4 vs. 4.1.5 (commit 19627)

Сравнение багов при тестирования 4.1.4 vs. 4.1.5 (commit 19627)
Atom
02.10.2012
Liberal


В тех поддержку баги уже отправил, но решил написать и здесь. Вдруг кому-нибудь будет полезно.

Все ошибки относятся к тестированию (EmulationTrader)
Сравнение ошибок версий 4.1.4 и 4.1.5 (commit 19627 trunk)

1) ReRgisterOrder в атомарном режиме не работает. Исправлено в 4.1.5.

2) При тестировании на OrderLog неправильно строятся стаканы из OrderLog. В версии 4.1.5 без изменений. (Описание неправильного построения с примерами смотреть ниже)

3) При тестировании на OrderLog события NewOrderLogItems срабатывают нормально. В версии 4.1.5. события NewOrderLogItems перестают срабатывать, но стаканы строятся по OrderLog (хоть и с ошибками – см. пункт 2) ), события MarketDepthChange вызываются.

4) Котирование (MarketQuotingStrategy, тестирование на стаканах, атомарный режим выключен) – непонятные задержки в логе. Например, есть задержка между отправкой заявки на регистрацию и получение сообщения о подтверждении регистрации на бирже (несмотря на то, что EmulationTrader.MarketEmulator.Settings.Latency = = 0). Исправлено в 4.1.5

5) Котирование (MarketQuotingStrategy, тестирование на стаканах, атомарный режим выключен) – в логе постоянно возникают двойные строки об отмене заявки. В версии 4.1.5 без изменений.

6) Видно, что в логах котирования отличается последняя строка, при одной и той же истории стаканов


Лог котирования для версии 4.1.4:

2012.09.13 00:00:00.000| |T_TEST@RTS_SuperProfit|Стратегия запущена.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Стратегия запущена.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Котирование на Buy объема 1.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Приостановка правил. _rulesSuspendCount 1.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Возобновление правил. _rulesSuspendCount 0.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Цена текущей NULL и лучшей 100.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Лучший бид NULL и лучший аск NULL.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Регистрация новой заявки на Buy с ценой 100 и объемом 1.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Заявка 14123657 на Buy отправлена с ценой 100 объемом 1.
2012.09.14 00:00:02.000| |MQS_TEST@RTS_SuperProfit|Заявка 14123657 принята биржей.
2012.09.14 00:00:02.000| |MQS_TEST@RTS_SuperProfit|Сброс счетчика ошибок регистрации с 0 до нуля.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Цена текущей 100 и лучшей 110.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Лучший бид 100 и лучший аск 120.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Котирование заявки 14123657 на Buy с ценой 100 объемом 1.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Отмена заявки 14123657.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Отмена заявки 14123657.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Заявка 14123657 больше не активна.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Заявка 14123657 была снята. Время снятия 14.09.2012 0:01:00.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Цена текущей NULL и лучшей 110.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Лучший бид 110 и лучший аск 130.

Лог котирования для версии 4.1.5:

2012.09.13 00:00:00.000| |T_TEST@RTS_SuperProfit|Стратегия запущена. [0,-1]
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Стратегия запущена. [0,1]
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Котирование на Buy объема 1.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Приостановка правил. _rulesSuspendCount 1.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Возобновление правил. _rulesSuspendCount 0.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Цена текущей NULL и лучшей 100.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Лучший бид NULL и лучший аск NULL.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Регистрация новой заявки на Buy с ценой 100 и объемом 1.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Заявка 19145282 на Buy отправлена с ценой 100 объемом 1.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Заявка 19145282 принята биржей.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Сброс счетчика ошибок регистрации с 0 до нуля.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Цена текущей 100 и лучшей 110.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Лучший бид 100 и лучший аск 120.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Котирование заявки 19145282 на Buy с ценой 100 объемом 1.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Отмена заявки 19145282.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Отмена заявки 19145282.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Заявка 19145282 больше не активна.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Заявка 19145282 была снята. Время снятия 14.09.2012 0:01:00.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Цена текущей NULL и лучшей 110.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Лучший бид 100 и лучший аск 120.




Пример неправильно построения стаканов из лога (EmulationTrader).

1) По событиям NewOrderLogItems видно, что в любой момент времени в стакане должны присутствовать обе котировки, как bid, так и ask. В первом же событие MarketDepthChange котировка ask отсутствует.

2) По событиям NewOrderLogItems видно, что в любой момент времени в стакане объем по цене bid равен объему по цене ask. По событиям MarketDepthChange видно, что при построении стаканов по OrderLog это не соблюдается.

Примечание. Файл истории OrderLog прилагается. OrderLog создан специально для отладки и сохранен через StorageRegistry. Лог создан с тем расчетом, что бы формировать стакан глубиной 1 с неизменными ценами bid и ask, и периодическими сделками по этим ценам.


Логи:

MarketDepthChange:

1) Бид 100 10

2) Бид 100 11\r\nОффер 130 10

3) Бид 100 10\r\nОффер 130 11

4) Бид 100 11\r\nОффер 130 10

5) Бид 100 10\r\nОффер 130 11

NewOrderLogItems:

1)

[0]: {Регистрация заявки 0/10000000 Покупка 100 10 Active 0}
[1]: {Регистрация заявки 0/10000001 Продажа 130 10 Active 0}

2)

[0]: {Регистрация заявки 0/10000002 Покупка 100 1 Active 0}
[1]: {Регистрация заявки 0/10000003 Продажа 130 1 Active 0}

3)

[0]: {Регистрация заявки 0/10000004 Продажа 100 1 Active 0}
[1]: {Сведение заявки 0/10000004 Продажа 100 1 Done 0 на сделку 14.09.2012 0:01:01 1 100 1}
[2]: {Сведение заявки 0/10000002 Покупка 100 1 Done 0 на сделку 14.09.2012 0:01:01 1 100 1}
[3]: {Регистрация заявки 0/10000005 Покупка 130 1 Active 0}
[4]: {Сведение заявки 0/10000005 Покупка 130 1 Done 0 на сделку 14.09.2012 0:01:01 2 130 1}
[5]: {Сведение заявки 0/10000003 Продажа 130 1 Done 0 на сделку 14.09.2012 0:01:01 2 130 1}

4)

[0]: {Регистрация заявки 0/10000006 Покупка 100 1 Active 0}
[1]: {Регистрация заявки 0/10000007 Продажа 130 1 Active 0}

5)

[0]: {Регистрация заявки 0/10000008 Продажа 100 1 Active 0}
[1]: {Сведение заявки 0/10000008 Продажа 100 1 Done 0 на сделку 14.09.2012 0:02:01 3 100 1}
[2]: {Сведение заявки 0/10000006 Покупка 100 1 Done 0 на сделку 14.09.2012 0:02:01 3 100 1}
[3]: {Регистрация заявки 0/10000009 Покупка 130 1 Active 0}
[4]: {Сведение заявки 0/10000009 Покупка 130 1 Done 0 на сделку 14.09.2012 0:02:01 4 130 1}
[5]: {Сведение заявки 0/10000007 Продажа 130 1 Done 0 на сделку 14.09.2012 0:02:01 4 130 1}
TEST1@RTS.zip 927 B (251)


pyhta4og

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


Цитата:
2) При тестировании на OrderLog неправильно строятся стаканы из OrderLog. В версии 4.1.5 без изменений. (Описание неправильного построения с примерами смотреть ниже)
Воспроизвел, пофиксим. благодарю за отличный юнит-тест.
Цитата:
3) При тестировании на OrderLog события NewOrderLogItems срабатывают нормально. В версии 4.1.5. события NewOrderLogItems перестают срабатывать, но стаканы строятся по OrderLog (хоть и с ошибками – см. пункт 2) ), события MarketDepthChange вызываются.
вы имеете в виду что NewOrderLogItems не приходят в стратегию на 4.1.5?
Цитата:

5) Котирование (MarketQuotingStrategy, тестирование на стаканах, атомарный режим выключен) – в логе постоянно возникают двойные строки об отмене заявки. В версии 4.1.5 без изменений.

6) Видно, что в логах котирования отличается последняя строка, при одной и той же истории стаканов, чего не должно быть. (правильный вариан в версии 4.1.4)



Лог котирования для версии 4.1.4:

2012.09.13 00:00:00.000| |T_TEST@RTS_SuperProfit|Стратегия запущена.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Стратегия запущена.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Котирование на Buy объема 1.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Приостановка правил. _rulesSuspendCount 1.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Возобновление правил. _rulesSuspendCount 0.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Цена текущей NULL и лучшей 100.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Лучший бид NULL и лучший аск NULL.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Регистрация новой заявки на Buy с ценой 100 и объемом 1.
2012.09.14 00:00:01.000| |MQS_TEST@RTS_SuperProfit|Заявка 14123657 на Buy отправлена с ценой 100 объемом 1.
2012.09.14 00:00:02.000| |MQS_TEST@RTS_SuperProfit|Заявка 14123657 принята биржей.
2012.09.14 00:00:02.000| |MQS_TEST@RTS_SuperProfit|Сброс счетчика ошибок регистрации с 0 до нуля.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Цена текущей 100 и лучшей 110.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Лучший бид 100 и лучший аск 120.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Котирование заявки 14123657 на Buy с ценой 100 объемом 1.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Отмена заявки 14123657.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Отмена заявки 14123657.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Заявка 14123657 больше не активна.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Заявка 14123657 была снята. Время снятия 14.09.2012 0:01:00.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Цена текущей NULL и лучшей 110.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Лучший бид 110 и лучший аск 130.

Лог котирования для версии 4.1.5:

2012.09.13 00:00:00.000| |T_TEST@RTS_SuperProfit|Стратегия запущена. [0,-1]
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Стратегия запущена. [0,1]
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Котирование на Buy объема 1.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Приостановка правил. _rulesSuspendCount 1.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Возобновление правил. _rulesSuspendCount 0.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Цена текущей NULL и лучшей 100.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Лучший бид NULL и лучший аск NULL.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Регистрация новой заявки на Buy с ценой 100 и объемом 1.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Заявка 19145282 на Buy отправлена с ценой 100 объемом 1.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Заявка 19145282 принята биржей.
2012.09.14 00:00:00.000| |MQS_TEST@RTS_SuperProfit|Сброс счетчика ошибок регистрации с 0 до нуля.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Цена текущей 100 и лучшей 110.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Лучший бид 100 и лучший аск 120.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Котирование заявки 19145282 на Buy с ценой 100 объемом 1.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Отмена заявки 19145282.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Отмена заявки 19145282.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Заявка 19145282 больше не активна.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Заявка 19145282 была снята. Время снятия 14.09.2012 0:01:00.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Цена текущей NULL и лучшей 110.
2012.09.14 00:01:00.000| |MQS_TEST@RTS_SuperProfit|Лучший бид 100 и лучший аск 120.


Вы проводили этот тест на стаканах из вашего синтетического ордерлога бид=100 аск=130? Или на каких данных? Есть ли пример данных такой же как вы прислали для ордерлога?

Спасибо:

Liberal

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


pyhta4og
вы имеете в виду что NewOrderLogItems не приходят в стратегию на 4.1.5?


Да. Вот код стратегии:

Код

class TestStrategy : Strategy 
    {
        protected override void OnStarted()
        {
            Security.WhenMarketDepthChanged().Do(MarketDepthChanged).Apply(this);
            Security.WhenNewOrderLogItems().Do(NewOrderLogItems).Apply(this);
            base.OnStarted();
        }

        protected void NewOrderLogItems(IEnumerable<OrderLogItem> olItems)
        {
            var items = olItems.ToArray();
        }

        protected void MarketDepthChanged(MarketDepth depth)
        {
        
        }
    }



pyhta4og
Вы проводили этот тест на стаканах из вашего синтетического ордерлога бид=100 аск=130? Или на каких данных? Есть ли пример данных такой же как вы прислали для ордерлога?


Котирование тестировал по сохраненной синтетической истории стаканов.
Стаканы постоянной глубины (равной единице), с постоянными объемами bid/ask, постоянной величиной спреда и линейной зависимостью цен bid/ask от времени (номера стакана в истории).

1) T = 0 минут, bid = 100, ask = 120
2) T = 1 минута, bid = 110, ask = 130
3) T = 2 минуты, bid = 120, ask = 140
4) T = 3 минуты, bid = 130, ask = 150
5) ...
и.т.д.
TEST@RTS.zip 3 KB (245)
Спасибо:

FiNick

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


Пробовал строить стаканы из OrderLog с помощью EmulationTrader.
Пока не сделал _trader.RegisterOrderLog(security); вообще стаканов не получал (Почему об этом не написано в документации Стратегии->Тестирование->На истории ?).
Также подтверждаю, MarketDepthChanged вызывается, NewOrderLogItems не вызывается.

Собственно, вопрос: решен ли баг с построением стаканов?

Второй вопрос: можно ли строить стаканы следующим образом:
Код
var mdBuilder = new OrderLogMarketDepthBuilder(new MarketDepth(security));

var olis = storageRegistry.GetOrderLogStorage(security).Load(startTime, stopTime);
foreach(var oli in olis)
{
    marketTime = oli.Order.Time;
    mdBuilder.Update(oli);
}

в этом варианте у меня вылетают ошибка: "Котировка для заданной цены не была найдена. Parameter name: price Actual value was 146500."
сам oli при этом "Снятие заявки 14280459331/9041172530 Покупка Цена=146500 Объем=1 Сост=Done Бал=0".
Т.е. видимо снятие несуществующей заявки. Возможно это либо баги при сохранении ордер лога, и какие-то заявки не сохранились.
Спасибо:

pyhta4og

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


Liberal,
Цитата:

2) При тестировании на OrderLog неправильно строятся стаканы из OrderLog. В версии 4.1.5 без изменений. (Описание неправильного построения с примерами смотреть ниже)


исправлено



Можете проверить?
Спасибо:

FiNick

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


Цитата:
Можете проверить?


Последнюю версию из dev/References брать?

Спасибо:

Alexander

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


FiNick
Цитата:
Можете проверить?


Последнюю версию из dev/References брать?



из транка
Спасибо:

sazon

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


Здравствуйте. Не буду поднимать новую тему. Есть ордер лог на пару дней, хочется на нем протестировать. Гидра , ее последняя версия, его видит, генерирует стаканы.

Пишу следующее:

m_testSecurityList = new List<Security>();
m_testSecurityList.Add(tempSecurity);

m_emulationTrader = new EmulationTrader(
new[] { m_testSecurityList[0] },
new[] { new Portfolio { Name = "TestSmaPortfolio", BeginValue = 1000000 } })
{
MarketTimeChangedInterval = TimeSpan.FromSeconds(1),
StorageRegistry = m_testDataStorage,
MarketEmulator =
{
Settings =
{
UseOrderLog = true,
UseMarketDepth = true,
}
}
};


m_testSecurityList[0].Trader = m_emulationTrader;

m_emulationTrader.RegisterSecurity(m_testSecurityList[0]);
m_emulationTrader.RegisterTrades(m_testSecurityList[0]);
m_emulationTrader.RegisterMarketDepth(m_testSecurityList[0]);
m_emulationTrader.RegisterOrderLog(m_testSecurityList[0]);

m_emulationTrader.NewOrderLogItems += items => NewOrderLogItemsMannual(items);
m_emulationTrader.NewMarketDepths += items => NewMarketDepthMannual(items);
m_emulationTrader.Connect();
m_emulationTrader.StartExport();
m_emulationTrader.Start(m_startDate, m_endDate);

Как результат, MarketTimeChanged бежит, но обработчик изменения стакана и появления ордер-лога не срабатывает. http://stocksharp.com/fo...iie-na-Full-Orders-Log/ - хотя тут все, насколько я понимаю,прекрасно работает. В примерах ничего толком не нашел по этому поводу.
Заранее благодарен за помощь.
Спасибо:


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

loading
clippy