Попытка записать неупорядоченные стаканы.
Atom Ответить
07.12.2012


Помогите советом, пожалуйста! Пытаюсь писать сделки и стаканы с американского рынка через StockSharp API, на лету формирую классы Trade и MarketDepth добавляю их в List и скидываю через IMarketDataStorage.Save. До поры до времени все пишится отлично, но периодически вылазает следующий эксепшн:

System.ArgumentException: Попытка записать неупорядоченные стаканы. (или бывает сделки)
Parameter name: time
at #=qw1XTJ7dV75pMzOz0hBo$siihDG5OZdJczlcSqCrqHeUyxlEsmsAtnXp2udZg_U2NbEZ$ip5_9tsblQGkl18bdw==.#=qlTbzCDxbsFRMhdXeRnHLcA==(List`1 #=qEZ$zSTu6NTimWrkeQ4ymLA==, DateTime #=qLHkFpgenDVQAbq_VEalrLw==, DateTime #=q1YTcmQ0aSkITnw2_u9_JGw==, String #=qRJWXZ_iDXJ5e6CyFySggxw==)
at #=qUW3a2a_zU_oArSSOiBn3FLpJvD1is2zltkAN_lWp2$4QggKmPLesfcTNGEJsfTBj.#=q0XPS289_jbJQep3DL8Cfqg==(List`1 #=qkTgCSAlcZNPcZEy9AZBFuw==, IEnumerable`1 #=qqG_QHQ$oLWGmKV91zoKX7g==, #=qQE3gxfWjLob0eT4xQKg$lvKLXN_F2oep$WGSiQW9e_pG7GggJyb9DKRw7jrVdvBV #=qkKGlqzlXkfX$fJnU2J9jjg==)
at #=qa_4zGoLcsro_feFbb0XM9_BlRhaxasQ1UrzoL3NsS5BLfjz_CcaLI5iqpy27MHoyWvADyOilwiIL8FNu4Ao2ig==.#=qwYoBzTre3Rqwrq$18odFFwAs16vZvPFKnBVlKACndM$R7_7lh23LQejqEr6XeJEHQS6AOtFMS5dX_4$Y7MoiGxjg027VUhTmQo_TuK$K4As=(IEnumerable`1 #=qLQLfos6mvzvB9rAhsnoxLg==, #=qeTDkbpr2eeOjCLO$BGmaYqB0$_0v2N3UDYHi11JN7I8ARwjQbcOqhUBuEc4nnFMw #=qt22VzZuT_VCFx1qqarPCpw==)
at #=qS_z4xglNzrousaCQdLYXkP_IjlUfppl$SeMe0e01sEcma$0uM2ViXhkzPsl2l6xC.#=q7q0eYZRA1iUY6p6r91AwpQ==(DateTime #=qW0qYrpmjZW0WsqbUpkvhew==, #=qFvJvQAioVGQfy_z_Ea6r1A==[] #=qA85ayI68bgFMuLNIN7NzUA==, Boolean #=qdZ$TS2XgaKiLLhbAouszfQ==)
at #=qS_z4xglNzrousaCQdLYXkP_IjlUfppl$SeMe0e01sEcma$0uM2ViXhkzPsl2l6xC.Save(IEnumerable`1 #=qCnHgFcoVHy5SJ3ZvbtahhQ==)
at ArcheClient.MainGUI.frmMain.stakan(Object sender, EventArgs e) in F:\platforms\ArchePro\ISL\ArcheClient.MainGUI\frmMain.cs:line 3407 at #=qw1XTJ7dV75pMzOz0hBo$siihDG5OZdJczlcSqCrqHeUyxlEsmsAtnXp2udZg_U2NbEZ$ip5_9tsblQGkl18bdw==.#=qlTbzCDxbsFRMhdXeRnHLcA==(List`1 #=qEZ$zSTu6NTimWrkeQ4ymLA==, DateTime #=qLHkFpgenDVQAbq_VEalrLw==, DateTime #=q1YTcmQ0aSkITnw2_u9_JGw==, String #=qRJWXZ_iDXJ5e6CyFySggxw==)
at #=qUW3a2a_zU_oArSSOiBn3FLpJvD1is2zltkAN_lWp2$4QggKmPLesfcTNGEJsfTBj.#=q0XPS289_jbJQep3DL8Cfqg==(List`1 #=qkTgCSAlcZNPcZEy9AZBFuw==, IEnumerable`1 #=qqG_QHQ$oLWGmKV91zoKX7g==, #=qQE3gxfWjLob0eT4xQKg$lvKLXN_F2oep$WGSiQW9e_pG7GggJyb9DKRw7jrVdvBV #=qkKGlqzlXkfX$fJnU2J9jjg==)
at #=qa_4zGoLcsro_feFbb0XM9_BlRhaxasQ1UrzoL3NsS5BLfjz_CcaLI5iqpy27MHoyWvADyOilwiIL8FNu4Ao2ig==.#=qwYoBzTre3Rqwrq$18odFFwAs16vZvPFKnBVlKACndM$R7_7lh23LQejqEr6XeJEHQS6AOtFMS5dX_4$Y7MoiGxjg027VUhTmQo_TuK$K4As=(IEnumerable`1 #=qLQLfos6mvzvB9rAhsnoxLg==, #=qeTDkbpr2eeOjCLO$BGmaYqB0$_0v2N3UDYHi11JN7I8ARwjQbcOqhUBuEc4nnFMw #=qt22VzZuT_VCFx1qqarPCpw==)
at #=qS_z4xglNzrousaCQdLYXkP_IjlUfppl$SeMe0e01sEcma$0uM2ViXhkzPsl2l6xC.#=q7q0eYZRA1iUY6p6r91AwpQ==(DateTime #=qW0qYrpmjZW0WsqbUpkvhew==, #=qFvJvQAioVGQfy_z_Ea6r1A==[] #=qA85ayI68bgFMuLNIN7NzUA==, Boolean #=qdZ$TS2XgaKiLLhbAouszfQ==)
at #=qS_z4xglNzrousaCQdLYXkP_IjlUfppl$SeMe0e01sEcma$0uM2ViXhkzPsl2l6xC.Save(IEnumerable`1 #=qCnHgFcoVHy5SJ3ZvbtahhQ==)
at ArcheClient.MainGUI.frmMain.stakan(Object sender, EventArgs e) in F:\platforms\ArchePro\ISL\ArcheClient.MainGUI\frmMain.cs:line 3407


