← Zurück

Exception: Лучший бид больше или равен лучшему офферу

Quik 13:56:10.7069351 System.ArgumentException: Лучший бид 157985 больше или равен лучшему офферу 157980. Имя параметра: depths в #=qw1XTJ7dV75pMzOz0hBo$siihDG5OZdJczlcSqCrqHeW9oeTyyyg2z_7_I_sdd8zP.OnSave(List1 #=qHt7Kciyn5dIQU9bM1p8X6A==, IEnumerable1 #=qWN5vLK9lgnuirNLbwKPXEQ==, DateTime #=qKKv4d0DmzYEe_LwI_ZTphg==, #=qgSOV1vXH9QyFDywKzjytlUKtRfBvlDa$lfa1pqF_C53vfXDOQ1XxQKKwFTI8v3b1 #=qZLgnP865s$8zaZAaVaUHkw==) в #=qYHpTVY2S45tYaMYO2yPLP0Kwx4gEDfz9gCrc15vsqp2yDFNlUoPV9z$CnkxhiFm_.#=qLylBwxWKZJxUOHK9AhQfJg==(DateTime #=qYJ4ET8pqjhGXfYJzJxL7WA==, IEnumerable1 #=qc5Kcj8dkw_HrZhkiXNAARw==, Boolean #=qCYaiWtpxLFpeKOuk9WIa0g==) в #=qYHpTVY2S45tYaMYO2yPLP0Kwx4gEDfz9gCrc15vsqp2yDFNlUoPV9z$CnkxhiFm_.Save(IEnumerable1 #=qWRtxCXnEO09I0nh9jQVyCg==) в StockSharp.Hydra.Worker.<>c__DisplayClass16.<Download>b__10(IMarketDataSource source) в E:\StockSharpReleases\StockSharp_3.2.11\Hydra\Hydra\Worker.cs:строка 210 Начало периодически выскакивать в 3.2.11...

War dieses Thema hilfreich?

Thema teilen

Kommentare (33)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

XMbIPb: Начало периодически выскакивать в 3.2.11...

А чем стаканы пишите?

XMbIPb
XMbIPb Autor

Гидрой.. только что заметил, что у меня экспорт остановился после этой ошибки.. теперь дыра будет.. как попроще сделать чтоб гидра сигнализировала(отправляла sms,email или пищала хотя бы) в такой ситуации?

Mikhail Sukhov
Mikhail Sukhov

XMbIPb: Гидрой..

Гидра данные откуда берет?

XMbIPb: только что заметил, что у меня экспорт остановился после этой ошибки.. теперь дыра будет.. как попроще сделать чтоб гидра сигнализировала(отправляла sms,email или пищала хотя бы) в такой ситуации?

Написать код в Гидре?

XMbIPb
XMbIPb Autor

Mikhail Sukhov: Гидра данные откуда берет? Quik

Mikhail Sukhov
Mikhail Sukhov

XMbIPb:

Mikhail Sukhov: Гидра данные откуда берет? Quik

Нашли одно место, где может произойти рассинхронизация, будет в 3.2.12 (выложим вначале на КодеПлекс).

XMbIPb
XMbIPb Autor

Мигрировал на 4.0.3 - ошибка сохранилась...

Kiruhin
Kiruhin

свежая версия (билд 17554 на CodePlex) снова стала выбрасывать исключения:

