﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Эффективное создание объектов Security</title>
  <id>~/topic/1470/ehffektivnoe-sozdanie-obektov-security/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-21T20:39:23Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=1470" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/7014/</id>
    <title type="text">Исключительно для информации. 1. еще до испольования RegisterSecurity(), после выполнения методов Co...</title>
    <published>2011-03-25T05:59:07Z</published>
    <updated>2011-03-25T05:59:07Z</updated>
    <author>
      <name>Greene-nsk</name>
      <uri>https://stocksharp.com/users/27932/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;igork &lt;a href="https://stocksharp.com/posts/m/7010/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Исключительно для информации.  &lt;br /&gt;&lt;br /&gt;1. еще до испольования RegisterSecurity(), после выполнения методов Connect() и последующего StartExport() все время получаю 960-980 штук вызовов SecurityChanged(). Список securities всегда постоянный, последнее событие приходит по &amp;quot;eMiniNDQ_1003&amp;quot;. Могу прислать журнал. Вызовы можно проигнорировать с помощью доп. логики, но было бы здорово не генерировать лишние уведомления до того момента, как выполнена первая подписка. Гоняю прототип робота в отладчике VS2010, подключен к основному серверу SmartCom. &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Такое, наверное, возможно сразу после получения инфы по символам. Я не разбирался. Потом, когда символы получены, ITrader.SecuritiesChanged приходят только для символов, которые подписаны.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;2. С портфелями не все понятно. Для получения состояния портфелей делаю все по примеру&lt;br /&gt;&lt;br /&gt;this.trader.NewPortfolios += portfolios =&amp;gt; {this.SmartProcessPortfolios(portfolios); };&lt;br /&gt;&lt;br /&gt;private void SmartProcessPortfolios(IEnumerable&amp;lt;Portfolio&amp;gt; portfolios) &lt;br /&gt;{&lt;br /&gt;    foreach (Portfolio p in portfolios)&lt;br /&gt;        UpdateDB(p); // пишем в память и в базу&lt;br /&gt;&lt;br /&gt;    trader.RegisterPortfolio(p);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Вызов отрабатывает, имена портфелей приходят, но BeginAmount, CurrentAmount, Leverage и т.д. - все свойства = 0. &lt;br /&gt;Насколько я понимаю, необходимо обождать секунд 10 и пройтись по trader.portfolio[i].... При этом значения BeginAmount, CurrentAmount и т.д. заполяются. Но тоже наблюдется странное поведение. Два портфеля с балансами &amp;gt; 1.000.000 видит, а один портфель с балансом 135 рублей игнорирует (CurrentAmount всегда = 0).&lt;br /&gt;&lt;br /&gt;Безопасно ли, например, по таймеру опрашивать коллекцию trader.Portfolios для получения баланса счетов?  &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Да. Это особенность SMartCOM. Он сначала посылает нулевые балансы, а потом через некоторое время через             ITrader.PortfoliosChanged посылает обновление.&lt;br /&gt;Я в своем коде жду не само появление портфеля, а портфеля именно с положительным балансом.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;br /&gt;        public Portfolio Portfolio(string portfolioName)&lt;br /&gt;        {&lt;br /&gt;            // ждем нужное портфолио&lt;br /&gt;            if (!Trader.Portfolios.Any(p =&amp;gt; p.Name.Equals(portfolioName) &amp;amp;&amp;amp; p.CurrentAmount.Value &amp;gt; 0))&lt;br /&gt;            {&lt;br /&gt;                Log.Out(&amp;quot;Ждем портфолио &amp;quot; + portfolioName + &amp;quot; с положительным балансом...&amp;quot;, LogLevel.notice);&lt;br /&gt;&lt;br /&gt;                DateTime dtNow = DateTime.Now;&lt;br /&gt;                while (!Trader.Portfolios.Any(p =&amp;gt; p.Name.Equals(portfolioName) &amp;amp;&amp;amp; p.CurrentAmount.Value &amp;gt; 0))&lt;br /&gt;                {&lt;br /&gt;                    if (DateTime.Now - dtNow &amp;gt; TimeSpan.FromMinutes(2))&lt;br /&gt;                        Log.OutErrorFatal(&amp;quot;Портфолио не найден или имеет отрицательный баланс: &amp;quot; + portfolioName);&lt;br /&gt;                    Thread.Sleep(100);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            return Trader.Portfolios.SingleOrDefault(p =&amp;gt; p.Name.Equals(portfolioName));&lt;br /&gt;        }&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/7010/</id>
    <title type="text">Исключительно для информации. 1. еще до испольования RegisterSecurity(), после выполнения методов Co...</title>
    <published>2011-03-24T19:38:17Z</published>
    <updated>2011-03-24T19:38:17Z</updated>
    <author>
      <name>igork</name>
      <uri>https://stocksharp.com/users/6303/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Исключительно для информации.  &lt;br /&gt;&lt;br /&gt;1. еще до испольования RegisterSecurity(), после выполнения методов Connect() и последующего StartExport() все время получаю 960-980 штук вызовов SecurityChanged(). Список securities всегда постоянный, последнее событие приходит по &amp;quot;eMiniNDQ_1003&amp;quot;. Могу прислать журнал. Вызовы можно проигнорировать с помощью доп. логики, но было бы здорово не генерировать лишние уведомления до того момента, как выполнена первая подписка. Гоняю прототип робота в отладчике VS2010, подключен к основному серверу SmartCom. &lt;br /&gt;&lt;br /&gt;2. С портфелями не все понятно. Для получения состояния портфелей делаю все по примеру&lt;br /&gt;&lt;br /&gt;this.trader.NewPortfolios += portfolios =&amp;gt; {this.SmartProcessPortfolios(portfolios); };&lt;br /&gt;&lt;br /&gt;private void SmartProcessPortfolios(IEnumerable&amp;lt;Portfolio&amp;gt; portfolios) &lt;br /&gt;{&lt;br /&gt;    foreach (Portfolio p in portfolios)&lt;br /&gt;        UpdateDB(p); // пишем в память и в базу&lt;br /&gt;&lt;br /&gt;    trader.RegisterPortfolio(p);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Вызов отрабатывает, имена портфелей приходят, но BeginAmount, CurrentAmount, Leverage и т.д. - все свойства = 0. &lt;br /&gt;Насколько я понимаю, необходимо обождать секунд 10 и пройтись по trader.portfolio[i].... При этом значения BeginAmount, CurrentAmount и т.д. заполяются. Но тоже наблюдется странное поведение. Два портфеля с балансами &amp;gt; 1.000.000 видит, а один портфель с балансом 135 рублей игнорирует (CurrentAmount всегда = 0).&lt;br /&gt;&lt;br /&gt;Безопасно ли, например, по таймеру опрашивать коллекцию trader.Portfolios для получения баланса счетов?  </content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/7002/</id>
    <title type="text">Greene-nsk, спасибо, именно это и интересовало. Приношу извинения за мой дурацкий вопрос по поводу R...</title>
    <published>2011-03-24T16:20:59Z</published>
    <updated>2011-03-24T16:20:59Z</updated>
    <author>
      <name>igork</name>
      <uri>https://stocksharp.com/users/6303/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Greene-nsk, &lt;br /&gt;&lt;br /&gt;спасибо, именно это и интересовало. &lt;br /&gt;Приношу извинения за мой дурацкий вопрос по поводу RegisterSecurity(). Я действительно не понял, зачем он нужен, потому что у меня в текущей версии (Beta 3.0.18) трансляция SecurityChanged() начинается незамедлительно после того, как отработал NewSecurity(). При этом трансляция изменений SecurityChanged() идет по ВСЕМ биржевым инструментам (?!), и 2 процессора полностью заняты записью этих изменений. Поэтому у меня и возникло два вопроса: (1) как отписаться от уведомлений по ненужным инструментам, и (2) зачем RegisterSecurity(). &lt;br /&gt;&lt;br /&gt;Сейчас перейду на финальный релиз библиотеки и сделаю вызов RegisterSecurity() - возможно это решит проблему. &lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6998/</id>
    <title type="text">В том то и дело, что Net - штука прожорливая. Мне обычно нужно 3-5 инструментов, и если уж держать к...</title>
    <published>2011-03-24T15:39:05Z</published>
    <updated>2011-03-24T15:39:05Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;igork &lt;a href="https://stocksharp.com/posts/m/6994/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;В том то и дело, что Net - штука прожорливая. Мне обычно нужно 3-5 инструментов, и если уж держать кэш всех объектов, то в самом trader, чтобы не писать свой кеширующий компонент.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Именно поэтому SmartTrader и кэширующий компонент.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;igork &lt;a href="https://stocksharp.com/posts/m/6994/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;Скорее всего, сделаю следующим образом: trader.disconnect() =&amp;gt; составление списка инструментов =&amp;gt; trader.connect() =&amp;gt; ловим ссылку в методе NewSecurity(). Для динамического набора инструментов несколько сложная реализация.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;А зачем такая цепочка нужна?&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;igork &lt;a href="https://stocksharp.com/posts/m/6994/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;Ввиду того, что описания методов нет, изучаю по примерам. Тогда к вам встречный вопрос - зачем этот метод используется во всех примеры SampleSmartxxx? Что дает RegisterSecurity и в чем его предназначение? В чем разница между зарегистрированным и незарегистрированым инструментом.  &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Как это нет описания методов? Все в доке, везде примеры и у каждого метода описание.&lt;br /&gt;&lt;br /&gt;RegisterSecurity - для того, чтобы получать уведомления по изменениям у инструмента. Его предназначение можно посмотреть в примере SampleSmart.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6996/</id>
    <title type="text">Что-то я совсем не понял в чем проблема. Но может смогу чем помочь... 1. Если вы вызывали ITrader.St...</title>
    <published>2011-03-24T14:34:17Z</published>
    <updated>2011-03-24T14:34:17Z</updated>
    <author>
      <name>Greene-nsk</name>
      <uri>https://stocksharp.com/users/27932/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Что-то я совсем не понял в чем проблема. Но может смогу чем помочь...&lt;br /&gt;&lt;br /&gt;1.&lt;br /&gt;Если вы вызывали ITrader.StartExport(), то все символлы сохраняются автоматом в ITrader.Securities. Их оттуда брать так:&lt;br /&gt;&lt;br /&gt;var securityId = &amp;quot;LKOH@RTS&amp;quot;;&lt;br /&gt;_lkoh = Trader.Securities.SingleOrDefault(s =&amp;gt; s.Id.Equals(securityId));&lt;br /&gt;&lt;br /&gt;2.&lt;br /&gt;SecuritiesChanged будет приходить только для инструментов, для которых вызвано RegisterSecurity</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6994/</id>
    <title type="text">Спасибо, Михаил, идею понял. В том то и дело, что Net - штука прожорливая. Мне обычно нужно 3-5 инст...</title>
    <published>2011-03-24T14:10:42Z</published>
    <updated>2011-03-24T14:10:42Z</updated>
    <author>
      <name>igork</name>
      <uri>https://stocksharp.com/users/6303/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Спасибо, Михаил, идею понял. &lt;br /&gt;&lt;br /&gt;В том то и дело, что Net - штука прожорливая. Мне обычно нужно 3-5 инструментов, и если уж держать кэш всех объектов, то в самом trader, чтобы не писать свой кеширующий компонент. Скорее всего, сделаю следующим образом: trader.disconnect() =&amp;gt; составление списка инструментов =&amp;gt; trader.connect() =&amp;gt; ловим ссылку в методе NewSecurity(). Для динамического набора инструментов несколько сложная реализация.&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt; Не совсем понял, зачем при получении инструмента указывать портфель.&lt;br /&gt;Я же показал optional :-). Пусть будет метод без портфеля. &lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; зачем trader.RegisterSecurity(_lkoh)? &lt;br /&gt;&amp;gt;&amp;gt;  Не за чем. Я почему появился подобный вопрос?&lt;br /&gt;&lt;br /&gt;Ввиду того, что описания методов нет, изучаю по примерам. Тогда к вам встречный вопрос - зачем этот метод используется во всех примеры SampleSmartxxx? Что дает RegisterSecurity и в чем его предназначение? В чем разница между зарегистрированным и незарегистрированым инструментом.  &lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6988/</id>
    <title type="text">Данный подход кажется не совсем эффективным. Если я в момент подписки на инструменты еще не имею наб...</title>
    <published>2011-03-24T08:14:01Z</published>
    <updated>2011-03-24T08:14:01Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;igork &lt;a href="https://stocksharp.com/posts/m/6984/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Данный подход кажется не совсем эффективным. Если я в момент подписки на инструменты еще не имею набора инструментов либо буду менять их в ходе работы, то как быть? Я не хочу хранить все 15 000 инструментов в памяти.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;А в чем смысл такой оптимизации? Это даже и пол мегабайта в памяти не будет занимать. .NET штука прожорливая, на ее фоне не различить разницу между 15 000 и 150 инструментами.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;igork &lt;a href="https://stocksharp.com/posts/m/6984/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;Извиняюсь, если невнимательно смотрел примеры. Хотелось бы, что бы была возможность в любой момент времени сделать что-то подобное&lt;br /&gt;&lt;br /&gt;_lkoh = trader.GetSecurity(&amp;quot;LKOH@RTS&amp;quot;, optional &amp;quot;PORTFOLIO_NAME&amp;quot;);&lt;br /&gt;&lt;br /&gt;и получить необходимый объект для дальнейшего использования при создании ордеров и т.д.. &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Не совсем понял, зачем при получении инструмента указывать портфель.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;igork &lt;a href="https://stocksharp.com/posts/m/6984/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;Как обходной вариант, в данный момент рассматриваю подписку на событие SecurityChanged(). Через это событие идет непрерывная трансляция изменений по инструментам, и можно выловить необходимый объект (за исключением редкоторгуемых). Этот подход в общем виде ничем не лучше предыдщего. Как сделать красиво?&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Правильный подход, идти по пути унификации. В трейдинге все передается через события. Значит и инструменты нужно ловить так же... Ловить можно и в NewSecurities. &lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;igork &lt;a href="https://stocksharp.com/posts/m/6984/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;И еще просьба объяснить последовательность работы с инструментами (Security). Подписываясь на SecurityChanged(), мы получаем возможность проверять коллекцию securities на нужный нам инструмент, типа if (securities.contains(_lkoh)).... . Если трансляция изменений уже идет, то зачем тогда &lt;br /&gt;&lt;br /&gt;trader.RegisterSecurity(_lkoh)? &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Не за чем. Я почему появился подобный вопрос?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6984/</id>
    <title type="text">Собственно вопрос в том, что инструментов очень много, а нужно 3-4 штуки. Судя по примерам, для нахо...</title>
    <published>2011-03-23T22:14:08Z</published>
    <updated>2011-03-23T22:14:08Z</updated>
    <author>
      <name>igork</name>
      <uri>https://stocksharp.com/users/6303/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Собственно вопрос в том, что инструментов очень много, а нужно 3-4 штуки. Судя по примерам, для нахождения нужного объекта Security применяется следующие подходы. &lt;br /&gt;&lt;br /&gt;1. На примере SampleSmartConsole. Вначале просим у пользователя ввести название инструмента (тот же LKOH). Затем подписываемся на NewSecurities &lt;br /&gt;&lt;br /&gt;trader.NewSecurities += securities =&amp;gt; &lt;br /&gt;{ if (_lkoh == null)&lt;br /&gt;      _lkoh = securities.FirstOrDefault(sec....);&lt;br /&gt;      if (_lkoh != null) &lt;br /&gt;          нашли объект. &lt;br /&gt;&lt;br /&gt;2. В SampleSmart применяется фактически та же технология, и вся коллекция сохраняется в памяти формы SecuritiesWindow. В том случае, когда мы ищем какой-то инструмент, то объект находим в коллекции. &lt;br /&gt;&lt;br /&gt;Данный подход кажется не совсем эффективным. Если я в момент подписки на инструменты еще не имею набора инструментов либо буду менять их в ходе работы, то как быть? Я не хочу хранить все 15 000 инструментов в памяти. Извиняюсь, если невнимательно смотрел примеры. Хотелось бы, что бы была возможность в любой момент времени сделать что-то подобное&lt;br /&gt;&lt;br /&gt;_lkoh = trader.GetSecurity(&amp;quot;LKOH@RTS&amp;quot;, optional &amp;quot;PORTFOLIO_NAME&amp;quot;);&lt;br /&gt;&lt;br /&gt;и получить необходимый объект для дальнейшего использования при создании ордеров и т.д.. &lt;br /&gt;&lt;br /&gt;Как обходной вариант, в данный момент рассматриваю подписку на событие SecurityChanged(). Через это событие идет непрерывная трансляция изменений по инструментам, и можно выловить необходимый объект (за исключением редкоторгуемых). Этот подход в общем виде ничем не лучше предыдщего. Как сделать красиво?&lt;br /&gt;&lt;br /&gt;И еще просьба объяснить последовательность работы с инструментами (Security). Подписываясь на SecurityChanged(), мы получаем возможность проверять коллекцию securities на нужный нам инструмент, типа if (securities.contains(_lkoh)).... . Если трансляция изменений уже идет, то зачем тогда &lt;br /&gt;&lt;br /&gt;trader.RegisterSecurity(_lkoh)? &lt;br /&gt;&lt;br /&gt;Спасибо. </content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>