При этом в отладчике специально смотрю лист, время у стаканов или сделок идет по возрастанию. Помогите советом, отчего такой эксепшн может вылазить и как с ним бороться? S# 4.1.6

Теги:


Спасибо:




17 Ответов
Garry

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


Неупорядоченность по времени исключена, сделал необходимую проверку при добавлении данных. Такой же эксепшн вылазает при попытке скачать данные с ФТП РТС и записать данные новой гидрой(4.1.6) в папку с данными от старой гидры(4.1.3). Вот нашел тему на форуме https://stocksharp.ru/fo...Oshibka--Hydra-ver20011/
Автор топика
Спасибо:

Mikhail Sukhov

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


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


А какая проверка?
Спасибо:

Garry

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


Сортировка List по Time для сделок и LastChangeTime для стаканов.
Автор топика
Спасибо:

Mikhail Sukhov

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


Garry Перейти
Сортировка List по Time для сделок и LastChangeTime для стаканов.


Не все так просто. Надо сравнивать не только поступающие данные, но так же и с последней меткой, что записана в файл. И удостоверится, что объекты не изменяются (особенно стаканы).
Спасибо:

Garry

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


Ну то что не изменяются это точно, кроме меня изменить не кому, они ни к чему не привязаны, использую как структуру, заполняю по таймеру, перед добавлением в лист проверяю MarketDepth.Verify(), а вот что по поводу метки в файле, как ее сравнить?
Автор топика
Спасибо:

Mikhail Sukhov

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


Garry Перейти
Ну то что не изменяются это точно, кроме меня изменить не кому, они ни к чему не привязаны, использую как структуру, заполняю по таймеру, перед добавлением в лист проверяю MarketDepth.Verify(), а вот что по поводу метки в файле, как ее сравнить?


Скорее всего самостоятельно где-то запоминать.
Спасибо:

Garry

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


