← Zurück

[3.0.5] RealTimeTestTrader<SmartTrader>

Подписался на RealTimeTestTrader<SmartTrader>.NewTrade сделки приходят по два раза.

В комбобоксе Portfolio - все cчета по два раза.

Похоже враппер каким-то образом задваивает посылку всех event-ов

С уважением

War dieses Thema hilfreich?

Thema teilen

Kommentare (10)

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

Mikhail Sukhov
Mikhail Sukhov

pyhta4og: Подписался на RealTimeTestTrader.NewTrade сделки приходят по два раза.

Чтобы тестирование вдвойне было качественнее.

pyhta4og
pyhta4og Autor

Чтобы тестирование вдвойне было качественнее. Тогда уж давайте вдесятерне ;)

pyhta4og
pyhta4og Autor

Еще пара вещей по гидре [3.0.6]

1)

в SmartDepthSource

	public void Start(IEnumerable<Security> securities)
	{
		_trader.Start();
		securities.ForEach(_trader.Trader.RegisterQuotes);
	}

_trader.Start вызывает Connect. Но Trader.Connected не ждет В итоге RegisterQuotes вызовется до Trader.Connected.

Это разве правильно?

2)

Я захотел SmartDepthSource сделать помимо источника Quotes сделать источником Trade-ов.

Для этого добавил реализацию ITradeSource

И все можно сказать заработало, загрузился трейд, но при сохранении в базу в DeleteTrades() все кончилось исключением


