В версии 4.4.17 не активируется событие NewTrade на истории в примере SampleHistoryTesting


В версии 4.4.17 не активируется событие NewTrade на истории в примере SampleHistoryTesting
Atom Reply
2/6/2020


Здравствуйте.

Скачал себе версию 4.4.17 и сразу столкнулся с такой проблемой - не могу подписаться на события получения новых сделок и стаканов на истории.
Для примера возьмем SampleHistoryTesting из папки с новой версией.
Добавим в файл SmaStrategy.cs следующий код:

protected override void OnStarted()
{
...
Security.WhenNewTrade(Connector).Do(NewTrade).Apply(this);
...
}

private void NewTrade(Trade trade)
{
this.AddInfoLog("NewTrade worked");
}

При этом в функцию NewTrade программа не заходит.

Если мы проделаем аналогичные действия в версии 4.4.16, то NewTrade будет корректно отрабатываться.

Ниже приложу логи сначала с 4.4.17, потом с 4.4.16.

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

Вот пример различия логов:
4.4.16:
2020/02/06 00:01:55.472|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(Tick),Sec=S#:RIZ2@FORTS, Native:,Type:,Ord=/0/0,Fail=,Price=0,OrdVol=,TrVol=1,Bal=,TId=638153759,Pf=,TPrice=146520,UId=,State=
2020/02/06 00:01:55.472|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=S#:RIZ2@FORTS, Native:,Type:,Ord=/0/0,Fail=,Price=146520,OrdVol=13,TrVol=,Bal=12,TId=,Pf=,TPrice=,UId=,State=
2020/02/06 00:01:55.472|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=S#:RIZ2@FORTS, Native:,Type:,Ord=/0/0,Fail=,Price=146520,OrdVol=1,TrVol=,Bal=1,TId=,Pf=,TPrice=,UId=,State=
2020/02/06 00:01:55.472|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=S#:RIZ2@FORTS, Native:,Type:,Ord=/0/0,Fail=,Price=146522,OrdVol=1,TrVol=,Bal=1,TId=,Pf=,TPrice=,UId=,State=
2020/02/06 00:01:55.472|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=S#:RIZ2@FORTS, Native:,Type:,Ord=/0/0,Fail=,Price=146600,OrdVol=121,TrVol=,Bal=,TId=,Pf=,TPrice=,UId=,State=
2012/10/01 10:00:00.000|Debug |SS_RIZ2@FORTS_test account|Правило 'Новые сделки инструмента RIZ2@FORTS (0xA51251)'. Активация.
2012/10/01 10:00:00.000| |SS_RIZ2@FORTS_test account|NewTrade worked
2020/02/06 00:01:55.472|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(Tick),Sec=S#:RIZ2@FORTS, Native:,Type:,Ord=/0/0,Fail=,Price=0,OrdVol=,TrVol=1,Bal=,TId=638153760,Pf=,TPrice=146520,UId=,State=
2020/02/06 00:01:55.472|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=S#:RIZ2@FORTS, Native:,Type:,Ord=/0/0,Fail=,Price=146520,OrdVol=65,TrVol=,Bal=65,TId=,Pf=,TPrice=,UId=,State=
2020/02/06 00:01:55.472|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=S#:RIZ2@FORTS, Native:,Type:,Ord=/0/0,Fail=,Price=146520,OrdVol=1,TrVol=,Bal=1,TId=,Pf=,TPrice=,UId=,State=
2020/02/06 00:01:55.472|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=S#:RIZ2@FORTS, Native:,Type:,Ord=/0/0,Fail=,Price=146592,OrdVol=2,TrVol=,Bal=,TId=,Pf=,TPrice=,UId=,State=
2012/10/01 10:00:00.000|Debug |SS_RIZ2@FORTS_test account|Правило 'Новые сделки инструмента RIZ2@FORTS (0xA51251)'. Активация.
2012/10/01 10:00:00.000| |SS_RIZ2@FORTS_test account|NewTrade worked