18:45:13.1963215 Quik System.ArgumentException: Лучший бид 75 больше или равен лучшему офферу 74,7. Parameter name: depths at #=qOxrUlg4OPs6kyO$Tb$fK_AsvLvpbniHqbem3XR0IqYJ$YHh_unxSb72o8Lx33ST2.OnSave(List1 #=qdG9D7o0S$VLm$p1X5mJGDg==, IEnumerable1 #=qI8Yrjw3FSlsTGXzrB2G6Wg==, DateTime #=qglhOpOJV3Eak7bWImN1qFw==, #=qIq66bh$3sZ3H5Qsg8wylKQnhWDKIGWVQ4Kzav3bBjbTuEYdOmqUGMB8pZP7nVXWY #=qzo2XbdxQdj2YpWFIs1luwA==) at #=qd51RpYzKvk8ZoX3tAE27Pv5dvwlvJ4cd9LHaruSH2tUb7IGlUdMBGa$XKsHI6h7y.#=qjzjdD5iOFmlnVM$CIAaWbg==(DateTime #=qVEeOLCMkwYeCQLpKOSch0w==, #=qIh_krYypcNrIs_TevJuc9w==[] #=qtnbKHRwSl2jMCyY0PYan3Q==, Boolean #=qm2cMzNZ$AhLbKVjYs1uVcw==) at #=qd51RpYzKvk8ZoX3tAE27Pv5dvwlvJ4cd9LHaruSH2tUb7IGlUdMBGa$XKsHI6h7y.#=qG1RUXoghWzAcXUcOT9wvpc_mdO__lonqO_9aIcpIBx4PoFa9OeOonJ6KslJhoXMc_QLR7RRDGkUG0XQy2cwZOw==(IEnumerable1 #=qLhXPr$anHsDxuqWw0hZPdg==) at StockSharp.Hydra.Core.BaseMarketDataSource.SaveDepths(Security security, IEnumerable1 depths, Boolean raiseDataLoadedEvent) in D:\svalka\invest_info_sSharp\lib\stocksharp-17554\dev\Hydra\Core\BaseMarketDataSource.cs:line 209 at StockSharp.Hydra.Core.TraderMarketDataSource.Load() in D:\svalka\invest_info_sSharp\lib\stocksharp-17554\dev\Hydra\Core\TraderMarketDataSource.cs:line 101 at StockSharp.Hydra.Worker.WorkerProcess.<Download>b__18(IMarketDataSource source) in D:\svalka\invest_info_sSharp\lib\stocksharp-17554\dev\Hydra\Hydra\Worker.cs:line 124 18:45:14.2103233 Quik System.ArgumentException: Лучший бид 150,47 больше или равен лучшему офферу 150,31.

Mikhail Sukhov
Mikhail Sukhov

Kiruhin: свежая версия (билд 17554 на CodePlex) снова стала выбрасывать исключения:

18:45:13.1963215 Quik System.ArgumentException: Лучший бид 75 больше или равен лучшему офферу 74,7.

Можете проверку в MarketDataTrader.OnMarketDepthsChanged вставить? Пока не понятно, на каком участке стакан приходит плохой.

Kiruhin
Kiruhin
private void OnMarketDepthsChanged(IEnumerable<MarketDepth> depths)
{
	depths.ForEach(d =>
	{
		if (d.BestAsk.Price <= d.BestBid.Price)
			Log.SafeInvoke("Ошибка: d.BestAsk.Price <= d.BestBid.Price; {0}, {1}, {2}".Put(d.BestAsk.Price, d.BestBid.Price, d.Security.Code));

		//...

	});
}

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

Mikhail Sukhov
Mikhail Sukhov

Kiruhin: этот код ничего в лог не пишет, когда ошибки продолжают валиться.

Я имел ввиду что-то типа такого:

private void OnMarketDepthsChanged(IEnumerable<MarketDepth> depths)
{
	depths.ForEach(d =>
	{
		//Trace.WriteLine("MDA " +dc.Security+":"+dc._DebugId+":"+ dc.LastChangeTime.ToString("HHmmss.fff"));
		if (d.Bids.Length > 0 || d.Asks.Length > 0)
		{
			if (d.BestAsk.Price <= d.BestBid.Price)
				Log.SaveInvoke("Error 1");

			var clone = d.Clone();

			if (clone.BestAsk.Price <= clone.BestBid.Price)
				Log.SaveInvoke("Error 2");

			_depthsBuffer.Add(d.Security, clone);
		}
	});
}
Kiruhin
Kiruhin

да, в моем варианте валились ошибки NullReferenceException. но все равно в логе видно, что уже в этот метод приходит плохой стакан

запустил Гидру с Вашим кодом, отпишусь позже.

Kiruhin
Kiruhin

17:51:22.3118925 Quik Error 1 17:51:22.3118925 Quik Error 2 17:51:30.3495156 Quik System.ArgumentException: Лучший бид 131660 больше или равен лучшему офферу 131655. Имя параметра: depths ...

да, в этот метод стакан уже приходит неправильный.

Mikhail Sukhov
Mikhail Sukhov

Kiruhin: 17:51:22.3118925 Quik Error 1 17:51:22.3118925 Quik Error 2 17:51:30.3495156 Quik System.ArgumentException: Лучший бид 131660 больше или равен лучшему офферу 131655. Имя параметра: depths ...

да, в этот метод стакан уже приходит неправильный.

Получается, что то, что вы отписали здесь, неправильно?

Alexander
Alexander

Kiruhin: 17:51:22.3118925 Quik Error 1 17:51:22.3118925 Quik Error 2 17:51:30.3495156 Quik System.ArgumentException: Лучший бид 131660 больше или равен лучшему офферу 131655. Имя параметра: depths ...

