Помогите советом, пожалуйста! Пытаюсь писать сделки и стаканы с американского рынка через StockSharp API, на лету формирую классы Trade и MarketDepth добавляю их в List и скидываю через IMarketDataStorage.Save. До поры до времени все пишится отлично, но периодически вылазает следующий эксепшн:
System.ArgumentException: Попытка записать неупорядоченные стаканы. (или бывает сделки)
Parameter name: time
at #=qw1XTJ7dV75pMzOz0hBo$siihDG5OZdJczlcSqCrqHeUyxlEsmsAtnXp2udZg_U2NbEZ$ip5_9tsblQGkl18bdw==.#=qlTbzCDxbsFRMhdXeRnHLcA==(List1 #=qEZ$zSTu6NTimWrkeQ4ymLA==, DateTime #=qLHkFpgenDVQAbq_VEalrLw==, DateTime #=q1YTcmQ0aSkITnw2_u9_JGw==, String #=qRJWXZ_iDXJ5e6CyFySggxw==) at #=qUW3a2a_zU_oArSSOiBn3FLpJvD1is2zltkAN_lWp2$4QggKmPLesfcTNGEJsfTBj.#=q0XPS289_jbJQep3DL8Cfqg==(List1 #=qkTgCSAlcZNPcZEy9AZBFuw==, IEnumerable1 #=qqG_QHQ$oLWGmKV91zoKX7g==, #=qQE3gxfWjLob0eT4xQKg$lvKLXN_F2oep$WGSiQW9e_pG7GggJyb9DKRw7jrVdvBV #=qkKGlqzlXkfX$fJnU2J9jjg==) at #=qa_4zGoLcsro_feFbb0XM9_BlRhaxasQ1UrzoL3NsS5BLfjz_CcaLI5iqpy27MHoyWvADyOilwiIL8FNu4Ao2ig==.#=qwYoBzTre3Rqwrq$18odFFwAs16vZvPFKnBVlKACndM$R7_7lh23LQejqEr6XeJEHQS6AOtFMS5dX_4$Y7MoiGxjg027VUhTmQo_TuK$K4As=(IEnumerable1 #=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(IEnumerable1 #=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==(List1 #=qEZ$zSTu6NTimWrkeQ4ymLA==, DateTime #=qLHkFpgenDVQAbq_VEalrLw==, DateTime #=q1YTcmQ0aSkITnw2_u9_JGw==, String #=qRJWXZ_iDXJ5e6CyFySggxw==)
at #=qUW3a2a_zU_oArSSOiBn3FLpJvD1is2zltkAN_lWp2$4QggKmPLesfcTNGEJsfTBj.#=q0XPS289_jbJQep3DL8Cfqg==(List1 #=qkTgCSAlcZNPcZEy9AZBFuw==, IEnumerable1 #=qqG_QHQ$oLWGmKV91zoKX7g==, #=qQE3gxfWjLob0eT4xQKg$lvKLXN_F2oep$WGSiQW9e_pG7GggJyb9DKRw7jrVdvBV #=qkKGlqzlXkfX$fJnU2J9jjg==)
at #=qa_4zGoLcsro_feFbb0XM9_BlRhaxasQ1UrzoL3NsS5BLfjz_CcaLI5iqpy27MHoyWvADyOilwiIL8FNu4Ao2ig==.#=qwYoBzTre3Rqwrq$18odFFwAs16vZvPFKnBVlKACndM$R7_7lh23LQejqEr6XeJEHQS6AOtFMS5dX_4$Y7MoiGxjg027VUhTmQo_TuK$K4As=(IEnumerable1 #=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(IEnumerable1 #=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)
ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください
Неупорядоченность по времени исключена, сделал необходимую проверку при добавлении данных. Такой же эксепшн вылазает при попытке скачать данные с ФТП РТС и записать данные новой гидрой(4.1.6) в папку с данными от старой гидры(4.1.3). Вот нашел тему на форуме http://stocksharp.com/forum/3089/Oshibka--Hydra-ver20011/
А какая проверка?
Сортировка List по Time для сделок и LastChangeTime для стаканов.
Не все так просто. Надо сравнивать не только поступающие данные, но так же и с последней меткой, что записана в файл. И удостоверится, что объекты не изменяются (особенно стаканы).
Ну то что не изменяются это точно, кроме меня изменить не кому, они ни к чему не привязаны, использую как структуру, заполняю по таймеру, перед добавлением в лист проверяю MarketDepth.Verify(), а вот что по поводу метки в файле, как ее сравнить?
Скорее всего самостоятельно где-то запоминать.
Михаил, такой вопрос, метка ставится при сохранении, непосредственно в файл с данными bin? Как она вычисляется, допустим в коллекции у меня стаканы с временем Нью Йорка, какая будет метка? Время изменения последнего элемента коллекции? Может быть проблема из-за часовых поясов или чего нибудь подобного? Сохранение IMarketDataStorage<TData>.Save идет в отдельном потоке? могут, например, данные не успеть дописаться до конца, а запрошено уже новое сохранение?
Думаю проще всего будет записать блок данных в какое-то промежуточное хранилище, и потом его перегнать в S#. Там быстрее найдете ошибку. Сейчас 3 места: ваш код (я так понял это не Гидра, а следовательно косяков может быть где угодно, и мне можно только гадать об этом), наш код, неправильные данные. Надо сокращать область поиска.
В упор не могу понять почему выскакивает эксепшн, начал писать по одному стакану, раз в 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
Да причем тут формат. Вы пишите неправильно данные. О чем S# и предупреждает. Ищите ошибку у себя. Ну или пишите данные как есть. Только потом не удивляйтесь, почему эквити на 90 градусов отличается от реального.😂
Я понимаю, что не правильные данные, но не правильные с точки зрения хранилища S#, с моей точки зрения стакан представляет набор бидов и асков, так вот эти данные верны и совпадают с терминалом на 100%. Так вот и прошу наводку куда смотреть то, эксепшн говорит про время, время не причем. Разве функция MarketDeph.Verify не говорит что стакан верный? Я бы и сохранял, как вы говорите, как есть и меня это вполне устраивало, если бы хранилище не ругалось не понятно на что.
Еще раз. Неправильные не стаканы, а их последовательность. О чем пишет ошибка (по-русски, кстати).
Михаил, в том то и дело я эту последовательность проверяю уже неделю. И нет там ошибки, хоть убей. Я не смог найти никакого другого свойства в MarketDepth кроме как LastChangeTime, которое могло бы определять последовательность, так вот оно совершенно точно идет по возрастанию каждые 500мс и сохранение делал уже по одному стакану, но эксепшн все равно идет. Вопрос лишь в том как правильную последовательность определяет S# API, значит где-то там какой то нюанс или баг, который я не учитываю. Для меня это к сожалению черный ящик, рефлектором лазил, пытался посмотреть этот эксепшн, току мало, код обфусцирован. Вот я и задаю эти вопросы и пытаюсь уточнить как правильная последовательность определяется, если не по LastChangeTime(в нем то точно все ок).
http://stocksharp.com/posts/m/22917/
Помогите, кто может советом, совсем я запутался. Ту проблему так и не решил, ну думал как то не так стаканы собираю или еще что, но вот теперь опять столкнулся. Переписываю все свое добро для рос рынка под 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>(); .......
Все отлично работает час, два, три стаканы пишутся, и тут раз и проскакивает этот эксепшн, т.е. он не постоянен(раз в 2-3 часа). Из-за чего? если ошибка в коде, то почему 3 часа исправно пишутся стаканы? да и проверку добавлял по LastChangeTime(добавлять стакан, только если оно больше) не помогает, т.е. до момента stordict[kvp.Key].Save(kvp.Value); стаканы точно доходят упорядоченные. Может таймер для записи не подходит? тогда как правильно писать? IMarketDataStorage, к сожалению для меня черный ящик, на ум приходит только какие то проблемы с потоками, например что-то где то не успевает дописаться.
Мои рекомендации не помогли или не были поняты?
Скорее были не поняты.