Михаил, такой вопрос, метка ставится при сохранении, непосредственно в файл с данными bin? Как она вычисляется, допустим в коллекции у меня стаканы с временем Нью Йорка, какая будет метка? Время изменения последнего элемента коллекции? Может быть проблема из-за часовых поясов или чего нибудь подобного? Сохранение IMarketDataStorage<TData>.Save идет в отдельном потоке? могут, например, данные не успеть дописаться до конца, а запрошено уже новое сохранение?
Автор топика
Спасибо:

Mikhail Sukhov

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


Garry Перейти
Михаил, такой вопрос, метка ставится при сохранении, непосредственно в файл с данными bin? Как она вычисляется, допустим в коллекции у меня стаканы с временем Нью Йорка, какая будет метка? Время изменения последнего элемента коллекции? Может быть проблема из-за часовых поясов или чего нибудь подобного? Сохранение IMarketDataStorage<TData>.Save идет в отдельном потоке? могут, например, данные не успеть дописаться до конца, а запрошено уже новое сохранение?


Думаю проще всего будет записать блок данных в какое-то промежуточное хранилище, и потом его перегнать в S#. Там быстрее найдете ошибку. Сейчас 3 места: ваш код (я так понял это не Гидра, а следовательно косяков может быть где угодно, и мне можно только гадать об этом), наш код, неправильные данные. Надо сокращать область поиска.
Спасибо:

Garry

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


В упор не могу понять почему выскакивает эксепшн, начал писать по одному стакану, раз в 500 Мс по таймеру. Все отлично: пишется пишется пишется, раз проскочил этот эксепшн, в обработчике эксепшена стакан удаляю, дальше все ок пишется пишется, потом опять эксепшн и т.д. специально скидывал в текстовик время последнего изменения стакана, во времени точно нет ошибки(хотя эксепшн именно об этом) в дебагере сравнивал косячный стакан с предыдущим нормальным никаких отличий, абсолютно одинаковые, стакан собирается вручную раз в 500мс непосредственно перед записью, каждый раз создается новый класс, всегда проверка Verify. В какие еще поля посмотреть стакана(косячного и нормального)? Реально не понимаю что править, хочется записывать америку очень удобный формат для хранения данных, но вот то пишется, то не пишется.
Пример жирным косячный стакан:
14 29 2012 02:29:54:0548
14 29 2012 02:29:55:0688
14 29 2012 02:29:55:0688
14 29 2012 02:29:55:5698
14 29 2012 02:29:56:0829
14 29 2012 02:29:56:5829
Попытка записать неупорядоченные стаканы.
Parameter name: time
14 29 2012 02:29:57:1089
Попытка записать неупорядоченные стаканы.
Parameter name: time
14 29 2012 02:29:57:6120
14 29 2012 02:29:58:7131
14 29 2012 02:29:59:2221
14 29 2012 02:29:59:7301
14 30 2012 02:30:00:2361
14 30 2012 02:30:00:7362
14 30 2012 02:30:01:2502
14 30 2012 02:30:01:7512
14 30 2012 02:30:02:2653
14 30 2012 02:30:02:7693
14 30 2012 02:30:03:2773
14 30 2012 02:30:03:7773
14 30 2012 02:30:04:2914
14 30 2012 02:30:04:7924
14 30 2012 02:30:05:3054
14 30 2012 02:30:05:8065
14 30 2012 02:30:06:3195
Попытка записать неупорядоченные стаканы.
Parameter name: time
14 30 2012 02:30:06:8255
14 30 2012 02:30:07:3335
14 30 2012 02:30:07:8336
Автор топика
Спасибо:

Mikhail Sukhov

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


Garry Перейти
Реально не понимаю что править, хочется записывать америку очень удобный формат для хранения данных, но вот то пишется, то не пишется.


Да причем тут формат. Вы пишите неправильно данные. О чем S# и предупреждает. Ищите ошибку у себя. Ну или пишите данные как есть. Только потом не удивляйтесь, почему эквити на 90 градусов отличается от реального.Laugh

Спасибо:

Garry

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


