﻿<?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">PlazaTable, PlazaSystemTable - что-то одно.</title>
  <id>~/topic/1459/plazatable-plazasystemtable---chto-to-odno_/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-16T15:47:21Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=1459" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/6974/</id>
    <title type="text">aspirant: Mikhail Sukhov: Интересно, а зачем потоку еще раз указывать название, если до этого уже ск...</title>
    <published>2011-03-23T13:15:52Z</published>
    <updated>2011-03-23T13:15:52Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6966)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6962)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Интересно, а зачем потоку еще раз указывать название, если до этого уже сказали через _dataStream.StreamName&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mea culpa.  Вот правильный кусок кода:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;_dataStream.StreamName = &amp;quot;FORTS_OPTCOMMON_REPL&amp;quot;;
// вторым параметром указывается название dbScheme, можно &amp;quot;&amp;quot;, если dbScheme:CustReplScheme (дефолтная)
_dataStream.TableSet.InitFromIni2(_configFileName, &amp;quot;&amp;quot;);&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
Интересно, а можно в одном файле сохранять все схемы?
&lt;/code&gt;&lt;/pre&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6966/</id>
    <title type="text">Mikhail Sukhov: Интересно, а зачем потоку еще раз указывать название, если до этого уже сказали чере...</title>
    <published>2011-03-23T08:54:56Z</published>
    <updated>2011-03-23T08:54:56Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6962)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Интересно, а зачем потоку еще раз указывать название, если до этого уже сказали через _dataStream.StreamName&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mea culpa.  Вот правильный кусок кода:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;_dataStream.StreamName = &amp;quot;FORTS_OPTCOMMON_REPL&amp;quot;;
// вторым параметром указывается название dbScheme, можно &amp;quot;&amp;quot;, если dbScheme:CustReplScheme (дефолтная)
_dataStream.TableSet.InitFromIni2(_configFileName, &amp;quot;&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6962/</id>
    <title type="text">aspirant: У нее есть внутреннее знание [smile] В следующем коде произойдет исключение, если хотя бы ...</title>
    <published>2011-03-23T08:06:54Z</published>
    <updated>2011-03-23T08:06:54Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6960)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;
У нее есть внутреннее знание [smile] В следующем коде произойдет исключение, если хотя бы одна из колонок указана неправильно:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;_dataStream.TableSet.InitFromIni2(_configFileName, &amp;quot;FORTS_OPTCOMMON_REPL&amp;quot;);&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
Интересно, а зачем потоку еще раз указывать название, если до этого уже сказали через _dataStream.StreamName
&lt;/code&gt;&lt;/pre&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6960/</id>
    <title type="text">Mikhail Sukhov: В итоге то к чему пришли? Пришли, что это будет в списке второстепенных задач по пот...</title>
    <published>2011-03-23T05:22:00Z</published>
    <updated>2011-03-23T05:22:00Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6958)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
В итоге то к чему пришли?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Пришли, что это будет в списке второстепенных задач по потокам, но я сделал сразу, потому что это оказалось быстрее, чем я предполагал.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6958)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
А как Плаза отпределяет, что для потока FORTS_OPTCOMMON_REPL нужен вот тот файл ini а не какой то другой?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;У нее есть внутреннее знание [smile] В следующем коде произойдет исключение, если хотя бы одна из колонок указана неправильно:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;_dataStream.TableSet.InitFromIni2(_configFileName, &amp;quot;FORTS_OPTCOMMON_REPL&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6958/</id>
    <title type="text">aspirant: Mikhail Sukhov: А стоит ли давать так делать? Вроде обсуждали про пул подключений для расп...</title>
    <published>2011-03-22T20:13:45Z</published>
    <updated>2011-03-22T20:13:45Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6936)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6896)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