да, в этот метод стакан уже приходит неправильный.

Выведите, пожалуйста, вместе с Error1 и Error2 d.BestAsk.Volume и d.BestBid.Volume

Kiruhin
Kiruhin

Alexander Mukhanchikov: Выведите, пожалуйста, вместе с Error1 и Error2 d.BestAsk.Volume и d.BestBid.Volume

13:43:42.8640657 Quik Error 1. 'VBM2': bestAsk (Price=5447, volume=49); bestBid (Price=5448, volume=1) 13:43:42.8640657 Quik Error 2. 'VBM2': bestAsk (Price=5447, volume=49); bestBid (Price=5448, volume=1) 13:43:56.3298895 Quik System.ArgumentException: Лучший бид 5448 больше или равен лучшему офферу 5447. Parameter name: depths at #=qOxrUlg4OPs6kyO$Tb$fK_AsvLvpbniHqbem3XR0IqYJ$YHh_unxSb72o8Lx33ST2.OnSave(List1 #=qdG9D7o0S$VLm$p1X5mJGDg==, IEnumerable1 #=qI8Yrjw3FSlsTGXzrB2G6Wg==, DateTime #=qglhOpOJV3Eak7bWImN1qFw==, #=qIq66bh$3sZ3H5Qsg8wylKQnhWDKIGWVQ4Kzav3bBjbTuEYdOmqUGMB8pZP7nVXWY #=qzo2XbdxQdj2YpWFIs1luwA==) at #=qd51RpYzKvk8ZoX3tAE27Pv5dvwlvJ4cd9LHaruSH2tUb7IGlUdMBGa$XKsHI6h7y.#=qjzjdD5iOFmlnVM$CIAaWbg==(DateTime #=qVEeOLCMkwYeCQLpKOSch0w==, #=qIh_krYypcNrIs_TevJuc9w==[] #=qtnbKHRwSl2jMCyY0PYan3Q==, Boolean #=qm2cMzNZ$AhLbKVjYs1uVcw==) at #=qd51RpYzKvk8ZoX3tAE27Pv5dvwlvJ4cd9LHaruSH2tUb7IGlUdMBGa$XKsHI6h7y.#=qG1RUXoghWzAcXUcOT9wvpc_mdO__lonqO_9aIcpIBx4PoFa9OeOonJ6KslJhoXMc_QLR7RRDGkUG0XQy2cwZOw==(IEnumerable1 #=qLhXPr$anHsDxuqWw0hZPdg==) at StockSharp.Hydra.Core.BaseMarketDataSource.SaveDepths(Security security, IEnumerable1 depths, Boolean raiseDataLoadedEvent) in D:\svalka\invest_info_sSharp\lib\stocksharp-17554\dev\Hydra\Core\BaseMarketDataSource.cs:line 209 at StockSharp.Hydra.Core.TraderMarketDataSource.Load() in D:\svalka\invest_info_sSharp\lib\stocksharp-17554\dev\Hydra\Core\TraderMarketDataSource.cs:line 0 at StockSharp.Hydra.Worker.WorkerProcess.<Download>b__18(IMarketDataSource source) in D:\svalka\invest_info_sSharp\lib\stocksharp-17554\dev\Hydra\Hydra\Worker.cs:line 124

Kiruhin
Kiruhin

Mikhail Sukhov: Получается, что то, что вы отписали здесь, неправильно? ага. ошибся. извините.

Mikhail Sukhov
Mikhail Sukhov

Можете проверить не Гидру, а в отдельной консольной программе написать такой код:

var qt = new QuikTrader();
qt.NewSecurities += securities =>
{
	foreach (var security in securities)
	{
		if (security.Id == "ID инструмента")
		{
			qt.RegisterQuotes(security);
			break;
		}
	}
};
qt.MarketDepthsChanged += depths =>
{
	foreach (var depth in depths)
	{
		if (depth.Security.Id == "ID инструмента")
		{
			if (/* проверка */)
				Console.WriteLine("Ошибка");
		}
	}
};
qt.Connected += qt.StartExport;
qt.Connect();

Это покажет, приходят ли данные уже испорченные из Квика.

Kiruhin
Kiruhin

да. конечно. я отпишусь.

chudokos
chudokos

Kiruhin: да. конечно. я отпишусь.

Получилось ли у вас в какой момент данные уже испорченные приходят?

Kiruhin
Kiruhin