4.4.17:
020/02/05 23:55:55.134|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(Tick),Sec=RIZ2@FORTS,O/T=False/False,Ord=/0/0,Fail=,Price=0,OrdVol=,TrVol=1,Bal=,TId=638153759,Pf=,TPrice=146520,UId=,State=,Cond=
2020/02/05 23:55:55.134|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=RIZ2@FORTS,O/T=False/False,Ord=/0/0,Fail=,Price=146520,OrdVol=20,TrVol=,Bal=19,TId=,Pf=,TPrice=,UId=,State=,Cond=
2020/02/05 23:55:55.134|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=RIZ2@FORTS,O/T=False/False,Ord=/0/0,Fail=,Price=146520,OrdVol=1,TrVol=,Bal=1,TId=,Pf=,TPrice=,UId=,State=,Cond=
2020/02/05 23:55:55.134|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=RIZ2@FORTS,O/T=False/False,Ord=/0/0,Fail=,Price=146522,OrdVol=1,TrVol=,Bal=1,TId=,Pf=,TPrice=,UId=,State=,Cond=
2020/02/05 23:55:55.134|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=RIZ2@FORTS,O/T=False/False,Ord=/0/0,Fail=,Price=146600,OrdVol=147,TrVol=,Bal=,TId=,Pf=,TPrice=,UId=,State=,Cond=
2020/02/05 23:55:55.134|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(Tick),Sec=RIZ2@FORTS,O/T=False/False,Ord=/0/0,Fail=,Price=0,OrdVol=,TrVol=1,Bal=,TId=638153760,Pf=,TPrice=146520,UId=,State=,Cond=
2020/02/05 23:55:55.134|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=RIZ2@FORTS,O/T=False/False,Ord=/0/0,Fail=,Price=146520,OrdVol=68,TrVol=,Bal=68,TId=,Pf=,TPrice=,UId=,State=,Cond=
2020/02/05 23:55:55.134|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=RIZ2@FORTS,O/T=False/False,Ord=/0/0,Fail=,Price=146520,OrdVol=1,TrVol=,Bal=1,TId=,Pf=,TPrice=,UId=,State=,Cond=
2020/02/05 23:55:55.134|Debug |SecurityMarketEmulator| --> Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(OrderLog),Sec=RIZ2@FORTS,O/T=False/False,Ord=/0/0,Fail=,Price=146592,OrdVol=2,TrVol=,Bal=,TId=,Pf=,TPrice=,UId=,State=,Cond=

PS: Отредактировал сообщение. В самом сообщении вначале перепутал, какой лог от 4.4.16, а какой от 17
sample.log 49.6MB (1) sample.log 37.6MB (0)



Thanks:




11 Answers
yanker

Avatar
Date: 2/6/2020
Reply


А также:
1. свечи не строятся из тиков
2. Событие WhenCandlesFinished возвращает свечу из будущего. Т.е, например, текущее время коннектора 12:00:00, а свеча приходит с временем открытия 12:00:00 и закрытия 12:05:00. Эта ошибка уже очень давно, с версии 4.4.14 точно. Раньше обходилась генерацией свечей из тиков. А сейчас даже это перестало работать.
3. Не обновляются данные инструментов в коннекторе. Видно, что сообщения по тикам приходят в коннектор (NewMessage срабатывает), но все инструменты внутри коннектора пустые - биды, аски, объемы, времена и тд.

Коннектор по истории просто пуляет готовые свечи из будущего, при создании заявки она не исполняется, т.к. нет цен по инструментам, как тестировать стратегии, непонятно...
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 2/6/2020
Reply


Спасибо за информацию. Посмотрим, но не так быстро (если, конечно, это не ошибка пользовательского кода, в том числе и самого примера).

Желание самим разобраться совсем нет? ) Исходники на ГитХаб в полном объеме лежат (тестер, хранилище, стратегии, алгоритмы).
Thanks:

Sun_Storm

Avatar
Date: 2/6/2020
Reply