Smart 20:06:44.1875577 Загружено 1 сделок.
Smart 20:06:44.1875577 Первая сделка 12281010 для RIH1@RTS за 22/02/2011 20:06:42.
Smart 20:06:44.1875577 Последняя сделка 12281010 для RIH1@RTS за 22/02/2011 20:06:42.
Smart 20:06:44.1875577 System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
   at System.ThrowHelper.ThrowKeyNotFoundException()
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at #=qN8oiXslVNgiUhuKs9C5uZgAkFATVDAsBWbPNhjTHTwcSqhF8Jp2W6wFkC8iwG3qR.#=qfOFdegjrBN$1UO2aK2Dd1g==(IEnumerable`1 #=q_ldcTM_jyhYkLszl5I2EKw==)
   at Ecng.Trading.Algo.Storages.TradingStorage.DeleteTrades(Security security, IEnumerable`1 trades)
   at Ecng.Trading.Hydra.Worker.<Download>b__10(IMarketDataSource source) in D:\SS\Sources\Hydra\Hydra\Worker.cs:line 136

Мой вариант SmartDepthSource.cs



namespace Ecng.Trading.Hydra.Smart
{
	using System;
	using System.Collections.Generic;
	using System.ComponentModel;
	using System.Net;

	using Ecng.Collections;
	using Ecng.Common;
	using Ecng.Trading.BusinessEntities;
	using Ecng.Trading.Hydra.Core;
	using Ecng.Trading.Smart;
    using System.Linq;

	class SmartDepthSource : IMarketDepthSource, ISecuritySource, ITradeSource
	{
		private sealed class SmartSettings : MarketDataSourceSettings
		{
			public SmartSettings(MarketDataSourceSettings settings)
			{
				if (settings == null)
					throw new ArgumentNullException("settings");

				this.RealSettings = settings;
			}

			public override bool IsEnabled
			{
				get { return this.RealSettings.IsEnabled; }
				set { this.RealSettings.IsEnabled = value; }
			}

			public override TimeSpan WorkingFrom
			{
				get { return this.RealSettings.WorkingFrom; }
				set { this.RealSettings.WorkingFrom = value; }
			}

			public override TimeSpan WorkingTo
			{
				get { return this.RealSettings.WorkingTo; }
				set { this.RealSettings.WorkingTo = value; }
			}

			public override TimeSpan Interval
			{
				get { return this.RealSettings.Interval; }
				set { this.RealSettings.Interval = value; }
			}

			public override string DumpFolder
			{
				get { return this.RealSettings.DumpFolder; }
				set { this.RealSettings.DumpFolder = value; }
			}

			[Category("Smart")]
			[DisplayName("Логин")]
			public string Login
			{
				get { return (string)this.RealSettings.ExtensionInfo["Login"]; }
				set { this.RealSettings.ExtensionInfo["Login"] = value; }
			}

			[Category("Smart")]
			[DisplayName("Пароль")]
			public string Password
			{
				get { return (string)this.RealSettings.ExtensionInfo["Password"]; }
				set { this.RealSettings.ExtensionInfo["Password"] = value; }
			}

			[Category("Smart")]
			[DisplayName("Адрес")]
			public string Address
			{
				get { return this.RealSettings.ExtensionInfo["Address"].To<string>(); }
				set { this.RealSettings.ExtensionInfo["Address"] = value; }
			}

			internal MarketDataSourceSettings RealSettings { get; private set; }
		}

		private readonly Guid _id = "1ED92215-3E57-4EC9-89E5-22EC65786C67".To<Guid>();
		private readonly HydraStorage _storage;
		private readonly SmartSettings _settings;
		private readonly MarketDataTrader _trader;

        private IEnumerable<Security> _securities;

		public SmartDepthSource(HydraStorage storage)
		{
			if (storage == null)
				throw new ArgumentNullException("storage");

			_storage = storage;

			var settings = _storage.SourcesSettings.LoadBySourceId(_id);

			if (settings == null)
			{
				settings = new MarketDataSourceSettings
				{
					SourceId = _id,
					WorkingFrom = new TimeSpan(0, 0, 0),
					WorkingTo = new TimeSpan(23, 59, 0),
					ExtensionInfo = new Dictionary<object, object>(),
					DumpFolder = string.Empty,
				};

				_settings = new SmartSettings(settings)
				{
					Login = string.Empty,
					Password = string.Empty,
					Address = SmartAddresses.Major.To<string>(),
				};

				SaveSettings();
			}
			else
				_settings = new SmartSettings(settings);

			_trader = new MarketDataTrader(new SecurityStorage(this), 
                CreateTrader);
		}

        ITrader CreateTrader()
        {
            SmartTrader st = new SmartTrader(_settings.Login, _settings.Password, _settings.Address.To<IPAddress>());
            st.Connected += new Action(TraderConnected);
            return st;
        }

        void TraderConnected()
        {
            if (_securities != null)
            {
                _securities.ForEach(_trader.Trader.RegisterQuotes);
                _securities.ForEach(_trader.Trader.RegisterTrades);
            }
        }

		Uri IMarketDataSource.Icon
		{
			get { return null; }
		}
 
		Guid IMarketDataSource.Id
		{
			get { return _id; }
		}

		public string Name
		{
			get { return "Smart"; }
		}
         
		HydraStorage IMarketDataSource.Storage
		{
			get { return _storage; }
		}

		MarketDataSourceSettings IMarketDataSource.Settings
		{
			get { return _settings; }
		}

		public void SaveSettings()
		{
			_storage.SourcesSettings.Save(_settings.RealSettings);
		}

		public void Start(IEnumerable<Security> securities)
		{
            _securities = securities;
            _trader.Start();
			//securities.ForEach(_trader.Trader.RegisterQuotes);
		}

		public void Stop()
		{
			_trader.Stop();
		}

		public IEnumerable<MarketDepth> Load(Security security)
		{
			if (_trader.LastError != null)
			{
				var copy = _trader.LastError;
				_trader.LastError = null;
				throw copy;
			}

			return _trader.GetMarketDepths(security);
		}

        IEnumerable<Trade> ITradeSource.Load(Security security)
        {
            if (_trader.LastError != null)
            {
                var copy = _trader.LastError;
                _trader.LastError = null;
                throw copy;
            }

            return _trader.GetTrades(security);
        }

		public void CommitLoad(Security security)
		{
		}

		public IEnumerable<Security> GetNewSecurities()
		{
			return _trader.GetNewSecurities();
		}
	}
}

pyhta4og
pyhta4og Autor

Михаил,

прокомментируете насчет того как сделать SmartDepthSource источником и стаканов и сделок?

Хочу записать несколько дней истории со сделками и со стаканами, чтобы разбираться с эмулятором.

Но поскольку сижу на демо сделки там надо писать со смарта же (от тех что на ftp.rts.ru теоретически могут отличаться)

Проблема в exception

Я захотел SmartDepthSource сделать помимо источника Quotes сделать источником Trade-ов.

Для этого добавил реализацию ITradeSource

И все можно сказать заработало, загрузился трейд, но при сохранении в базу в DeleteTrades() все кончилось исключением Код:

Smart 20:06:44.1875577 Загружено 1 сделок. Smart 20:06:44.1875577 Первая сделка 12281010 для RIH1@RTS за 22/02/2011 20:06:42. Smart 20:06:44.1875577 Последняя сделка 12281010 для RIH1@RTS за 22/02/2011 20:06:42. Smart 20:06:44.1875577 System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary. at System.ThrowHelper.ThrowKeyNotFoundException() at System.Collections.Generic.Dictionary2.get_Item(TKey key) at #=qN8oiXslVNgiUhuKs9C5uZgAkFATVDAsBWbPNhjTHTwcSqhF8Jp2W6wFkC8iwG3qR.#=qfOFdegjrBN$1UO2aK2Dd1g==(IEnumerable1 #=q_ldcTM_jyhYkLszl5I2EKw==) at Ecng.Trading.Algo.Storages.TradingStorage.DeleteTrades(Security security, IEnumerable`1 trades) at Ecng.Trading.Hydra.Worker.<Download>b__10(IMarketDataSource source) in D:\SS\Sources\Hydra\Hydra\Worker.cs:line 136

