﻿<?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">Обновление инструментов через SmartCOM</title>
  <id>~/topic/2037/obnovlenie-instrumentov-cherez-smartcom/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-05T21:02:05Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=2037" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/12555/</id>
    <title type="text">Спасибо. Как только немного разберусь с .Net, CodePlex и Hydra, буду коммитить. </title>
    <published>2011-10-20T11:18:32Z</published>
    <updated>2011-10-20T11:18:32Z</updated>
    <author>
      <name>Marco</name>
      <uri>https://stocksharp.com/users/6041/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Спасибо. Как только немного разберусь с .Net, CodePlex и Hydra, буду коммитить.&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/12553/</id>
    <title type="text">Ага, на CodePlex я зарегистрировался, логин - donmarco. Нужны от меня еще какие-либо шаги, чтобы пол...</title>
    <published>2011-10-20T10:37:15Z</published>
    <updated>2011-10-20T10:37:15Z</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;Marco &lt;a href="https://stocksharp.com/posts/m/12552/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Ага, на CodePlex я зарегистрировался, логин - donmarco. Нужны от меня еще какие-либо шаги, чтобы получить доступ к репозиторию на запись? Есть ли какой-нибудь регламент работы над проектом (ветки и т.д.)?&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Доступ дал. Инструкция на сайте. Регламент простой, табы вместо пробелов, код проверяем R#-ом.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Marco &lt;a href="https://stocksharp.com/posts/m/12552/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;За замечания спасибо. :) Портфели - я думал, что нужно их регистрировать для получения списка бумаг. Проверил - действительно портфели ни при чем. Что касается Sleep&amp;#39;а - я не знал, как планируются потоки в .Net, почитаю документацию. В native-коде вызов sleep привел бы к переключению потока. Здесь он действительно не нужен.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Sleep - это и есть native код.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/12552/</id>
    <title type="text">Ага, на CodePlex я зарегистрировался, логин - donmarco. Нужны от меня еще какие-либо шаги, чтобы пол...</title>
    <published>2011-10-20T08:33:37Z</published>
    <updated>2011-10-20T08:33:37Z</updated>
    <author>
      <name>Marco</name>
      <uri>https://stocksharp.com/users/6041/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Ага, на CodePlex я зарегистрировался, логин - donmarco. Нужны от меня еще какие-либо шаги, чтобы получить доступ к репозиторию на запись? Есть ли какой-нибудь регламент работы над проектом (ветки и т.д.)?&lt;br /&gt;&lt;br /&gt;За замечания спасибо. :) Портфели - я думал, что нужно их регистрировать для получения списка бумаг. Проверил - действительно портфели ни при чем. Что касается Sleep&amp;#39;а - я не знал, как планируются потоки в .Net, почитаю документацию. В native-коде вызов sleep привел бы к переключению потока. Здесь он действительно не нужен.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/12542/</id>
    <title type="text">Проблему я вроде бы поправил. Но так как я с архитектурой проекта практически не знаком, я бы попрос...</title>
    <published>2011-10-19T23:28:58Z</published>
    <updated>2011-10-19T23:29:26Z</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;Marco &lt;a href="https://stocksharp.com/posts/m/12535/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Проблему я вроде бы поправил. Но так как я с архитектурой проекта практически не знаком, я бы попросил знающих людей по возможности посмотреть мои исправления и по проверить их на подключении через другие источники данных.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Лучше через логин на КодеПлексе, сами закоммитите. Думаю, не в первый и не в последний раз будете Гидру править. Там много что еще нужно доделывать.&lt;br /&gt;&lt;br /&gt;По коду ряд замечаний:&lt;br /&gt;&lt;br /&gt;1. Портфели тут явно не причем. Зачем было вызывать их экспорт?&lt;br /&gt;2. Проблема с появлением инструментов в Sleep. Sleep замораживает поток. Wait - блокирует (но он продолжает &amp;quot;жить&amp;quot;). Соответственно, COM события не могут отправиться, так как оконный поток заморожен. Зачем вы Sleep оставили я так и не понял.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/12535/</id>
    <title type="text">Столкнулся с тем, что Hydra не обновляет список инструментов из Smart&amp;apos;а. При попытке обновления прог...</title>
    <published>2011-10-19T19:40:04Z</published>
    <updated>2011-10-19T19:40:04Z</updated>
    <author>
      <name>Marco</name>
      <uri>https://stocksharp.com/users/6041/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Столкнулся с тем, что Hydra не обновляет список инструментов из Smart&amp;#39;а. При попытке обновления программа надолго задумывается, после чего выводит сообщение &amp;quot;Добавлено 0 инструментов&amp;quot;.  Hydra версии 4.0.3.&lt;br /&gt;&lt;br /&gt;Проблему я вроде бы поправил. Но так как я с архитектурой проекта практически не знаком, я бы попросил знающих людей по возможности посмотреть мои исправления и по проверить их на подключении через другие источники данных.  &lt;br /&gt;&lt;br /&gt;Исправления вносились в классы  StockSharp.Hydra.Core.MarketDataTrader и  StockSharp.Hydra.Core.MarketDataTrader.SecurityUpdate. &lt;br /&gt;&lt;br /&gt;Суть изменений: &lt;br /&gt;- Метод MarketDataTrader.Start() ожидал получения данных об инструментах, но экспорт инструментов не запрашивался. Была добавлена обработка информации о портфелях и вызов RegisterPortfolio для каждого полученного портфеля.&lt;br /&gt;- Экземпляр класса SecurityUpdate создавался после вызова Trader.Connect(). Теоретически SecurityUpdate мог опоздать с подключением к событию NewSecurities. Создание SecurityUpdate было перенесено до вызова Trader.Connect().&lt;br /&gt;- События NewPortfolio/NewSecurities не вызывались до завершения SecurityUpdate.Run(), несмотря на наличие вызова Sleep() в теле этого метода. Метод Run() переписан с использованием объекта синхронизации.&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;pre class="brush:csharp"&gt;
        
private void OnNewPortfolios(IEnumerable&amp;lt;Portfolio&amp;gt; portfolios)
        {
            portfolios.ForEach(portfolio =&amp;gt; Trader.RegisterPortfolio(portfolio));
        }

		/// &amp;lt;summary&amp;gt;
		/// Запустить накопление маркет-данных.
		/// &amp;lt;/summary&amp;gt;
		public void Start()
		{
			Trader = _createTrader();

			try
			{
				((BaseTrader)Trader).EntityFactory = new MarketDataEntityFactory(_securityStorage);

				Trader.ProcessDataError += OnError;
				Trader.Connected += OnConnected;
				Trader.NewTrades += OnNewTrades;
				Trader.QuotesChanged += OnQuotesChanged;
                Trader.NewPortfolios += OnNewPortfolios;

                using (var su = new SecurityUpdate(Trader))
                {                    

                    Trader.Connect();

                    lock (_connectedLock)
                    {
                        if (!Trader.IsConnected &amp;amp;&amp;amp; !Monitor.Wait(_connectedLock, TimeSpan.FromSeconds(20)))
                            throw new TimeoutException(&amp;quot;Ожидание подключения превысило максимально допустимый интервал.&amp;quot;);
                    }

                    su.Run();
                }
               
			}
			catch
			{
				Trader.Dispose();
				throw;
			}
		}
		
		/// &amp;lt;summary&amp;gt;
		/// Остановить накопление маркет-данных.
		/// &amp;lt;/summary&amp;gt;
		public void Stop()
		{
            foreach (Portfolio portfolio in Trader.Portfolios) Trader.UnRegisterPortfolio(portfolio);

			Trader.ProcessDataError -= OnError;
			Trader.Connected -= OnConnected;
			Trader.NewTrades -= OnNewTrades;
			Trader.QuotesChanged -= OnQuotesChanged;
            Trader.NewPortfolios -= OnNewPortfolios;

			Trader.Dispose();

			LastError = null;
		}

		private sealed class SecurityUpdate : Disposable
		{
			private readonly ITrader _trader;

            private readonly object _securitiesLock = new object();
             
			public SecurityUpdate(ITrader trader)
			{
				_trader = trader;
				_trader.NewSecurities += OnNewSecurities;
			}

			public void Run()
			{
                int waitSeconds = 180;  // initial delay

				while (true)
				{
					Thread.Sleep(500);
                    lock (_securitiesLock)
                    {
                        if (!Monitor.Wait(_securitiesLock, TimeSpan.FromSeconds(waitSeconds)))
                            break;

                        waitSeconds = 30;  // if we have received a first portion of data, change delay to 30 seconds
                    }
				}
			}

			void OnNewSecurities(IEnumerable&amp;lt;Security&amp;gt; securities)
			{
                lock (_securitiesLock)
                    Monitor.PulseAll(_securitiesLock);
			}

			protected override void DisposeManaged()
			{
				_trader.NewSecurities -= OnNewSecurities;
			}
		}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>