А стоит ли давать так делать?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Вроде обсуждали про пул подключений для распараллеливания потоков.  Я, когда писал PlazaStreamManager, сразу это и сделал.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;В итоге то к чему пришли?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6936)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6896)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
4. А как тогда потоки стартую если названия из не указывается?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Вот ini-файл для таблицы FORTS_OPTCOMMON_REPL\common (колонки не все)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;[dbscheme:CustReplScheme]
table=common&lt;/p&gt;
&lt;p&gt;; Общая информация по сессии
[table:CustReplScheme:common]
field=replID,i8
field=replRev,i8
field=replAct,i8
field=isin_id,i4
field=sess_id,i4
field=best_sell,d16.5
field=amount_sell,i4
field=best_buy,d16.5
field=amount_buy,i4
field=price,d16.5
field=trend,d16.5
field=amount,i4&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 
&amp;gt; А вот как инициализиурется поток в коде:
&amp;gt; ```

_dataStream = new CP2DataStreamClass();
_dataStream.StreamName = &amp;quot;FORTS_OPTCOMMON_REPL&amp;quot;; // название потока указывается в этой строчке.

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;А как Плаза отпределяет, что для потока FORTS_OPTCOMMON_REPL нужен вот тот файл ini а не какой то другой?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6936/</id>
    <title type="text">Mikhail Sukhov: aspirant: Сама Плаза дает, тем более что для каждого потока создается отдельное подк...</title>
    <published>2011-03-22T12:25:05Z</published>
    <updated>2011-03-22T12:25:05Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6896)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6892)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;
Сама Плаза дает, тем более что для каждого потока создается отдельное подключение (CP2ConnectionClass) с уникальным именем (в соответствии с рекомендациями разработчиков).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;А стоит ли давать так делать?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Вроде обсуждали про пул подключений для распараллеливания потоков.  Я, когда писал PlazaStreamManager, сразу это и сделал.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6896)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
4. А как тогда потоки стартую если названия из не указывается?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Вот ini-файл для таблицы FORTS_OPTCOMMON_REPL\common (колонки не все)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[dbscheme:CustReplScheme]
table=common

; Общая информация по сессии
[table:CustReplScheme:common]
field=replID,i8
field=replRev,i8
field=replAct,i8
field=isin_id,i4
field=sess_id,i4
field=best_sell,d16.5
field=amount_sell,i4
field=best_buy,d16.5
field=amount_buy,i4
field=price,d16.5
field=trend,d16.5
field=amount,i4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;А вот как инициализиурется поток в коде:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
_dataStream = new CP2DataStreamClass();
_dataStream.StreamName = &amp;quot;FORTS_OPTCOMMON_REPL&amp;quot;; // название потока указывается в этой строчке.

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Меняем название потока, и с той же схемой инициализируем таблицу с таким же именем из другого потока:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
_dataStream = new CP2DataStreamClass();
_dataStream.StreamName = &amp;quot;FORTS_FUTCOMMON_REPL&amp;quot;;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Конечно, эти две таблицах не полностью соответствуют друг другу, но при желании (что я и сделал), можно создать выборочную схему с одинаковым набором колоннок.&lt;/p&gt;
&lt;p&gt;По поводу остального напишу вечером.  Кстати, позавчера вечером начал мапить объекты из потоков (см. метод PlazaTrader.OnNewDataFromOptionSessionContents())&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6896/</id>
    <title type="text">aspirant: Сама Плаза дает, тем более что для каждого потока создается отдельное подключение (CP2Conn...</title>
    <published>2011-03-20T20:45:01Z</published>
    <updated>2011-03-20T20:45:19Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6892)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;
Сама Плаза дает, тем более что для каждого потока создается отдельное подключение (CP2ConnectionClass) с уникальным именем (в соответствии с рекомендациями разработчиков).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;А стоит ли давать так делать?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6892)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6886)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
2. Ты опять мешаешь метаданные с Плаза потоками.&lt;/p&gt;
&lt;p&gt;Я бы написал так:&lt;/p&gt;
&lt;p&gt;// в этот момент (можно запихнуть в статический конструктор PlazaTableRegistry)
// сканируется директория на предмет определения схем, и если уже создана схема ввиде файла для OptionSession
// то PlazaTableRegistry.OptionSession.Columns уже заполнен какими то колонками, исходя из файла
var optSessionTable = PlazaTableRegistry.OptionSession;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Вопросы:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Кто и в какой момент будет создавать эти схемы-файлы?&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;p&gt;Получается нужно обыгрывать такой сценарий: клиент запустил PlazaTrader, создал подписку на таблицу 1 с 3 колонками, вышел из программы. Мы должны запомнить, что его подписка состоит из 3 колонок. Он снова запустил PlazaTrader, добавил в подписку еще одну колонку, вышел из программы.  Мы опять сохранили состояние. В таком случае нужно иметь в виду, что 1) родной формат схем-файлов Плазы не поддерживает сохранение параметров фильтрации и 2) название потока (FORTS_OPTINFO_REPL и т.д.) не указывается в файле, его нужно передавать в коде отдельно (кстати, почему так сделано, больше всего меня удивляет).  Придется либо запихивать и 1) и 2) в комментарии, либо сохранять все внутри XML, то есть однозначно клиенту эти файлы показывать не стоит.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;При первом обращении к PlazaTableRegistry они будут создаваться им, если файлов нет на диске. Если есть, то наоборот, их файлов будут считываться информация и заполняться PlazaTable.Columns тех таблиц, информация о которых присутствует на диске.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Предлагаю сохранять файлы не по выходу из программы, а когда меняется коллекция PlazaTable.Columns.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Фильтрацию (по инструменту) не нужно сохранять. Это динамическая информация и зависит от запущенных стратегий. Не запустил пользователь стратегию, данные не текут. Запустил, вызвал PlazaTrader.RegisterXXX - данные текут.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;А как тогда потоки стартую если названия из не указывается?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6892)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6886)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
тоесть мы метаданные готовим до того, как будет создан PlazaTrader и вызван Connect.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Почему это важно?  Речь идет о создании одного-двух десятков маленьких текстовиков, причем делаться это будет один раз при подписке на поток.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Потому что в реальном времени потоки же не изменить. Вроде как Plaza сканирует схемы и уже потом не поменять метаданные. Я ошибаюсь?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6892)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;
&lt;strong&gt;Еще важный момент:&lt;/strong&gt; ты можешь добавить в класс PlazaTrader событие тип Unloading или Disposing, которые будет вызываться при выгрузке.  Это нужно для PlazaStreamManager: все потоки (plaza streams) вертятся в отдельных потоках (threads), и, если в клиентском коде явно не вызывать PlazaStreamManager.Dispose(), программа будет висеть в памяти, а данные по-прежнему будут сыпаться.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Сейчас просто создавай потоки с Thread.IsBackground = true.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6895/</id>
    <title type="text">aspirant: Mikhail Sukhov: Нужно определить минимальный набор, с которым можно прожить. Поскольку на ...</title>
    <published>2011-03-20T20:32:38Z</published>
    <updated>2011-03-20T20:32:38Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6893)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6887)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Нужно определить минимальный набор, с которым можно прожить.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Поскольку на один и тот же поток можно подписываться несколько раз (см. мой предыдущий пост), может быть, мы сами будем подписываться на стандратняе потоки, чтобы можно было правильно мапить все объекты, а клиент пусть делает, что хочет?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Да, согласен. Но это все равно не избавляет от факта присутствия &amp;quot;лишних&amp;quot; (ExtensionInfo) колонок? Они необходимы, и их нужно экспортировать не со стороны пользовательского кода, а через конфигурирование метаданных.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6893/</id>
    <title type="text">Mikhail Sukhov: Нужно определить минимальный набор, с которым можно прожить. Поскольку на один и тот...</title>
    <published>2011-03-20T19:49:26Z</published>
    <updated>2011-03-20T19:49:26Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6887)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Нужно определить минимальный набор, с которым можно прожить.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Поскольку на один и тот же поток можно подписываться несколько раз (см. мой предыдущий пост), может быть, мы сами будем подписываться на стандратняе потоки, чтобы можно было правильно мапить все объекты, а клиент пусть делает, что хочет?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6892/</id>
    <title type="text">Mikhail Sukhov: Но есть но. Приведу твой код: var optSessionTable = new PlazaTable(PlazaColumnRegist...</title>
    <published>2011-03-20T19:44:29Z</published>
    <updated>2011-03-20T19:44:53Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6886)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Но есть но. Приведу твой код:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;var optSessionTable = new PlazaTable(PlazaColumnRegistry.OptionSessionContents,
new[] { PlazaColumnRegistry.OptionSessionContents.Isin, PlazaColumnRegistry.OptionSessionContents.IsinId });
_plazaTrader.StartListeners(optSessionTable);&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 
&amp;gt; 1. Я не проверял но более чем уверен, что плаза не дает два раза создать поток по одной и той же таблице с разными полями.

Сама Плаза дает, тем более что для каждого потока создается отдельное подключение (CP2ConnectionClass) с уникальным именем (в соответствии с рекомендациями разработчиков).  Только что проверял:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;optSessionListener1_DataInserted: 28800;43882;0;RTS-6.11M150611CA 100000;151364
optSessionListener2_DataInserted: 28800;43882;0;151331;88,66;8950,48;0;0;100000,00000;0;20101220000000000;20110615000000000;8975,37;151331;3274;151364;RI100000BF1;RTS-6.11M150611CA 100000;Июньский Марж.Амер.Call.100000 Фьюч.контр RTS-6.11;0;0,00000;0,00000;89065,00000;RTS;5,00000;1;2,84763;20110615000000000;89065,00000;115&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
Правда раньше потоки хранились внутри PlazaStreamManager в словаре, и, если ключ явно не указывался, вместо ключа использовалось сочетание поток+таблица, поэтому два раза один и тот же поток, не указывая разные ключи, добавить было нельзя.  Сейчас я словарь переделал в простой список, в который можно добавлять потоки по одной и той же таблице.

&amp;gt; **[Mikhail Sukhov](@message(6886)):**
&amp;gt; 2. Ты опять мешаешь метаданные с Плаза потоками.
&amp;gt; 
&amp;gt; Я бы написал так:
&amp;gt; 
&amp;gt; 
&amp;gt; // в этот момент (можно запихнуть в статический конструктор PlazaTableRegistry)
&amp;gt; // сканируется директория на предмет определения схем, и если уже создана схема ввиде файла для OptionSession
&amp;gt; // то PlazaTableRegistry.OptionSession.Columns уже заполнен какими то колонками, исходя из файла
&amp;gt; var optSessionTable = PlazaTableRegistry.OptionSession;

Вопросы: 
1. Кто и в какой момент будет создавать эти схемы-файлы?
2. Получается нужно обыгрывать такой сценарий: клиент запустил PlazaTrader, создал подписку на таблицу 1 с 3 колонками, вышел из программы. Мы должны запомнить, что его подписка состоит из 3 колонок. Он снова запустил PlazaTrader, добавил в подписку еще одну колонку, вышел из программы.  Мы опять сохранили состояние. В таком случае нужно иметь в виду, что 1) родной формат схем-файлов Плазы не поддерживает сохранение параметров фильтрации и 2) название потока (FORTS_OPTINFO_REPL и т.д.) не указывается в файле, его нужно передавать в коде отдельно (кстати, почему так сделано, больше всего меня удивляет).  Придется либо запихивать и 1) и 2) в комментарии, либо сохранять все внутри XML, то есть однозначно клиенту эти файлы показывать не стоит.

&amp;gt; **[Mikhail Sukhov](@message(6886)):**
&amp;gt; тоесть мы метаданные готовим до того, как будет создан PlazaTrader и вызван Connect.

Почему это важно?  Речь идет о создании одного-двух десятков маленьких текстовиков, причем делаться это будет один раз при подписке на поток.

**Еще важный момент:** ты можешь добавить в класс PlazaTrader событие тип Unloading или Disposing, которые будет вызываться при выгрузке.  Это нужно для PlazaStreamManager: все потоки (plaza streams) вертятся в отдельных потоках (threads), и, если в клиентском коде явно не вызывать PlazaStreamManager.Dispose(), программа будет висеть в памяти, а данные по-прежнему будут сыпаться.
&lt;/code&gt;&lt;/pre&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6887/</id>
    <title type="text">aspirant: Тут вот какой вопрос: предположим, что, чтобы замапить объекты Security типа опцион, нужно...</title>
    <published>2011-03-20T15:36:44Z</published>
    <updated>2011-03-20T15:37:21Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6875)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;
Тут вот какой вопрос: предположим, что, чтобы замапить объекты Security типа опцион, нужно подписаться на поток &lt;strong&gt;FORTS_OPTINFO_REPL\opt_sess_contents&lt;/strong&gt;.  Пользователь берет и по какой-то причине передает в PlazaTrader не всю таблицу, а только некий набор колонок (см. кусок кода № 2 выше).  Данные приходят, но не все.  Объекты создаются, но некоторые свойства не мапятся.  Это допустимая ситуация, или мы должны каким-то образом ее предотвратить?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Нужно определить минимальный набор, с которым можно прожить. Тоесть, если пользователь имеет ini схему для особых таблиц (инструменты, заявки, сделки и т.д. - это все особые), у которых отсутствуют обязательные поля (это как раз те, что PlazaColumns.IsMandatory == true, но сейчас по ошибке они все true), то их нужно или дописать, или выбросить ошибку (пока предлагаю второе, так как я всегда против эвристики в коде).&lt;/p&gt;
&lt;p&gt;Если же у него сверх необходимого в полях, то они идут в ExtensionInfo где ключом является PlazaColumn, а значение - то что получили из потока.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6886/</id>
    <title type="text">aspirant: Если его убрать, получается, что данные будут приходить в PlazaStreamManager, который буде...</title>
    <published>2011-03-20T15:05:03Z</published>
    <updated>2011-03-20T15:32:37Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6875)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;
Если его убрать, получается, что данные будут приходить в PlazaStreamManager, который будет передавать их в PlazaTrader, котрый будет уже отдавать клиенту. Но тогда данные со всех потоков будут приходить через одно событие, а это 1) возможное узкое место в коде и 2) усложнение кода, потому что внутри события PlazaTrader будет гигантский switch statement&lt;/p&gt;
&lt;p&gt;.... поискапино&lt;/p&gt;
&lt;p&gt;Еще раз повторюсь, мне кажется PlazaTable не совсем подходящее название для этого класса.  Может быть PlazaSubscription или PlazaListener?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Да, я кажется понял идею. Был не прав. Тогда я за переименование. То, что сейчас PlazaSystemTable -&amp;gt; PlazaTable. PlazaTable -&amp;gt; PlazaSubscription или PlazaListener.&lt;/p&gt;
&lt;p&gt;Но есть но. Приведу твой код:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var optSessionTable = new PlazaTable(PlazaColumnRegistry.OptionSessionContents,
    new[] { PlazaColumnRegistry.OptionSessionContents.Isin, PlazaColumnRegistry.OptionSessionContents.IsinId });
_plazaTrader.StartListeners(optSessionTable);
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Я не проверял но более чем уверен, что плаза не дает два раза создать поток по одной и той же таблице с разными полями.&lt;/li&gt;
&lt;li&gt;Ты опять мешаешь метаданные с Плаза потоками.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Я бы написал так:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
// в этот момент (можно запихнуть в статический конструктор PlazaTableRegistry)
// сканируется директория на предмет определения схем, и если уже создана схема ввиде файла для OptionSession
// то PlazaTableRegistry.OptionSession.Columns уже заполнен какими то колонками, исходя из файла
var optSessionTable = PlazaTableRegistry.OptionSession;

// проверяем, не добавлена ли уже необходимые колонки (были добавлены при предыдущем запуске, или же пользователь уже имеет файл с правильными настройками)
if (!optSessionTable.Columns.Contains(PlazaColumnRegistry.OptionSessionContents.Isin))
{
    // при добавлении колонок автоматически меняется соответствующий ini файл на диске (пока я так понял этой фичи нет, но это не долго добавить).
    optSessionTable.Columns.AddRange(new[] { PlazaColumnRegistry.OptionSessionContents.Isin, PlazaColumnRegistry.OptionSessionContents.IsinId });
}

// тоесть мы метаданные готовим до того, как будет создан PlazaTrader и вызван Connect.

var optSessListener = new PlazaListener(PlazaTableRegistry.OptionSession);
_plazaTrader.StartListeners(optSessListener);
&lt;/code&gt;&lt;/pre&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6875/</id>
    <title type="text">Mikhail Sukhov: Это все нужно засовывать в PlazaTable. Не понял, как это сделать. Можешь объяснить, ...</title>
    <published>2011-03-19T20:44:39Z</published>
    <updated>2011-03-19T20:44:39Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6870)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Это все нужно засовывать в PlazaTable.
Не понял, как это сделать.  Можешь объяснить, приведя код?  Сейчас, чтобы подписаться, например, на таблицу &lt;strong&gt;FORTS_OPTINFO_REPL\opt_sess_contents&lt;/strong&gt;,
нужно сделать вот так:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;var optSessionTable = new PlazaTable(PlazaColumnRegistry.OptionSessionContents);
_plazaTrader.StartListeners(optSessionTable);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;А чтобы подписаться только на две колонки той же самой таблицы, нужно сделать вот это:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var optSessionTable = new PlazaTable(PlazaColumnRegistry.OptionSessionContents,
	new[] { PlazaColumnRegistry.OptionSessionContents.Isin, PlazaColumnRegistry.OptionSessionContents.IsinId });
_plazaTrader.StartListeners(optSessionTable);

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Внутри метода &lt;strong&gt;PlazaTable.CreateStream()&lt;/strong&gt; конструктор PlazaStream создаст на лету ini-файл схему для передачи Плазе.  Названия потока, схемы и таблицы он возьмет из свойства &lt;strong&gt;public PlazaSystemTable Table&lt;/strong&gt;, который класс &lt;strong&gt;PlazaOptionSessionContentsColumns&lt;/strong&gt; унаследовал от &lt;strong&gt;PlazaColumns&lt;/strong&gt;.  Пользователю ничего никаких названий указывать не надо.  Никаких ini-файлов парсить тоже не надо.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6870)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
А зачем вообще нужно хранить эти данные? Мое видение: подписались на поток. Поток отдает данные. Данные раздаются подписчикам (например, подписчику, преобразующий поток с опционами в Security). Не могу понять, когда пригодиться использование хранения?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Все понятно.  Тогда от хранения отказываемся вообще.  Данные в Плазе приходят по одной записи (строчке).  Значит таким же методом транслируем данные клиенту?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6870)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Мне лично видеться только один единый способ подписки к потоком -&amp;gt; PlazaStreamManager.StartListener(PlazaTable). Его используют все - и PlazaTrader и пользовательский код фактически один и тем же способом: передаем PlazaTable, где указаны системные параметры, и начинаем через callback получать массивы данных... Я что-то упускаю?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Да, все правильно.  Просто в предыдущем посте ты писал:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6868)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Пользователей работает с метаданными. Неявно, когда при старте сканируются ini схемы и восстанавливаются колонки автоматически в PlazaTable.Columns.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Это механизм № 2, и его нет.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6870)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6869)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;
У меня была такая мысль: а что если дать пользователю возможность запускать не все основные потоки, а только те, которые ему нужны.  Например, если я работаю с фьючерсами, зачем мне информация по опционам?  Или это бред чайника[confused]  Тогда PlazaMarketData можно убрать вообще и стартовать основные потоки в конструкторе PlazaTrader или в отдельном методе.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Я думаю это точно так же можно проделать через PlazaTable - передавать не все объекты PlazaTable, а только те, что отвечают за опционы.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Тут вот какой вопрос: предположим, что, чтобы замапить объекты Security типа опцион, нужно подписаться на поток &lt;strong&gt;FORTS_OPTINFO_REPL\opt_sess_contents&lt;/strong&gt;.  Пользователь берет и по какой-то причине передает в PlazaTrader не всю таблицу, а только некий набор колонок (см. кусок кода № 2 выше).  Данные приходят, но не все.  Объекты создаются, но некоторые свойства не мапятся.  Это допустимая ситуация, или мы должны каким-то образом ее предотвратить?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6870)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Согласен. Тогда предлагаю пока все что отвечает за метаданные перенести обратно в PlazaSystemTable (названия потоков, таблиц и т.д.). Посмотреть, можно ли обойтись без Records. И уж там поглядеть, что осталось от PlazaTable. Думаю, останеться немного.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Все метаданные по таблице уже живут в PlazaSystemTable.  От Records можно отказаться вообще.  PlazaTable нужен.  Чем еще он удобен: через него приходят данные клиенту.  Вот, например, вот так данные с двух потоков приходят в разные обработчики событий:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var optSessionTable = new PlazaTable(PlazaColumnRegistry.OptionSessionContents);
optSessionTable.DataInserted += optSessionTable_DataInserted;
			
var rtsIndexTable = new PlazaTable(PlazaColumnRegistry.RtsIndex);
rtsIndexTable.DataInserted += rtsIndexTable_DataInserted;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Если его убрать, получается, что данные будут приходить в PlazaStreamManager, который будет передавать их в PlazaTrader, котрый будет уже отдавать клиенту.  Но тогда данные со всех потоков будут приходить через одно событие, а это 1) возможное узкое место в коде и 2) усложнение кода, потому что внутри события PlazaTrader будет гигантский switch statement&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6870)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Насчет фильтрации, я думаю надо делать это в PlazaStream. Или вынести это в отдельный класс PlazaStreamFilter.
Фильтрацию тоже нужно делать в PlazaTable.  Он же получает данные из потоков и передает их клиенту.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Попытаюсь сжато описать разграничение полномочий среди моих хитросплетений.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;За метаданные отвечают PlazaSystemTable и наследники PlazaColumns.&lt;/li&gt;
&lt;li&gt;PlazaStream - это работа с конкретным потоком (плазовский класс CP2DataStreamClass): создание ini-файла схемы, (пере)открытие потока, установка номера жизни.&lt;/li&gt;
&lt;li&gt;PlazaStreamManager создает подключения к Плазе, а также запускает подписки на потоки через PlazaStream в отдельных потоках.  PlazaStream и PlazaStreamManager после отладки нужно скрыть от клиентского кода.&lt;/li&gt;
&lt;li&gt;PlazaTable хранит в себе конфигурацию подписки к конкретному потоку (название потока, схемы, таблицы + нужный набор колоннок).  Он создает PlazaStream и подписывается на события получение данных, чтобы в дальнейшем транслировать их клиенту.  Поскольку он пропускает их через себя, он сможет в дальнейшем их фильтровать.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Еще раз повторюсь, мне кажется PlazaTable не совсем подходящее название для этого класса.  Может быть PlazaSubscription или PlazaListener?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6870/</id>
    <title type="text">aspirant: У каждой таблицы в потоке помимо четкого набора полей (колоннок) есть еще три обязательных...</title>
    <published>2011-03-19T06:45:28Z</published>
    <updated>2011-03-19T06:45:28Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6869)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;
У каждой таблицы в потоке помимо четкого набора полей (колоннок) есть еще три обязательных параметра: название потока, название схемы потока и название таблицы.  Поскольку каждой таблице потоков соответствует свой наследник PlazaColumns, например, таблица rts_index - это класс PlazaIndexColumns, имело смысл в каждом наследнике PlazaColumns прописать эти три параметра.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;На мой взгляд, зря. Это все нужно засовывать в PlazaTable. PlazaColumns - это лишь базовый класс для контейнера колонок. У нас практически во всех таблицах есть 3 служебных поля. Вот ради них я и вынес это в отдельный класс PlazaColumns. Даже не думал, что его как-то по другому начнут использовать.[smile]&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6869)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;
Мой PlazaTable метаданные не описывает (см. выше).  Это класс своего рода контейнер по типу DataTable.  Он используется для подписки на конкретный поток, получения и хранения данных из этого потока.  Все управление потоками по-прежнему происходит внутри PlazaStreamManager.  В дальнейшем PlazaTable сможет фильтровать данные.&lt;/p&gt;
&lt;p&gt;В этом массиве хранятся данные, которые приходят из потока (см. предыдущий пункт).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;А зачем вообще нужно хранить эти данные? Мое видение: подписались на поток. Поток отдает данные. Данные раздаются подписчикам (например, подписчику, преобразующий поток с опционами в Security). Не могу понять, когда пригодиться использование хранения?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6869)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;
Мы прописали все метаданные Плазы.  У нас есть механизм создания ini-файлов на лету (их не нужно парсить, они считываются/парсятся самой Плазой в методе &lt;strong&gt;CP2DataStreamClass.TableSet.InitFromIni2()&lt;/strong&gt;).  Мы можем использовать этот единый механизм, как для пользовательских подписок, так и для служебных (которые будут потом мапиться в классы).  Если парсить файлы, зачем было прописывать метаданные?  У нас будет два механизма подписки к потокам, а это только усложнит систему, а не упростит.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Мне лично видеться только один единый способ подписки к потоком -&amp;gt; PlazaStreamManager.StartListener(PlazaTable). Его используют все - и PlazaTrader и пользовательский код фактически один и тем же способом: передаем PlazaTable, где указаны системные параметры, и начинаем через callback получать массивы данных... Я что-то упускаю?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6869)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;
У меня была такая мысль: а что если дать пользователю возможность запускать не все основные потоки, а только те, которые ему нужны.  Например, если я работаю с фьючерсами, зачем мне информация по опционам?  Или это бред чайника[confused]  Тогда PlazaMarketData можно убрать вообще и стартовать основные потоки в конструкторе PlazaTrader или в отдельном методе.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Я думаю это точно так же можно проделать через PlazaTable - передавать не все объекты PlazaTable, а только те, что отвечают за опционы.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6869)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;
Легче будет рефакторить и поддерживать в дальнейшем[smile]  Половину функицонала PlazaTable можно засунуть в PlazaStreamManager, но тогда он будет знать очень много.  А после того, как добавится фильтрация данных[omg]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Согласен. Тогда предлагаю пока все что отвечает за метаданные перенести обратно в PlazaSystemTable (названия потоков, таблиц и т.д.). Посмотреть, можно ли обойтись без Records. И уж там поглядеть, что осталось от PlazaTable. Думаю, останеться немного.&lt;/p&gt;
&lt;p&gt;Насчет фильтрации, я думаю надо делать это в PlazaStream. Или вынести это в отдельный класс PlazaStreamFilter.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6869)" rel="nofollow" target="_blank"&gt;aspirant&lt;/a&gt;:&lt;/strong&gt;
Подытоживая:  PlazaTable, PlazaSystemTable - схожие названия действительно путают: предлагай свой варианты.  Вместе с этим, считаю, что оба класса имеют право на существование.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6869/</id>
    <title type="text">По порядку: Mikhail Sukhov: PlazaSystemTable явно лишний. У каждой таблицы в потоке помимо четкого н...</title>
    <published>2011-03-18T20:48:03Z</published>
    <updated>2011-03-18T20:48:03Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;По порядку:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6868)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;PlazaSystemTable явно лишний.
У каждой таблицы в потоке помимо четкого набора полей (колоннок) есть еще три обязательных параметра: название потока, название схемы потока и название таблицы.  Поскольку каждой таблице потоков соответствует свой наследник PlazaColumns, например, таблица rts_index - это класс PlazaIndexColumns, имело смысл в каждом наследнике PlazaColumns прописать эти три параметра.  Первоначально я сделал это через абстрактные свойства базового класса PlazaColumns: ReplicationStream, ReplicationScheme и Table.  Ты предложил более удобный вариант: через класс PlazaTable, который теперь называется PlazaSystemTable.  Имя я изменил, потому что мне нужно было добавить класс PlazaTable.  Если моему PlazaTable дать другое название (мне вчера вечером с лету ничего в голову не пришло), PlazaSystemTable можно обратно переименовать в PlazaTable.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6868)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Зачем-то в PlazaTable идет работа с потоками. Есть же менеджер потоков, есть PlazaTrader. В классе, описывающий метаданные, работа с потоками по идее быть не должно.
Мой PlazaTable метаданные не описывает (см. выше).  Это класс своего рода контейнер по типу DataTable.  Он используется для подписки на конкретный поток, получения и хранения данных из этого потока.  Все управление потоками по-прежнему происходит внутри PlazaStreamManager.  В дальнейшем PlazaTable сможет фильтровать данные.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6868)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Зачем нужен Records у PlazaTable?
В этом массиве хранятся данные, которые приходят из потока (см. предыдущий пункт).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6868)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Я думаю надо еще раз проговорить про организацию работы с потоками Плазы.
Мы прописали все метаданные Плазы.  У нас есть механизм создания ini-файлов на лету (их не нужно парсить, они считываются/парсятся самой Плазой в методе &lt;strong&gt;CP2DataStreamClass.TableSet.InitFromIni2()&lt;/strong&gt;).  Мы можем использовать этот единый механизм, как для пользовательских подписок, так и для служебных (которые будут потом мапиться в классы).  Если парсить файлы, зачем было прописывать метаданные?  У нас будет два механизма подписки к потокам, а это только усложнит систему, а не упростит.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6868)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Зачем здесь PlazaMarketData?
У меня была такая мысль: а что если дать пользователю возможность запускать не все основные потоки, а только те, которые ему нужны.  Например, если я работаю с фьючерсами, зачем мне информация по опционам?  Или это бред чайника[confused]  Тогда PlazaMarketData можно убрать вообще и стартовать основные потоки в конструкторе PlazaTrader или в отдельном методе.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6868)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Вообщем, сейчас уже практически не понять, что есть что.
Попробуй в тестовом коде подписаться на пару потоков и отследи, что происходит в дебагере.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(6868)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
Вопрос к аспиранту, а именно в чем необходимость данного хитросплетения?
Легче будет рефакторить и поддерживать в дальнейшем[smile]  Половину функицонала PlazaTable можно засунуть в PlazaStreamManager, но тогда он будет знать очень много.  А после того, как добавится фильтрация данных[omg]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Подытоживая:  PlazaTable, PlazaSystemTable - схожие названия действительно путают: предлагай свой варианты.  Вместе с этим, считаю, что оба класса имеют право на существование.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/6868/</id>
    <title type="text">Вообщем, сейчас уже практически не понять, что есть что. Вопрос к аспиранту, а именно в чем необходи...</title>
    <published>2011-03-18T17:17:44Z</published>
    <updated>2011-03-18T17:17:44Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;Вообщем, сейчас уже практически не понять, что есть что. Вопрос к аспиранту, а именно в чем необходимость данного хитросплетения?&lt;/p&gt;
&lt;p&gt;Что я вижу сейчас:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;PlazaSystemTable явно лишний.&lt;/li&gt;
&lt;li&gt;Зачем-то в PlazaTable идет работа с потоками. Есть же менеджер потоков, есть PlazaTrader. В классе, описывающий метаданные, работа с потоками по идее быть не должно.&lt;/li&gt;
&lt;li&gt;Зачем нужен Records у PlazaTable?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Я думаю надо еще раз проговорить про организацию работы с потоками Плазы.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Пользователей работает с метаданными. Явно, когда их редактируется через PlazaTable.Columns. Неявно, когда при старте сканируются ini схемы и восстанавливаются колонки автоматически в PlazaTable.Columns.&lt;/li&gt;
&lt;li&gt;Пользователь запускает экспорт через PlazaTrader.StartExport. Стартуют потоки как основные (которые в QuikTrader мапяться на объекты Security Trade Order и т.д.) так и дополнительные (думаю, маппинг лучше организовать как с Custom tables в QuikTrader). Какие именно нужны потоки - определяется на шаге 1.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Зачем здесь PlazaSystemTable? И PlazaMarketData?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>