C уважением

Mikhail Sukhov
Mikhail Sukhov

pyhta4og: Михаил,

прокомментируете насчет того как сделать SmartDepthSource источником и стаканов и сделок?

Сорри, не видел сообщение... Выглядит как баги у Гидры. Посмотрю, и если баги, поправлю. То, что со сделками - точно бага.

pyhta4og
pyhta4og Autor

[3.0.6]

Писал стакан Смарта Гидрой.

Потом на HistoryTestTrader пытался воспроизвести его.

Полезла куча ArgumentException что мол Размер спреда равен нулю.

Выходит что стаканы с нулевым спредом иногда приходят из Смарта. И пишутся гидрой. Неизвестно что это значит, но ArgumentException надо или убрать или сделать опциональным.

pyhta4og
pyhta4og Autor

[3.0.8] Снова пытался писать стаканы и сделки из smart-a. Раньше было исключение в DeleteTrades, теперь в SaveMarketDepths


Smart 17:23:24.7395341 System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
   at System.ThrowHelper.ThrowKeyNotFoundException()
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at #=qy0RUoYLNYlqW0B_yati76yQLlF1y1sx_upRDGw64sltK5TcMQcaCdHkwYKu8cl8Y.#=qBv4dRfrP7FogGPMlCDm2rQ==(List`1 #=ql3KkknXDyqfAd1k4lx0bCQ==, IEnumerable`1 #=qbABKyBV6r8pDH9j$8kSBpA==, DateTime #=qRu8RIQ_ri0I$WV9icXS5Fg==, IDictionary`2 #=qVTyISirbCCMsUG$tAxBQ8Q==)
   at #=qISHYDk5RSfQ0l16TU_VuyOtzEHXYB9jvVWSF0dtT$aJtVzc06stTfkzpAAwhOqgr.#=qXYswPurs6ralv9zNnmytdg==(DateTime #=qV9lC0hKzLXxXFDwtYDa2Jw==, IEnumerable`1 #=qkhla0l1ajhOnacniEE0LvQ==, Boolean #=qThnvvftvehZoBLoIRIwHkg==)
   at #=qISHYDk5RSfQ0l16TU_VuyOtzEHXYB9jvVWSF0dtT$aJtVzc06stTfkzpAAwhOqgr.#=qXOFLyXQQ7OqmsYJeKd16_w==(IEnumerable`1 #=qLlX1_MdjdJCYpfRK4x$0ag==)
   at Ecng.Trading.Algo.Storages.TradingStorage.SaveMarketDepths(Security security, IEnumerable`1 depths)
   at Ecng.Trading.Hydra.Worker.<Download>b__10(IMarketDataSource source) in D:\SS\Sources\Hydra\Hydra\Worker.cs:line 174

Mikhail Sukhov
Mikhail Sukhov

pyhta4og: [3.0.8] Снова пытался писать стаканы и сделки из smart-a. Раньше было исключение в DeleteTrades, теперь в SaveMarketDepths

Ок, бага ясна. Сделал фикс, потестирую.

pyhta4og
pyhta4og Autor

[3.0.11] Писал гидрой стакан RIH1 из смарта.

В результате записались стаканы с неправильными ценами, например BID=201762.5 201737.5. В общем на 2.5 сдвинутые от цены кратной 5.

Непонятно, толи смарт их передавал такие, или глюк в алгоритме компрессии.

Mikhail Sukhov
Mikhail Sukhov

pyhta4og: Непонятно, толи смарт их передавал такие, или глюк в алгоритме компрессии.

В алгоритме декомпрессии, что явно лучше, когда наоборот.🙂