вообще что-то руки до стокшарпа не доходят последнее время, ничего не делал пока. выставил только maxErrorCount в значение побольше ) может, через недельку посмотрю... (от своего обещания не отказываюсь =) )

Mikhail Sukhov
Mikhail Sukhov

Kiruhin: вообще что-то руки до стокшарпа не доходят последнее время, ничего не делал пока. выставил только maxErrorCount в значение побольше ) может, через недельку посмотрю... (от своего обещания не отказываюсь =) )

Судя по всему ошибка локальная, и только у вашего брокера. Так что можете не торопится. В любом случае ее устранение от нас вряд ли будет зависеть. Да и стаканы через квик - это та еще дезинформация.

XMbIPb
XMbIPb Autor

В 4.1.3 при экспорте из квика с 18:45 до 18:50 вылетает каждую секунду.. ну и до этого пару раз...

в #=qBqzAfx4eX6jbAhjwSd62HDxRx7KjXUhZdaqXaKrbhWNK89$cczN7Ybo1P582C383.#=qPNbrzoo63qiPKAB3RxCH5A==(List1 #=qHaHP4WZSVdKz53Hwzy$ekw==, IEnumerable1 #=qASUWOKDOCFZ2Wu9LWXkBtQ==, #=qvs0CsnLs_Ss1esfBSm5zwBJaDoBW$uY3FBMC6svegSZeQ2rqGZkXJaXHGH7s1irW #=qMfciDzi6G743_rIzu43_Aw==) в #=qz04YdXG2$YAOxeHvpD93kpzjtGGmn$CBMgLGYgYx3D5hyvyfpJ92$IJuzvbahT9DbHGoXECLGq73jVeWqoM7WA==.#=qhS5pEqj0jxrC3EkM2L2ByLP81D1u7MoFLP3gC9SmO2Ha62X2cRDXdnIw_qFSrI0yPZNVSXkqSrWbXB_ShwaNMF27KENqU9n7vKpFW$rzX$w=(IEnumerable1 #=qVh5t1g33tQf$GUY1wukgfA==, #=qT_JKyf8jvmdh8CnDd2erv404Kgk89rxorXnimUV3J5ygkrYMLo9XjjmlV7xs65$6 #=qSWB2y1ELx12TguZDCS1CWQ==) в #=qh2YSDa39RBEjCcO4rb2nambbPWQx618j_mhbAjIJkMVjnwGRGU3KGJb5NYvLGTBn.#=qteF9LpJJBLkC9LySoZdzwA==(DateTime #=qZ5Kd0lhJbrY2DbBE04yF9Q==, #=qZHHnzqkYDg7xCyaxj6PR9A==[] #=qh5tCqhElr2D_oYbBKomIaQ==, Boolean #=qSVNcMUfTvym2UYUPwu0xcQ==) в #=qh2YSDa39RBEjCcO4rb2nambbPWQx618j_mhbAjIJkMVjnwGRGU3KGJb5NYvLGTBn.Save(IEnumerable1 #=qDijncmxOZuMVXEQZJ6Gg9w==) в StockSharp.Hydra.Core.BaseMarketDataSource.SaveDepths(Security security, IEnumerable`1 depths, Boolean raiseDataLoadedEvent) в C:\StockSharp_4.1.3_Sources\Hydra\Core\BaseMarketDataSource.cs:строка 284 в StockSharp.Hydra.Core.TraderMarketDataSource.ProcessNewData() в C:\StockSharp_4.1.3_Sources\Hydra\Core\TraderMarketDataSource.cs:строка 128 в StockSharp.Hydra.Core.TraderMarketDataSource.Load() в C:\StockSharp_4.1.3_Sources\Hydra\Core\TraderMarketDataSource.cs:строка 108 в StockSharp.Hydra.Worker.WorkerProcess.<Download>b__1a(IMarketDataSource source)

Можно что-то сделать? Брокер Финам...

Alexander
Alexander

В клиринг не надо сохранять стаканы.

XMbIPb
XMbIPb Autor

Alexander Mukhanchikov: В клиринг не надо сохранять стаканы.

А в остальное время? Может можно хотя бы как-то эти сообщения перехватить.. чтоб лог не засирать.. хотел вставить пустой обработчик в BaseMarketDataSource.. но боюсь какую-нибудь серьёзную ошибку пропустить.. а откуда конкретно это сообщение в лог заносится найти не могу...

Mikhail Sukhov
Mikhail Sukhov

