Эффективное создание объектов Security~/topic/1470/ehffektivnoe-sozdanie-obektov-security/Copyright @ StockSharp Platform LLC 2010 - 20242024-03-28T17:39:09Zhttps://stocksharp.com/images/logo.pnghttps://stocksharp.com/posts/m/7014/Исключительно для информации. 1. еще до испольования RegisterSecurity(), после выполнения методов Co...2011-03-25T05:59:07Z2011-03-25T05:59:07ZGreene-nskhttps://stocksharp.com/users/27932/info@stocksharp.com<div class="quote"><span class="quotetitle">igork <a href="https://stocksharp.com/posts/m/7010/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote">Исключительно для информации. <br /><br />1. еще до испольования RegisterSecurity(), после выполнения методов Connect() и последующего StartExport() все время получаю 960-980 штук вызовов SecurityChanged(). Список securities всегда постоянный, последнее событие приходит по "eMiniNDQ_1003". Могу прислать журнал. Вызовы можно проигнорировать с помощью доп. логики, но было бы здорово не генерировать лишние уведомления до того момента, как выполнена первая подписка. Гоняю прототип робота в отладчике VS2010, подключен к основному серверу SmartCom. <br /><br /></div></div><br />Такое, наверное, возможно сразу после получения инфы по символам. Я не разбирался. Потом, когда символы получены, ITrader.SecuritiesChanged приходят только для символов, которые подписаны.<br /><br /><div class="quote"><span class="quotetitle">Quote:</span><div class="innerquote"><br />2. С портфелями не все понятно. Для получения состояния портфелей делаю все по примеру<br /><br />this.trader.NewPortfolios += portfolios => {this.SmartProcessPortfolios(portfolios); };<br /><br />private void SmartProcessPortfolios(IEnumerable<Portfolio> portfolios) <br />{<br /> foreach (Portfolio p in portfolios)<br /> UpdateDB(p); // пишем в память и в базу<br /><br /> trader.RegisterPortfolio(p);<br />}<br /><br />Вызов отрабатывает, имена портфелей приходят, но BeginAmount, CurrentAmount, Leverage и т.д. - все свойства = 0. <br />Насколько я понимаю, необходимо обождать секунд 10 и пройтись по trader.portfolio[i].... При этом значения BeginAmount, CurrentAmount и т.д. заполяются. Но тоже наблюдется странное поведение. Два портфеля с балансами > 1.000.000 видит, а один портфель с балансом 135 рублей игнорирует (CurrentAmount всегда = 0).<br /><br />Безопасно ли, например, по таймеру опрашивать коллекцию trader.Portfolios для получения баланса счетов? </div></div><br /><br />Да. Это особенность SMartCOM. Он сначала посылает нулевые балансы, а потом через некоторое время через ITrader.PortfoliosChanged посылает обновление.<br />Я в своем коде жду не само появление портфеля, а портфеля именно с положительным балансом.<br /><br /><div class="code"><strong>Code</strong><div class="innercode"><br /> public Portfolio Portfolio(string portfolioName)<br /> {<br /> // ждем нужное портфолио<br /> if (!Trader.Portfolios.Any(p => p.Name.Equals(portfolioName) && p.CurrentAmount.Value > 0))<br /> {<br /> Log.Out("Ждем портфолио " + portfolioName + " с положительным балансом...", LogLevel.notice);<br /><br /> DateTime dtNow = DateTime.Now;<br /> while (!Trader.Portfolios.Any(p => p.Name.Equals(portfolioName) && p.CurrentAmount.Value > 0))<br /> {<br /> if (DateTime.Now - dtNow > TimeSpan.FromMinutes(2))<br /> Log.OutErrorFatal("Портфолио не найден или имеет отрицательный баланс: " + portfolioName);<br /> Thread.Sleep(100);<br /> }<br /> }<br /><br /> return Trader.Portfolios.SingleOrDefault(p => p.Name.Equals(portfolioName));<br /> }<br /></div></div>Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/7010/Исключительно для информации. 1. еще до испольования RegisterSecurity(), после выполнения методов Co...2011-03-24T19:38:17Z2011-03-24T19:38:17Zigorkhttps://stocksharp.com/users/6303/info@stocksharp.comИсключительно для информации. <br /><br />1. еще до испольования RegisterSecurity(), после выполнения методов Connect() и последующего StartExport() все время получаю 960-980 штук вызовов SecurityChanged(). Список securities всегда постоянный, последнее событие приходит по "eMiniNDQ_1003". Могу прислать журнал. Вызовы можно проигнорировать с помощью доп. логики, но было бы здорово не генерировать лишние уведомления до того момента, как выполнена первая подписка. Гоняю прототип робота в отладчике VS2010, подключен к основному серверу SmartCom. <br /><br />2. С портфелями не все понятно. Для получения состояния портфелей делаю все по примеру<br /><br />this.trader.NewPortfolios += portfolios => {this.SmartProcessPortfolios(portfolios); };<br /><br />private void SmartProcessPortfolios(IEnumerable<Portfolio> portfolios) <br />{<br /> foreach (Portfolio p in portfolios)<br /> UpdateDB(p); // пишем в память и в базу<br /><br /> trader.RegisterPortfolio(p);<br />}<br /><br />Вызов отрабатывает, имена портфелей приходят, но BeginAmount, CurrentAmount, Leverage и т.д. - все свойства = 0. <br />Насколько я понимаю, необходимо обождать секунд 10 и пройтись по trader.portfolio[i].... При этом значения BeginAmount, CurrentAmount и т.д. заполяются. Но тоже наблюдется странное поведение. Два портфеля с балансами > 1.000.000 видит, а один портфель с балансом 135 рублей игнорирует (CurrentAmount всегда = 0).<br /><br />Безопасно ли, например, по таймеру опрашивать коллекцию trader.Portfolios для получения баланса счетов? Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/7002/Greene-nsk, спасибо, именно это и интересовало. Приношу извинения за мой дурацкий вопрос по поводу R...2011-03-24T16:20:59Z2011-03-24T16:20:59Zigorkhttps://stocksharp.com/users/6303/info@stocksharp.comGreene-nsk, <br /><br />спасибо, именно это и интересовало. <br />Приношу извинения за мой дурацкий вопрос по поводу RegisterSecurity(). Я действительно не понял, зачем он нужен, потому что у меня в текущей версии (Beta 3.0.18) трансляция SecurityChanged() начинается незамедлительно после того, как отработал NewSecurity(). При этом трансляция изменений SecurityChanged() идет по ВСЕМ биржевым инструментам (?!), и 2 процессора полностью заняты записью этих изменений. Поэтому у меня и возникло два вопроса: (1) как отписаться от уведомлений по ненужным инструментам, и (2) зачем RegisterSecurity(). <br /><br />Сейчас перейду на финальный релиз библиотеки и сделаю вызов RegisterSecurity() - возможно это решит проблему. <br />Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/6998/В том то и дело, что Net - штука прожорливая. Мне обычно нужно 3-5 инструментов, и если уж держать к...2011-03-24T15:39:05Z2011-03-24T15:39:05ZMikhail Sukhovhttps://stocksharp.com/users/201/info@stocksharp.com<div class="quote"><span class="quotetitle">igork <a href="https://stocksharp.com/posts/m/6994/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote">В том то и дело, что Net - штука прожорливая. Мне обычно нужно 3-5 инструментов, и если уж держать кэш всех объектов, то в самом trader, чтобы не писать свой кеширующий компонент.</div></div><br /><br />Именно поэтому SmartTrader и кэширующий компонент.<br /><br /><div class="quote"><span class="quotetitle">igork <a href="https://stocksharp.com/posts/m/6994/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote"><br />Скорее всего, сделаю следующим образом: trader.disconnect() => составление списка инструментов => trader.connect() => ловим ссылку в методе NewSecurity(). Для динамического набора инструментов несколько сложная реализация.<br /></div></div><br /><br />А зачем такая цепочка нужна?<br /><br /><div class="quote"><span class="quotetitle">igork <a href="https://stocksharp.com/posts/m/6994/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote"><br />Ввиду того, что описания методов нет, изучаю по примерам. Тогда к вам встречный вопрос - зачем этот метод используется во всех примеры SampleSmartxxx? Что дает RegisterSecurity и в чем его предназначение? В чем разница между зарегистрированным и незарегистрированым инструментом. <br /></div></div><br /><br />Как это нет описания методов? Все в доке, везде примеры и у каждого метода описание.<br /><br />RegisterSecurity - для того, чтобы получать уведомления по изменениям у инструмента. Его предназначение можно посмотреть в примере SampleSmart.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/6996/Что-то я совсем не понял в чем проблема. Но может смогу чем помочь... 1. Если вы вызывали ITrader.St...2011-03-24T14:34:17Z2011-03-24T14:34:17ZGreene-nskhttps://stocksharp.com/users/27932/info@stocksharp.comЧто-то я совсем не понял в чем проблема. Но может смогу чем помочь...<br /><br />1.<br />Если вы вызывали ITrader.StartExport(), то все символлы сохраняются автоматом в ITrader.Securities. Их оттуда брать так:<br /><br />var securityId = "LKOH@RTS";<br />_lkoh = Trader.Securities.SingleOrDefault(s => s.Id.Equals(securityId));<br /><br />2.<br />SecuritiesChanged будет приходить только для инструментов, для которых вызвано RegisterSecurityCopyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/6994/Спасибо, Михаил, идею понял. В том то и дело, что Net - штука прожорливая. Мне обычно нужно 3-5 инст...2011-03-24T14:10:42Z2011-03-24T14:10:42Zigorkhttps://stocksharp.com/users/6303/info@stocksharp.comСпасибо, Михаил, идею понял. <br /><br />В том то и дело, что Net - штука прожорливая. Мне обычно нужно 3-5 инструментов, и если уж держать кэш всех объектов, то в самом trader, чтобы не писать свой кеширующий компонент. Скорее всего, сделаю следующим образом: trader.disconnect() => составление списка инструментов => trader.connect() => ловим ссылку в методе NewSecurity(). Для динамического набора инструментов несколько сложная реализация.<br /><br />>> Не совсем понял, зачем при получении инструмента указывать портфель.<br />Я же показал optional :-). Пусть будет метод без портфеля. <br /><br />>>>> зачем trader.RegisterSecurity(_lkoh)? <br />>> Не за чем. Я почему появился подобный вопрос?<br /><br />Ввиду того, что описания методов нет, изучаю по примерам. Тогда к вам встречный вопрос - зачем этот метод используется во всех примеры SampleSmartxxx? Что дает RegisterSecurity и в чем его предназначение? В чем разница между зарегистрированным и незарегистрированым инструментом. <br />Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/6988/Данный подход кажется не совсем эффективным. Если я в момент подписки на инструменты еще не имею наб...2011-03-24T08:14:01Z2011-03-24T08:14:01ZMikhail Sukhovhttps://stocksharp.com/users/201/info@stocksharp.com<div class="quote"><span class="quotetitle">igork <a href="https://stocksharp.com/posts/m/6984/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote">Данный подход кажется не совсем эффективным. Если я в момент подписки на инструменты еще не имею набора инструментов либо буду менять их в ходе работы, то как быть? Я не хочу хранить все 15 000 инструментов в памяти.<br /></div></div><br /><br />А в чем смысл такой оптимизации? Это даже и пол мегабайта в памяти не будет занимать. .NET штука прожорливая, на ее фоне не различить разницу между 15 000 и 150 инструментами.<br /><br /><div class="quote"><span class="quotetitle">igork <a href="https://stocksharp.com/posts/m/6984/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote"><br />Извиняюсь, если невнимательно смотрел примеры. Хотелось бы, что бы была возможность в любой момент времени сделать что-то подобное<br /><br />_lkoh = trader.GetSecurity("LKOH@RTS", optional "PORTFOLIO_NAME");<br /><br />и получить необходимый объект для дальнейшего использования при создании ордеров и т.д.. <br /></div></div><br /><br />Не совсем понял, зачем при получении инструмента указывать портфель.<br /><br /><div class="quote"><span class="quotetitle">igork <a href="https://stocksharp.com/posts/m/6984/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote"><br />Как обходной вариант, в данный момент рассматриваю подписку на событие SecurityChanged(). Через это событие идет непрерывная трансляция изменений по инструментам, и можно выловить необходимый объект (за исключением редкоторгуемых). Этот подход в общем виде ничем не лучше предыдщего. Как сделать красиво?<br /></div></div><br /><br />Правильный подход, идти по пути унификации. В трейдинге все передается через события. Значит и инструменты нужно ловить так же... Ловить можно и в NewSecurities. <br /><br /><div class="quote"><span class="quotetitle">igork <a href="https://stocksharp.com/posts/m/6984/"><img src="https://stocksharp.com/images/icon_latest_reply.gif" title="Go to" alt="Go to" /></a></span><div class="innerquote"><br />И еще просьба объяснить последовательность работы с инструментами (Security). Подписываясь на SecurityChanged(), мы получаем возможность проверять коллекцию securities на нужный нам инструмент, типа if (securities.contains(_lkoh)).... . Если трансляция изменений уже идет, то зачем тогда <br /><br />trader.RegisterSecurity(_lkoh)? <br /></div></div><br /><br />Не за чем. Я почему появился подобный вопрос?Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.com/posts/m/6984/Собственно вопрос в том, что инструментов очень много, а нужно 3-4 штуки. Судя по примерам, для нахо...2011-03-23T22:14:08Z2011-03-23T22:14:08Zigorkhttps://stocksharp.com/users/6303/info@stocksharp.comСобственно вопрос в том, что инструментов очень много, а нужно 3-4 штуки. Судя по примерам, для нахождения нужного объекта Security применяется следующие подходы. <br /><br />1. На примере SampleSmartConsole. Вначале просим у пользователя ввести название инструмента (тот же LKOH). Затем подписываемся на NewSecurities <br /><br />trader.NewSecurities += securities => <br />{ if (_lkoh == null)<br /> _lkoh = securities.FirstOrDefault(sec....);<br /> if (_lkoh != null) <br /> нашли объект. <br /><br />2. В SampleSmart применяется фактически та же технология, и вся коллекция сохраняется в памяти формы SecuritiesWindow. В том случае, когда мы ищем какой-то инструмент, то объект находим в коллекции. <br /><br />Данный подход кажется не совсем эффективным. Если я в момент подписки на инструменты еще не имею набора инструментов либо буду менять их в ходе работы, то как быть? Я не хочу хранить все 15 000 инструментов в памяти. Извиняюсь, если невнимательно смотрел примеры. Хотелось бы, что бы была возможность в любой момент времени сделать что-то подобное<br /><br />_lkoh = trader.GetSecurity("LKOH@RTS", optional "PORTFOLIO_NAME");<br /><br />и получить необходимый объект для дальнейшего использования при создании ордеров и т.д.. <br /><br />Как обходной вариант, в данный момент рассматриваю подписку на событие SecurityChanged(). Через это событие идет непрерывная трансляция изменений по инструментам, и можно выловить необходимый объект (за исключением редкоторгуемых). Этот подход в общем виде ничем не лучше предыдщего. Как сделать красиво?<br /><br />И еще просьба объяснить последовательность работы с инструментами (Security). Подписываясь на SecurityChanged(), мы получаем возможность проверять коллекцию securities на нужный нам инструмент, типа if (securities.contains(_lkoh)).... . Если трансляция изменений уже идет, то зачем тогда <br /><br />trader.RegisterSecurity(_lkoh)? <br /><br />Спасибо. Copyright @ StockSharp Platform LLC 2010 - 2024