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


В версии 4.4.17 не активируется событие NewTrade на истории в примере SampleHistoryTesting
Atom Ответить
06.02.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)



Спасибо:




11 Ответов
yanker

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


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

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

Mikhail Sukhov

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


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

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

Sun_Storm

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


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

Sun_Storm

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


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

Sun_Storm

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


Ну в общем, в причинах ошибки с событиями разобрался:
Обработка сообщения 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).
То есть надо во всех файлах, где выходит ошибка, вручную поменять эту ссылку. Но, хотя бы, собралось и работает.
Автор топика
Спасибо:

Sun_Storm

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


Итак, что я ещё понял:
Во время подписки на получение данных (\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;


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

nik

Фотография
Курсы
Дата: 16.02.2020
Ответить


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

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

Sun_Storm

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


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

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


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

Dima

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


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

nik

Фотография
Курсы
Дата: 19.02.2020
Ответить


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

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

Dima

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


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

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

Спасибо!
Спасибо:


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

loading
clippy