XMbIPb: А в остальное время? Может можно хотя бы как-то эти сообщения перехватить.. чтоб лог не засирать.. хотел вставить пустой обработчик в BaseMarketDataSource.. но боюсь какую-нибудь серьёзную ошибку пропустить.. а откуда конкретно это сообщение в лог заносится найти не могу...

Лучше в Квик написать, с вопросом, а почему это в клиринг стакан пляшет.😳

Alexander
Alexander

Переопределить RaiseProcessDataError. Там фильтровать. Только если так. Это приходит по идее туда и пишется через this.AddErrorLog

XMbIPb
XMbIPb Autor

Alexander Mukhanchikov: Переопределить RaiseProcessDataError. А где он теперь находится? Просто я тогда так и не докопался.. а сейчас(в 4.1.9) гидра стала падать из-за этой ошибки.. специально останавливаю экспорт в 18:45.. но пока он останавливается, успевает прилететь этот эксепшн и гидра падает..

18:45:00.020| |Quik |Останавливается. 18:45:00.241| |Quik |Для GDU3@RTS загружено 18 стаканов. 18:45:00.450| |Quik |Для GDM3@RTS загружено 28 стаканов. 18:45:00.656| |Quik |Для CHMF@EQNL загружено 65 стаканов. 18:45:00.941| |Quik |Для SRU3@RTS загружено 13 стаканов. 18:45:01.141| |Quik |Для VTBR@SMAL загружено 5 стаканов. 18:45:01.358| |Quik |Для AKRN@EQNL загружено 9 стаканов. 18:45:01.557| |Quik |Для RI135000BP3@RTS загружено 51 стаканов. 18:45:01.757| |Quik |Для RI150000BE3@RTS загружено 1 стаканов. 18:45:01.948| |Quik |Для RIU3@RTS загружено 46 стаканов. 18:45:02.159| |Quik |Для TNBP@EQNE загружено 3 стаканов. 18:45:02.385| |Quik |Для SVM3@RTS загружено 11 стаканов. 18:45:02.592| |Quik |Для MFGSP@EQNE загружено 1 стаканов. 18:45:02.804| |Quik |Для MTLRP@EQBR загружено 70 стаканов. 18:45:03.004| |Quik |Для AVAZ@EQNL загружено 15 стаканов. 18:45:03.224| |Quik |Для MSNG@EQBR загружено 87 стаканов. 18:45:03.447| |Quik |Для GRAZ@EQNL загружено 8 стаканов. 18:45:03.730| |Quik |Для MRSB@EQNE загружено 1 стаканов. 18:45:03.933| |Quik |Для ODVA@EQNE загружено 1 стаканов. 18:45:04.298| |Quik |Для SNGS@TQNL загружено 3 стаканов. 18:45:04.501| |Quik |Для RI150000BD3@RTS загружено 4 стаканов. 18:45:04.706| |Quik |Для TGKD@EQBS загружено 8 стаканов. 18:45:04.940| |Quik |Для RI130000BQ3@RTS загружено 13 стаканов. 18:45:05.165| |Quik |Для ROSN@TQNL загружено 2 стаканов. 18:45:05.381| |Quik |Для RBCM@EQNL загружено 12 стаканов. 18:45:05.576| |Quik |Для RI145000BD3@RTS загружено 8 стаканов. 18:45:05.783| |Quik |Для RTKMP@EQBR загружено 5 стаканов. 18:45:06.007| |Quik |Для MGVM@EQNE загружено 16 стаканов. 18:45:06.206| |Quik |Для RI145000BF3@RTS загружено 5 стаканов. 18:45:06.476| |Quik |Для AFKS@EQNL загружено 11 стаканов. 18:45:06.710| |Quik |Для BANE@EQNE загружено 7 стаканов. 18:45:06.923| |Quik |Для BANEP@EQNE загружено 10 стаканов. 18:45:07.161| |Quik |Для TRNFP@EQNL загружено 19 стаканов. 18:45:07.364| |Quik |Для DIXY@EQNL загружено 1 стаканов. 18:45:07.581| |Quik |Для REBR@EQNE загружено 2 стаканов. 18:45:07.837| |Quik |Для MOEX@EQLV загружено 3 стаканов. 18:45:08.058| |Quik |Для MSTT@EQNL загружено 6 стаканов. 18:45:08.281| |Quik |Для MVID@EQNL загружено 4 стаканов. 18:45:08.523| |Quik |Для NMTP@EQNL загружено 26 стаканов. 18:45:08.742| |Quik |Для PHOR@EQBR загружено 10 стаканов. 18:45:08.987| |Quik |Для PIKK@EQBR загружено 12 стаканов. 18:45:09.217| |Quik |Для RUALR@EQBR загружено 12 стаканов. 18:45:34.073| |Quik |Сохранение стаканов для SNGSP@EQNL. 18:45:34.790| |Quik |Сохранение стаканов для SiU3@RTS. 18:45:34.795| |Quik |Сохранение стаканов для RI135000BP3@RTS. 18:45:34.870| |Quik |Сохранение стаканов для LKM3@RTS. 18:45:35.011| |Quik |Сохранение стаканов для RIM3@RTS. 18:45:35.089| |Quik |Сохранение стаканов для FEES@EQNL. 18:45:35.104| |Quik |Сохранение стаканов для GAZP@EQNE. 18:45:35.179|Error |Unhandled Exception|System.ArgumentException: Лучший бид 130,38 больше или равен лучшему офферу 128,35 во время 03.04.2013 18:44:57. Parameter name: depths at #=qhBqOxQ5SIAbyY2y6N4BACFDFlQ_j1Q8yNEtvBOYqije_f5J8ROizhDxiO305Qb7J.#=qr_KzM1xL4C_LNzBQG0cU1w==(List1 #=qtNWXcGR9OrC167LNZ6sqwA==, IEnumerable1 #=qSHBGsvI2XWoCf1iMdzkfkQ==, #=qE5zo4_Ejp278xyk1AZp_K4lW5e2aEbLnSXrHx0bkG0IPV$BZ64GnXHWVHNZJ$akP #=qxK5OV7scqRijV8foIwhTOg==) at #=qUIMgopRPM50_snA_IW7lP5vnYLX4Ycjk3tlkUJmO$df$BhOICeXYRcKE6VPTBUvWor_HO$pMaUHIccrT1sunXQ==.#=qtPi_jCcTQy54OokHmjQzTrWtsFtcY3JYPA5Pimp6VuHCD0uL37gJzv$_$IzMNYh_eeJNWPUUDx9E2sMiBuYQgLprnVeNO_L1hHWagWtxbeo=(IEnumerable1 #=qWIwOd8WCA_EX_3JPloWbeQ==, #=q9h_Acx51llzEuCgXXohQKifmacT4UQOfLLvGdIR0x1XzExFE4ZUGkV6nMHXy$6I4 #=q1bBiLtrF41cu9bGzzYSWkA==) at #=qJM9xtd9HT4k2cHOn7Ak7RSOm$uYCug_vtlSEqSqyO5XEdM3kbiV34ZAsRb1B0dzg.#=q1Mggw99G5hfFdA9JpoWTIQ==(DateTime #=qZGVM4ZzDSX8cnal_sirMTA==, #=qJKlgmjPaEu7aOWykYJHW0w==[] #=qIsf10FO4RN0C3UDhi1Bpbw==, Boolean #=qg58umgjgqmnnboxFNnaEVQ==) at #=qJM9xtd9HT4k2cHOn7Ak7RSOm$uYCug_vtlSEqSqyO5XEdM3kbiV34ZAsRb1B0dzg.Save(IEnumerable1 #=qlKNnsuKM7O8284FGVcOKnA==) at StockSharp.Hydra.Core.BaseMarketDataSource.SaveDepths(Security security, IEnumerable1 depths, Boolean raiseDataLoadedEvent) in c:\Dropbox\CODING\StockSharp\StockSharp\trunk\Hydra\Core\BaseMarketDataSource.cs:line 264 at StockSharp.Hydra.Core.TraderMarketDataSource1.SaveValues(IDictionary2 data, Func1 getNewValues, Func4 saveValues) in c:\Dropbox\CODING\StockSharp\StockSharp\trunk\Hydra\Core\TraderMarketDataSource.cs:line 111 at StockSharp.Hydra.Core.TraderMarketDataSource1.ProcessNewData() in c:\Dropbox\CODING\StockSharp\StockSharp\trunk\Hydra\Core\TraderMarketDataSource.cs:line 120 at StockSharp.Hydra.Core.TraderMarketDataSource`1.Stop() in c:\Dropbox\CODING\StockSharp\StockSharp\trunk\Hydra\Core\TraderMarketDataSource.cs:line 85 at StockSharp.Hydra.Worker.Downloader.Finish() in c:\Dropbox\CODING\StockSharp\StockSharp\trunk\Hydra\Hydra\Worker.cs:line 252 at StockSharp.Hydra.Worker.Downloader.Download() in c:\Dropbox\CODING\StockSharp\StockSharp\trunk\Hydra\Hydra\Worker.cs:line 216 at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.TimerQueueTimer.CallCallback() at System.Threading.TimerQueueTimer.Fire() at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() at System.Threading.ThreadPoolWorkQueue.Dispatch()

