[3.0.5] RealTimeTestTrader
Atom
22.02.2011


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

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

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


С уважением



Спасибо:


Mikhail Sukhov

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


pyhta4og Перейти
Подписался на RealTimeTestTrader<SmartTrader>.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.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



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