Я уже близок к разгадке. Сейчас на этапе, когда переопределил метод OnSendInMessage из HistoryMessageAdapter, и начал отлаживать, что там происходит на тиках. Думаю, где-то там пойму, что происходит. Но, скорее всего, продолжу уже завтра.
Topic starter
Thanks:

Sun_Storm

Avatar
Date: 2/8/2020
Reply


В общем, в лоб проблему решить не так просто, а собрать S# с гитхаба не представляется возможным. Вылезают ошибки с отсутствием ссылок на DevExpress.Xpf.PropertyGrid.v18.1.
Ели получилось собрать версию из исходных котов 16 версии, хотя бы посмотрел, по какой логике всё должно работать.
Попробую ещё подумать, как отлаживать вызовы сообщений коннектора.
Topic starter
Thanks:

Sun_Storm

Avatar
Date: 2/8/2020
Reply


Ну в общем, в причинах ошибки с событиями разобрался:
Обработка сообщения Execution вида Tick идет следующим образом:
Connector_ProcessMessage.ProcessExecutionMessage -> ... ProcessTradeMessage
Далее попадаем на строчку
if (!RaiseReceived(tuple.Item1, message, TickTradeReceived))
return;
Которая выполняется, то есть RaiseReceived возвращает false.
Делает он это потому, что в RaiseReceived выполняются действия:
...
foreach (var subscription in _subscriptionManager.GetSubscriptions(message))
...
_subscriptionManager.GetSubscriptions(message) возвращает пустой список из-за строчки
foreach (var id in message.GetSubscriptionIds())
GetSubscriptionIds возвращает пустой спискок, так как он пытается получить ID подписки из самого сообщения:

if (message.SubscriptionIds != null)
return message.SubscriptionIds;
else if (message.SubscriptionId > 0)
return new[] { message.SubscriptionId };
else
return ArrayHelper.Empty<long>();

Выполняется строчка return new[] { message.SubscriptionId };
А в объекте message, по крайней мере на истории, идентификатор подписки не присутствует, то есть message.SubscriptionId = null.
Вот пример строчки сообщения: Execution,T(L)=2012.10.01 10:00:00.000,T(S)=2012.10.01 10:00:00.000,(Tick),Sec=RIZ2@FORTS,O/T=False/False,Ord=/0/0,Fail=,Price=0,OrdVol=,TrVol=2,Bal=,TId=638153705,Pf=,TPrice=147210,UId=,State=,Cond=
Где там должен быть SubscriptionId, я не знаю.

Таким образом. Либо в том месте, где создаются эти сообщения Execution, им должно дописываться поле SubscriptionIds или SubscriptionId, либо там, где эти сообщения проверяются, в _subscriptionManager.GetSubscriptions(message), как-то должны определяться подписки сообщения по-другому.

PS. Сборку СтокШарпа с Гит хаба я всё же собрал, но из тестового примера пришлось выпилить всё, что связано с графиками, так как файлы StockSharp.Xaml.dll и/или StockSharp.Xaml.Charting.dll некорректные пытаются искать ссылку на сборку DevExpress версии v18.1.