И так каждый день...

Андрей Шабанов
Андрей Шабанов

та же проблема.

chudokos
chudokos

Андрей Шабанов: та же проблема.

Аналогично, в 18:45 Гидра вылетает после того как несколько раз приходят ошибки, что бид больше оффера. Вообще, не знаю, рассматривали ли вы такой вариант, но это можно вынести в настройки, пусть пользователь сам решает останавливать ли закачку или нет. В том, что бид больше оффера не всегда есть проблема. Например, в пред.торговые полчаса на споте все трейдеры ставят заявки, а сделки еще не проходят. Там бид больше оффера может быть спокойно, это не ошибка. К тому же, пользователь сам может выбирать что он потом с этими стаканами будет делать. Их можно чистить самому или алгоритм обработки данных строить так, чтобы обходить такие вещи. А так получается, данных совсем нет, что есть грустно.

Вы постоянно модифицируете работу с данными, уже очень много сделали, молодцы. К сожалению, я .NET только осваиваю, надеюсь выйти на хороший уровень и помочь. Из тех идей, которые есть по обработке данных по мимо инструмента чистки стаканов от ситуаций "оффер ниже бида", есть следующие (возможно, у кого-то дойдут руки и желание их сделать):

  • Удаление плохих тиков (например, сделка была на 20% выше/ниже предыдущей)
  • Проверка и удаление дублированных данных (это алгоритм может быть использован также в следующем пункте)
  • Склеивание файлов, записанных их разных источников (как клеить стаканы, учитывая, что время пишется локального компьютера, я не знаю, но идеи есть)
  • Приведение времени записанных стаканов ко времени проведения сделок (если это вообще возможно)
  • Фильтрация стаканов (аналог создания свечек по сделкам, но тут еще проще - просто отфильтровать часть данных) по разным таймфреймам
  • Заполнение данных по пустым дням из других источников (я так понял, что это есть в склеивании данных, но еще не тестировал, можно ли не склеивая заполнить пропуски)