Я понимаю, что не правильные данные, но не правильные с точки зрения хранилища S#, с моей точки зрения стакан представляет набор бидов и асков, так вот эти данные верны и совпадают с терминалом на 100%. Так вот и прошу наводку куда смотреть то, эксепшн говорит про время, время не причем. Разве функция MarketDeph.Verify не говорит что стакан верный? Я бы и сохранял, как вы говорите, как есть и меня это вполне устраивало, если бы хранилище не ругалось не понятно на что.
Автор топика
Спасибо:

Mikhail Sukhov

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


Garry Перейти
Разве функция MarketDeph.Verify не говорит что стакан верный?


Еще раз. Неправильные не стаканы, а их последовательность. О чем пишет ошибка (по-русски, кстати).
Спасибо:

Garry

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


Mikhail Sukhov Перейти
Garry Перейти
Разве функция MarketDeph.Verify не говорит что стакан верный?


Еще раз. Неправильные не стаканы, а их последовательность. О чем пишет ошибка (по-русски, кстати).


Михаил, в том то и дело я эту последовательность проверяю уже неделю. И нет там ошибки, хоть убей. Я не смог найти никакого другого свойства в MarketDepth кроме как LastChangeTime, которое могло бы определять последовательность, так вот оно совершенно точно идет по возрастанию каждые 500мс и сохранение делал уже по одному стакану, но эксепшн все равно идет. Вопрос лишь в том как правильную последовательность определяет S# API, значит где-то там какой то нюанс или баг, который я не учитываю. Для меня это к сожалению черный ящик, рефлектором лазил, пытался посмотреть этот эксепшн, току мало, код обфусцирован. Вот я и задаю эти вопросы и пытаюсь уточнить как правильная последовательность определяется, если не по LastChangeTime(в нем то точно все ок).

Автор топика
Спасибо:

Mikhail Sukhov

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


Garry Перейти

Михаил, в том то и дело я эту последовательность проверяю уже неделю. И нет там ошибки, хоть убей.


https://stocksharp.ru/posts/m/22917/
Спасибо:

Garry

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


Помогите, кто может советом, совсем я запутался. Ту проблему так и не решил, ну думал как то не так стаканы собираю или еще что, но вот теперь опять столкнулся. Переписываю все свое добро для рос рынка под PlazaTrader, нужно писать стаканы но с дискретностью 500мс, а не на каждом изменении(в квике просто делал соответствующую настройку DDE вывода и все работало отлично). Тут пишу по таймеру System.Timers.Timer рах в 500мс следующий код:
public PlazaTrader Trader;
MarketDataBuffer<StockSharp.BusinessEntities.MarketDepth> tldict = new MarketDataBuffer<StockSharp.BusinessEntities.MarketDepth>();
Dictionary<Security, IMarketDataStorage> stordict = new Dictionary<Security, IMarketDataStorage>();
.......

public void stakan_vivod(Object sender, System.Timers.ElapsedEventArgs e)
{
foreach (Security sec in this.Trader.RegisteredMarketDepths)
{
var depth = sec.GetMarketDepth();
if (depth.Count > 0 && depth.Depth > 0)
{
tldict.Add(sec, depth.Clone());
counter++;
}
if (counter > 120)
{
foreach (KeyValuePair<Security, IEnumerable<MarketDepth>> kvp in tldict.Get())
{
stordict[kvp.Key].Save(kvp.Value);
}
counter = 0;
}
}
}

Все отлично работает час, два, три стаканы пишутся, и тут раз и проскакивает этот эксепшн, т.е. он не постоянен(раз в 2-3 часа). Из-за чего? если ошибка в коде, то почему 3 часа исправно пишутся стаканы? да и проверку добавлял по LastChangeTime(добавлять стакан, только если оно больше) не помогает, т.е. до момента stordict[kvp.Key].Save(kvp.Value); стаканы точно доходят упорядоченные. Может таймер для записи не подходит? тогда как правильно писать? IMarketDataStorage, к сожалению для меня черный ящик, на ум приходит только какие то проблемы с потоками, например что-то где то не успевает дописаться.
Автор топика
Спасибо:

Mikhail Sukhov

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


Мои рекомендации не помогли или не были поняты?
Спасибо:

Garry

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


Mikhail Sukhov Перейти
Мои рекомендации не помогли или не были поняты?


Скорее были не поняты.
Автор топика
Спасибо:


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

loading
clippy