[3.0.5] RealTimeTestTrader
Atom
22.02.2011
pyhta4og


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

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

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

С уважением




Спасибо:


Mikhail Sukhov

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


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

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

Спасибо:

pyhta4og

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


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

Спасибо:

pyhta4og

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


Еще пара вещей по гидре [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

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


Михаил,

прокомментируете насчет того как сделать 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.b__10(IMarketDataSource source) in D:\SS\Sources\Hydra\Hydra\Worker.cs:line 136

C уважением

Спасибо:

Mikhail Sukhov

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


pyhta4og: Михаил,

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

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

Спасибо:

pyhta4og

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


[3.0.6]

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

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

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

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

Спасибо:

pyhta4og

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


[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

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


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

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

Спасибо:

pyhta4og

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


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

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

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

Спасибо:

Mikhail Sukhov

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


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

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

Спасибо:


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

loading
clippy