Так образом, блок с манипуляциями будет, на мой взгляд достаточно полным и проведя их можно подойти к тестированию стратегий, будучи уверенным, что данные корректные, полные, время различных видов данных совпадает со временем сервера. Хотя насчет последнего не так все просто, ведь мы видим стакан уже с задержкой и когда он был на сервере биржи мы не знаем точно, а вот время сделки у нас серверное.

Mikhail Sukhov
Mikhail Sukhov

chudokos: В том, что бид больше оффера не всегда есть проблема.

Конкретно в этом случае - это косяк Квика, 100%. Судя по всему, это РТС, и неправильно собирается стакан. Не уверен, стоит ли вообще писать кривые данные.

chudokos:

  • Удаление плохих тиков (например, сделка была на 20% выше/ниже предыдущей)
  • Проверка и удаление дублированных данных (это алгоритм может быть использован также в следующем пункте)
  • Склеивание файлов, записанных их разных источников (как клеить стаканы, учитывая, что время пишется локального компьютера, я не знаю, но идеи есть)
  • Приведение времени записанных стаканов ко времени проведения сделок (если это вообще возможно)
  • Фильтрация стаканов (аналог создания свечек по сделкам, но тут еще проще - просто отфильтровать часть данных) по разным таймфреймам
  • Заполнение данных по пустым дням из других источников (я так понял, что это есть в склеивании данных, но еще не тестировал, можно ли не склеивая заполнить пропуски)
  1. Это можно сделать самостоятельно через Storage API
  2. Что есть дублированные данные?
  3. Нет смысла в том плане, что овчинка не стоит выделки.
  4. Опять же, нет смысла, так как есть более правильные пути.
  5. См пункт 1.
  6. Не совсем понятно, что предлагается сделать

chudokos: Так образом, блок с манипуляциями будет, на мой взгляд достаточно полным и проведя их можно подойти к тестированию стратегий, будучи уверенным, что данные корректные, полные, время различных видов данных совпадает со временем сервера. Хотя насчет последнего не так все просто, ведь мы видим стакан уже с задержкой и когда он был на сервере биржи мы не знаем точно, а вот время сделки у нас серверное.

Если мы говорим про Квик, то да, данные без метки времени. Если брать от биржи, то конечно же с меткой.