Что делать, чтобы оживить версию 4.4.17 у себя пока не знаю, сборка с Гит хаба полностью не рабочая, а ночная сборка без исходных кодов.
4.4.16 я тоже собрал с трудом из исходных кодов, там есть проблемы в некоторых файлах *GitHub.csproj, а именно вместо ссылки зависимости на файл StockSharp.Xaml в файле проекта (Include="StockSharp.Xaml">) добавляются ссылки на Xaml из проекта (Include="..\..\..\..\StockSharpApps\Xaml\Xaml.csproj).
То есть надо во всех файлах, где выходит ошибка, вручную поменять эту ссылку. Но, хотя бы, собралось и работает.
Topic starter
Thanks:

Sun_Storm

Avatar
Date: 2/9/2020
Reply


Итак, что я ещё понял:
Во время подписки на получение данных (\Algo\SubscriptionMessageAdapter.cs ProcessInSubscriptionMessage), если подписка историческая (?) - то есть, если message.To != null, то подписка работает немного по другой логике:
Заполняется коллекция _historicalRequests, но совсем не заполняется коллекция _subscriptionsByKey, а если она заполняться не будет, то не работать получение событий по этой подписке.
Так же в момент получения сообщения (\Algo\Connector_Raise.cs RaiseReceived) проверяется, чтобы подписка была SubscriptionStates.Online, а при запуске тестирования, наша подписка устанавливается в состояние SubscriptionStates.Active.

Так, я восстановил возможность тестирования на истории таким образом:
в \Algo\SubscriptionMessageAdapter.cs ProcessInSubscriptionMessage в ветку else if (message.To != null) скопировал весь код из ветки else.
в \Algo\Connector_Raise.cs RaiseReceived добавил код
Код

if (!anyOnline && subscription.State == SubscriptionStates.Active &&((Message)message).Adapter.GetType() == Type.GetType("StockSharp.Algo.Testing.HistoryMessageAdapter"))
anyOnline = true;


Это восстановит тестирование (не знаю в какой мере, по крайней мере события будут приходить), но, уверен, что-то сломает в другом месте. Я не настолько понял логику работы этих сообщений, чтобы понять, как добавить корректно обработку ситуации для тестирования на истории.
Topic starter
Thanks: Mikhail Sukhov nik

nik

Avatar
Training
Date: 2/16/2020
Reply


Sun_Storm Перейти
В общем, в лоб проблему решить не так просто, а собрать S# с гитхаба не представляется возможным. Вылезают ошибки с отсутствием ссылок на DevExpress.Xpf.PropertyGrid.v18.1.
Ели получилось собрать версию из исходных котов 16 версии, хотя бы посмотрел, по какой логике всё должно работать.
Попробую ещё подумать, как отлаживать вызовы сообщений коннектора.

Я эту проблему решил простым подсовыванием файлов (Stocksharp.xaml*) из ночной сборки в папку reference проекта.
Thanks:

Sun_Storm

Avatar
Date: 2/19/2020
Reply


nik Перейти
Sun_Storm Перейти
В общем, в лоб проблему решить не так просто, а собрать S# с гитхаба не представляется возможным. Вылезают ошибки с отсутствием ссылок на DevExpress.Xpf.PropertyGrid.v18.1.
Ели получилось собрать версию из исходных котов 16 версии, хотя бы посмотрел, по какой логике всё должно работать.
Попробую ещё подумать, как отлаживать вызовы сообщений коннектора.

Я эту проблему решил простым подсовыванием файлов (Stocksharp.xaml*) из ночной сборки в папку reference проекта.


Я пробовал так делать.
У меня он ругался на что-то другое, какая-то ошибка, содержащая в себе текст с версией 4.4.17.0, я так понял, он где-то на версию проверяет. В общем у меня почему-то не заработало. Сейчас уже не помню. В итоге 4.4.17 решил пока не использовать.
Topic starter
Thanks: nik

Dima

Avatar
Date: 2/19/2020
Reply


А где вы скачали версию 4.4.17? Найти нигде не могу. Везде только 4.4.16. Просто в 16 версии не могу найти StockSharp.BusinessEntities.dll
Thanks:

nik

Avatar
Training
Date: 2/19/2020
Reply


Dima Перейти
А где вы скачали версию 4.4.17? Найти нигде не могу. Везде только 4.4.16. Просто в 16 версии не могу найти StockSharp.BusinessEntities.dll

Все скачивается по ссылке ночной сборки из раздела https://stocksharp.ru/products/download/
Thanks:

Dima

Avatar
Date: 2/19/2020
Reply


nik Перейти
Dima Перейти
А где вы скачали версию 4.4.17? Найти нигде не могу. Везде только 4.4.16. Просто в 16 версии не могу найти StockSharp.BusinessEntities.dll

Все скачивается по ссылке ночной сборки из раздела https://stocksharp.ru/products/download/

Спасибо!
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy