﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Подскажите по стакану</title>
  <id>~/topic/3163/podskazhite-po-stakanu/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-30T08:04:31Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=3163" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/23111/</id>
    <title type="text">Разбор данных в стакане (например запись в файл) можно осуществить по разному. вот пару решений. Вар...</title>
    <published>2012-12-20T07:43:21Z</published>
    <updated>2012-12-20T08:44:57Z</updated>
    <author>
      <name>Игорь Бакулин</name>
      <uri>https://stocksharp.ru/users/6519/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Разбор данных в стакане (например запись в файл) можно осуществить по разному.&lt;br /&gt;вот пару решений.&lt;br /&gt;&lt;br /&gt;Вариант 1. &lt;br /&gt;Совсем просто.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

   private void OnMarketDepthsChanged(IEnumerable&amp;lt;MarketDepth&amp;gt; depths)
   {
     depths.ForEach(d =&amp;gt;
     {
       if (((d.Security.Id == &amp;quot;RIH3@RTS&amp;quot;)))
         { 
            string rstr = &amp;quot;&amp;quot;;
            rstr = d.ToString()
            string filename = @&amp;quot;c:\1.txt&amp;quot;;  // имя файла задаем
            using (var sw = new StreamWriter(filename))
            {
                sw.WriteLine(rstr);
            }
          }
       });
    }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Можно написать отдельно процедуру разбора строки d.ToString(), если кому надо :)&lt;br /&gt;в файл записывется &lt;br /&gt;...&lt;br /&gt;Бид 150120 3445&lt;br /&gt;Бид 150130 283&lt;br /&gt;Бид 150140 1328&lt;br /&gt;Бид 150150 614&lt;br /&gt;Оффер 150160 307&lt;br /&gt;Оффер 150170 406&lt;br /&gt;Оффер 150180 3021&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Вариант 2. &lt;br /&gt;более сложный, но в нам можно весь стакан сохранить в том виде в каком нужно&lt;br /&gt;тут получается достаточно компактно.&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

   private void OnMarketDepthsChanged(IEnumerable&amp;lt;MarketDepth&amp;gt; depths)
   {
     depths.ForEach(d =&amp;gt;
     {
       if (((d.Security.Id == &amp;quot;RIH3@RTS&amp;quot;)))
         {
            decimal Bask = 0;
            decimal Bbid = 0;

            DateTime dtCur = DateTime.Now;
            string rstrn = string.Format(&amp;quot;{0}:{1}:{2}.{3};&amp;quot;, dtCur.Hour, dtCur.Minute, dtCur.Second, dtCur.Millisecond);
            string rstr = rstrn;

            foreach (var qoute in Trder.GetMarketDepth(d.Security))
            {
                if (qoute.OrderDirection == OrderDirections.Sell)
                {
                    if (Bask == 0)
                    {
                        Bask = qoute.Price;
                        rstr = rstr + &amp;quot;\r\n&amp;quot; + rstrn;
                    }
                    rstr = rstr + string.Format(&amp;quot;{0}/{1};&amp;quot;, qoute.Price, qoute.Volume);
                }
                else
                {   
                    Bbid = qoute.Price;
                        rstr = rstr + string.Format(&amp;quot;{0}/{1};&amp;quot;, qoute.Price, qoute.Volume);
                }                
            }

	    string filename = @&amp;quot;c:\1.txt&amp;quot;;  // имя файла задаем
            using (var sw = new StreamWriter(filename))
            {
                sw.WriteLine(rstr);
            }
        }
    } 
  }); 
 }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;в файл записывется (1-я строчка Биды, 2-я оффера)&lt;br /&gt;...&lt;br /&gt;19:40:49.705;143530/139;143540/131;143550/85;143560/70;143570/25;143580/43;143590/18;143600/55;143610/38;143620/17;&lt;br /&gt;19:40:49.705;143640/35;143650/62;143660/39;143670/37;143680/152;143690/139;143700/197;143710/99;143720/125;143730/568;&lt;br /&gt;19:40:50.125;143530/139;143540/131;143550/85;143560/70;143570/25;143580/43;143590/18;143600/50;143610/40;143620/20;&lt;br /&gt;19:40:50.125;143640/35;143650/62;143660/39;143670/34;143680/152;143690/142;143700/197;143710/99;143720/125;143730/568;&lt;br /&gt;...</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/23112/</id>
    <title type="text">Спустя полгода сделал свой первый стакан Как-то так: var md = Trader.GetMarketDepth(d.Security); str...</title>
    <published>2012-12-20T07:46:28Z</published>
    <updated>2012-12-20T07:46:28Z</updated>
    <author>
      <name>Творог</name>
      <uri>https://stocksharp.ru/users/6511/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Спустя полгода сделал свой первый стакан [biggrin] Как-то так:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

                    var md = Trader.GetMarketDepth(d.Security);
                    string ostr = &amp;quot;&amp;quot;;
                    string bstr = &amp;quot;&amp;quot;;
                    int maxd = 20; // md.MaxDepth / 5;
                    
                    for (int i = 0; i &amp;lt; maxd; i++)
                    {
                        ostr = ostr + string.Format(&amp;quot;Офер {0} = {1} - {2}\n&amp;quot;,
                            maxd - i - 1, md.GetQuote(OrderDirections.Sell, maxd - i - 1).Price, md.GetQuote(OrderDirections.Sell, maxd - i - 1).Volume);
                        bstr = bstr + string.Format(&amp;quot;Бид {0} = {1} - {2}\n&amp;quot;,
                            i, md.GetQuote(OrderDirections.Buy, i).Price, md.GetQuote(OrderDirections.Buy, i).Volume);
                    }
                    tb1.Text = ostr + bstr;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/23081/</id>
    <title type="text">Вставил такой код для вывода в текстбокс tb1 стакана: private void OnMarketDepthsChanged(IEnumerable...</title>
    <published>2012-12-19T10:02:09Z</published>
    <updated>2012-12-19T10:02:09Z</updated>
    <author>
      <name>Творог</name>
      <uri>https://stocksharp.ru/users/6511/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Вставил такой код для вывода в текстбокс &lt;b&gt;tb1&lt;/b&gt; стакана:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

        private void OnMarketDepthsChanged(IEnumerable&amp;lt;MarketDepth&amp;gt; depths)
        {
            depths.ForEach(d =&amp;gt;
            {
                if (((d.Security.Id == &amp;quot;RIH3@RTS&amp;quot;)))
                {
                    var md = Trader.GetMarketDepth(d.Security);
                    string ostr = &amp;quot;&amp;quot;;
                    string bstr = &amp;quot;&amp;quot;;
                    int maxd = md.MaxDepth;

                    for (int i = 0; i &amp;lt; maxd; i++)
                    {
                        ostr = ostr + string.Format(&amp;quot;Офер {0} = {1}\n&amp;quot;, i, md.GetQuote(1, i));
                        bstr = bstr + string.Format(&amp;quot;Бид {0} = {1}\n&amp;quot;, i, md.GetQuote(0, i));
                    }
                    tb1.Text = ostr + bstr;
                }
            });
        }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;В релультате получаю стакан, но форматированный не по моему шаблону, а типа&lt;br /&gt;&lt;em&gt;Бид 11 = Бид 152270 75&lt;/em&gt;&lt;br /&gt;Как всё-таки выудить отдельно цену и отдельно объём?&lt;br /&gt;&lt;br /&gt;А по оферам в методе GetQuote задан неправильный аргумент, т.е. 0 работает, а единичка нет. Там тип Int должен быть, как правильно задать?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/22742/</id>
    <title type="text">что бы получать данные из стаканов в WPF нужно 1. Подключиться к квику. 2. Начать получать данные по...</title>
    <published>2012-11-30T17:02:31Z</published>
    <updated>2012-11-30T17:02:31Z</updated>
    <author>
      <name>Игорь Бакулин</name>
      <uri>https://stocksharp.ru/users/6519/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">что бы получать данные из стаканов в WPF нужно&lt;br /&gt;&lt;br /&gt;1. Подключиться к квику.&lt;br /&gt;2. Начать получать данные по DDE&lt;br /&gt;&lt;br /&gt;3. прописать грамотное отсоединение от DEE при выходе&lt;br /&gt;&lt;br /&gt;вот примерная реализация&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

        public MainWindow()
        {
            InitializeComponent();
            Loaded += StartCon;
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            if (Trder != null)
            {
                Trder.StopExport();
                Trder.Dispose();
            }

            base.OnClosing(e);
        }

        private void StartCon(object sender, RoutedEventArgs e)
        {
                    if (Trder == null)
                    {
                        Trder = new QuikTrader(QuikTerminal.GetDefaultPath());

                        Trder.ReConnectionSettings.Interval = TimeSpan.FromSeconds(10);
                        Trder.ReConnectionSettings.WorkingTime = Exchange.Rts.WorkingTime;
                        Trder.ReConnectionSettings.ConnectionRestored +=
                            () =&amp;gt; this.GuiAsync(() =&amp;gt; MessageBox.Show(this, &amp;quot;Соединение восстановлено&amp;quot;));
                        Trder.ConnectionError += error =&amp;gt; this.GuiAsync(() =&amp;gt; MessageBox.Show(this, error.ToString()));

// Тут регистрация инструментов по которым нужны данные
                        Trder.NewSecurities += securities =&amp;gt; this.GuiAsync(() =&amp;gt; OnNewSecurities(securities));
// Эта процедура будет вызываться каждый раз когда стаканы изменятся. 
                        Trder.MarketDepthsChanged += depths =&amp;gt; this.GuiAsync(() =&amp;gt; OnMarketDepthsChanged(depths));

                        Trder.ProcessDataError += ex =&amp;gt; System.Diagnostics.Debug.WriteLine(ex);
                        Trder.Connected += () =&amp;gt; Trder.StartExport();

                        Trder.Connect();
                    }
        }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Для лучшей читабельности вынес регистрацию инструментов в отдельное место&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

        private void OnNewSecurities(IEnumerable&amp;lt;Security&amp;gt; securities)
        {
            securities.ForEach(s =&amp;gt;
            {
                 if ((s.Id == &amp;quot;SBER@EQBR&amp;quot;) || (s.Id == &amp;quot;SRZ2@RTS&amp;quot;))
                 {
                     Trder.RegisterSecurity(s);
                     Trder.RegisterMarketDepth(s);
                 }
            });
        }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Только после этого данные начнут приходить для выбранных инструментов!&lt;br /&gt;Ну и как пример обработка изменений стакана.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

        private void OnMarketDepthsChanged(IEnumerable&amp;lt;MarketDepth&amp;gt; depths)
        {
            depths.ForEach(d =&amp;gt;
                {
                    if ((d.Security.Id == &amp;quot;SBER@EQBR&amp;quot;) || (d.Security.Id == &amp;quot;SRZ2@RTS&amp;quot;))
                    {
                        string blp = &amp;quot;&amp;quot;;
                        string btm = &amp;quot;&amp;quot;;
                        string bbid = string.Format(&amp;quot;{0}&amp;quot;, d.Security.BestBid.Price);
                        string bask = string.Format(&amp;quot;{0}&amp;quot;, d.Security.BestAsk.Price);
                        if (d.Security.LastTrade != null)
                        {
                            blp = string.Format(&amp;quot;{0}&amp;quot;, d.Security.LastTrade.Price);
                            btm = string.Format(&amp;quot;{0}&amp;quot;, d.Security.LastTrade.Time);
                        }
// Тут выводим что надо на форму
                        DispData(d.Security.Id, bbid, bask, blp, btm);
                    }
                });
        }
		
        private void DispData(string acapt, string abid, string aask, string alp, string atm)
        {
            if (acapt == &amp;quot;SBER@EQBR&amp;quot;)
            {
// EdХХХ это ТекстБоксы в xaml

                EdTikSr.Text = acapt;
                EdAskSr.Text = aask;
                EdBidSr.Text = abid;
                EdLprSr.Text = alp;
                EdTmSr.Text = atm;
            }

            if (acapt == &amp;quot;SRZ2@RTS&amp;quot;)
            {
                EdTikVb.Text = acapt;
                EdAskVb.Text = aask;
                EdBidVb.Text = abid;
                EdLprVb.Text = alp;
                EdTmVb.Text = atm;
            }
        }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/22499/</id>
    <title type="text">Нужно подписаться на событие обновления стакана. P.S. Пользуясь случаем, не могу не спросить, глубин...</title>
    <published>2012-11-14T06:13:22Z</published>
    <updated>2012-11-14T06:14:57Z</updated>
    <author>
      <name>nuan</name>
      <uri>https://stocksharp.ru/users/6492/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Нужно подписаться на событие обновления стакана.&lt;br /&gt;P.S. Пользуясь случаем, не могу не спросить, глубина стакана может быть разная в каждую сторону, та, которая передается это минимальная или средняя??</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/22459/</id>
    <title type="text">Код такой: Security item = (Security)Securities.SelectedItem; _trader.RegisterMarketDepth(item); Sys...</title>
    <published>2012-11-13T05:07:03Z</published>
    <updated>2012-11-13T05:07:03Z</updated>
    <author>
      <name>Danny</name>
      <uri>https://stocksharp.ru/users/6473/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Код такой:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

Security item = (Security)Securities.SelectedItem;
_trader.RegisterMarketDepth(item);
System.Threading.Thread.Sleep(10000);
MarketDepth itt = _trader.GetMarketDepth(item);
if (itt != null)
{
   for (int i = 0; i &amp;lt; 10; i++)
   {
      Console.WriteLine(&amp;quot;itt.BestAsk.Price=&amp;quot; + itt.BestAsk.Price);
   }
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Почему itt.BestAsk принимает значение null при входе в цикл.(стакан выбранного инструмента открывается в Quik)&lt;br /&gt;item задается через combobox как в примере.&lt;br /&gt;&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>