chudokos
chudokos

Михаил Сухов:

chudokos: В том, что бид больше оффера не всегда есть проблема.

Конкретно в этом случае - это косяк Квика, 100%. Судя по всему, это РТС, и неправильно собирается стакан. Не уверен, стоит ли вообще писать кривые данные.

chudokos:

  • Удаление плохих тиков (например, сделка была на 20% выше/ниже предыдущей)
  • Проверка и удаление дублированных данных (это алгоритм может быть использован также в следующем пункте)
  • Склеивание файлов, записанных их разных источников (как клеить стаканы, учитывая, что время пишется локального компьютера, я не знаю, но идеи есть)
  • Приведение времени записанных стаканов ко времени проведения сделок (если это вообще возможно)
  • Фильтрация стаканов (аналог создания свечек по сделкам, но тут еще проще - просто отфильтровать часть данных) по разным таймфреймам
  • Заполнение данных по пустым дням из других источников (я так понял, что это есть в склеивании данных, но еще не тестировал, можно ли не склеивая заполнить пропуски)
  1. Это можно сделать самостоятельно через Storage API
  2. Что есть дублированные данные?
  3. Нет смысла в том плане, что овчинка не стоит выделки.
  4. Опять же, нет смысла, так как есть более правильные пути.
  5. См пункт 1.
  6. Не совсем понятно, что предлагается сделать

chudokos: Так образом, блок с манипуляциями будет, на мой взгляд достаточно полным и проведя их можно подойти к тестированию стратегий, будучи уверенным, что данные корректные, полные, время различных видов данных совпадает со временем сервера. Хотя насчет последнего не так все просто, ведь мы видим стакан уже с задержкой и когда он был на сервере биржи мы не знаем точно, а вот время сделки у нас серверное.

Если мы говорим про Квик, то да, данные без метки времени. Если брать от биржи, то конечно же с меткой.

Скажем так, стоит или не стоит, это все же, на мой взгляд, вопрос индивидуальный. Тем более, что из-за этой ошибки не записываются ВСЕ данные после этого. К тому же трейдер знает, что там есть косяк, и готов к этому, тем более что это косяк во время клиринга. Возьмем классику - Каца и Маккормика, сколько времени в книге они уделяют корректным данным их очистке, полноте и т.д. Из того что он описывает, далеко не все вендоры дают полностью корректные данные, так это США, где все за деньги и должно быть вылезано. Да и бизнес-аналитику возьмите, данные и дублированные попадаются и неполные и некорректные, но борются с этим же. А если их нет совсем, то что анализировать тогда? Вы часто грешите на Квик, у них есть косяки, не спорю, но очень редко. Он транслируют данные из шлюза - это раз, два - я никогда визуально не видел в сессионное время кривых стаканов от Квика. Возможно дело не в Квике, а в "парсинге"? Как-то я проверял тиковые сделки от биржи, думаете там не было косяков? ) Так это первоисточник!

  1. Не совсем знаю что это, но буду знать, что можно взять там ) Я так понимаю, для этого нужно обладать умением программировать на .NET
  2. Остались после записи Гидрой ранних версий, сейчас вроде бы нет. Проверю еще раз
  3. Возможно
  4. Какие, подскажите, я голову сломал уже? )
  5. Ок
  6. Ну, например, сделок по какому-то инстурменту нет за какие-то дни, Гидра видит за какие, качаем с Финама или других мест только за эти дни. Также можно сверку делать. Например, квик отключился, сервер упал или еще что, сделки за день есть не все, но мы этого не знаем. Как проверить есть ли все сдекли, нужно скачать с другого места и сравнить хотя бы количество сделок, если различия больше какого-то порога, понимаем, что данные есть, но не полные.

Биржевые стаканы приходят из шлюза с меткой времени, честно?

XMbIPb
XMbIPb Autor

Я конечно понимаю, что кривые стаканы это не гидрин косяк.. но может всё-таки можно научить её их игнорить или хотя бы увеличить maxErrorCount, чтоб из-за них экспорт не вставал? Только из-за этой фигни приходится сидеть на старой версии...

Mikhail Sukhov
Mikhail Sukhov

XMbIPb: Я конечно понимаю, что кривые стаканы это не гидрин косяк.. но может всё-таки можно научить её их игнорить или хотя бы увеличить maxErrorCount, чтоб из-за них экспорт не вставал? Только из-за этой фигни приходится сидеть на старой версии...

В план поставили задачу по изменению поведения.