﻿<?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">Список задач</title>
  <id>~/topic/1300/spisok-zadach/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-25T00:33:37Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=1300" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/5264/</id>
    <title type="text">И так, предлагаю подытожить то, что нужно сделать и в каком порядке. Задачи сгруппировал по группам ...</title>
    <published>2010-12-29T17:20:14Z</published>
    <updated>2016-08-16T02:33:16Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">И так, предлагаю подытожить то, что нужно сделать и в каком порядке.&lt;br /&gt;&lt;br /&gt;Задачи сгруппировал по группам (копировал из соседней ветки &lt;a href="http://stocksharp.com/forum/1275/&amp;amp;p=2)" title="http://stocksharp.com/forum/1275/&amp;amp;p=2)"&gt;http://stocksharp.com/forum/1275/&amp;amp;p=2)&lt;/a&gt;. Первая группа - самая приоритетная. Без нее делать задачи из следующей бессмысленно. Сами задачи внутри этой группы так же выстроены по очередности.&lt;br /&gt;&lt;br /&gt;Базовая группа:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Описать основные метаданные, как это сделано для Квика (&lt;a href="http://stocksharp.com/doc/help/html/AllMembers_T_Ecng_Trading_Quik_DdeSecurityColumns.htm" title="http://stocksharp.com/doc/help/html/AllMembers_T_Ecng_Trading_Quik_DdeSecurityColumns.htm"&gt;DdeSecurityColumns&lt;/a&gt;, &lt;a href="http://stocksharp.com/doc/help/html/AllMembers_T_Ecng_Trading_Quik_DdeTradeColumns.htm" title="http://stocksharp.com/doc/help/html/AllMembers_T_Ecng_Trading_Quik_DdeTradeColumns.htm"&gt;DdeTradeColumns&lt;/a&gt; и т.д.). Я это уже показал на примере класса PlazaFutureColumns, но там колонки не реальные. Предлагаю прямо разобрать по названию таблиц потоков, кто за какие будет отвечать (описывать в коде). Таблицы только основные: инструменты, заявки, сделки и т.д.&lt;br /&gt;&lt;li&gt;Подписываться на &lt;b&gt;произвольные&lt;/b&gt; потоки + отписываться.&lt;br /&gt;&lt;li&gt;Получать стаканы. Производная от предыдущей задача. Выделил ее отдельно.&lt;br /&gt;&lt;li&gt;Заявки (регистрация, снятие и перемещение). Я уже сделал через класс Message заполнение полей для отправки транзакций. Это дело надо доделать.&lt;br /&gt;&lt;li&gt;Парсинг ответа от транзакций (&lt;b&gt;внимание! всех транзакций, а не только, что в предыдущем пункте&lt;/b&gt;). Я не знаю, в каком виде они приходят, но могу сказать, какой результат должен быть. Это должно быть PlazaException с кодом ошибки (чтобы не мучится сравнение строчек в коде). И код не ввиде числа (что не так уж лучше строчки), а нормального перечисления (enum).&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Первую задачу предлагаю сделать сообща. Остальные - разбираем по тем признакам, кто какие таблицы описывал (например, кто описал стакан, тот занимается задачей 3, кто инструменты  - задачей 2, кто заявки - задачей 4).&lt;br /&gt;&lt;br /&gt;Второстепенная группа:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Дописать все остальные метаданные (позиции, счета, волатильность, маржа, клиринг, доп информация о деривативах, индексы).&lt;br /&gt;&lt;li&gt;Фильтрация потоков. Так как Плаза не дает фильтр (&lt;a href="http://stocksharp.com/posts/m/5258/" title="http://stocksharp.com/posts/m/5258/"&gt;камрад skuvv написал об этом&lt;/a&gt;), но в клиентском коде прописывать фильтры дело не благодарное, предлагаю это симулировать через RegisterXXX + UnRegisterXXX.&lt;br /&gt;&lt;li&gt;Возможность задавать глубину стакана (как я понял, это влияет на то, к какому потоку необходимо цепляться).&lt;br /&gt;&lt;li&gt;Поддержка агрегированного стакана и обычного. Для этого можно использовать GroupedQuote (внутри себя он будет содержать не агрегированные котировки).&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Третьестепенная группа:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;С помощью метаданных научиться строить конфиги ini. Как вариант, через PlazaTable (куда собственно и будут добавляться колонки из пункта 1 пред группы). Сейчас ini файлы программно редактировать нельзя. И если роботу нужны спец колонки нужно менять формат ini схем. Я предлагаю до загрузки этих схем давать возможность менять из программно (парсить и менять ini файлы на лету). + как фича автоматически сканировать директорию при старте и создавать с правильным набором колонок сами PlazaTable. Возможно, здесь поможет TableSet.&lt;br /&gt;&lt;li&gt;&lt;a href="http://stocksharp.com/posts/m/5192/" title="http://stocksharp.com/posts/m/5192/"&gt;Время биржи&lt;/a&gt;.&lt;br /&gt;&lt;li&gt;Все остальные транзакции (FutChangeClientMoney, OptChangeExpiration и т.д.).&lt;br /&gt;&lt;li&gt;Составные инструменты.&lt;br /&gt;&lt;li&gt;На форуме доступна x64 версия. Нужна прозрачная поддержка (без перекомпиляции) x86 и x64.&lt;br /&gt;&lt;li&gt;Обертка над роутером (чтобы так же, не ручками править конфиги, а программно).&lt;br /&gt;&lt;li&gt;Документация (как xml, так и обычная). Если нужно сделать как у S#, то необходимо использовать Sandcastle.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Особенности в работе&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Старайтесь писать так, как это принято в .NET и в частности C# коде.&lt;br /&gt;Публичные методы классы и т.д. описывайте xml комментариями (лучше не сочинять, а копировать из документации Плазы, чтобы быть не с планеты Юпитер, а ближе к тем, кто будет это использовать и вторым глазом подглядывать в документацию).&lt;br /&gt;Предлагаю использовать R# как средство для контроля качества кода.&lt;br /&gt;Пишите юнит тесты (заведите отдельный проект в sln).</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/5480/</id>
    <title type="text">Я так понимаю, задачу 1 не только выполнили, но и перевыполнили? Тогда корректируем задачи в зависим...</title>
    <published>2011-01-17T13:16:24Z</published>
    <updated>2016-08-15T23:46:34Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Я так понимаю, задачу 1 не только выполнили, но и перевыполнили? Тогда корректируем &lt;a href="http://stocksharp.com/forum/1300/Spisok-zadach/" title="http://stocksharp.com/forum/1300/Spisok-zadach/"&gt;задачи&lt;/a&gt; в зависимости от силы исполнения. Те, кто хочет остаться на метаданных, пусть дописывает оставшиеся. Только перед этим надо написать здесь, какие именно таблицы хочется дописать, чтобы не получилось дублирования работы.&lt;br /&gt;&lt;br /&gt;Далее, задачи с 2 по 5. Задачи 2 и 3 мне кажется схожи. Поэтому, предлагаю стаканы отложить до тех пор, пока не будет закончена задача 2. Если так окажется, что желающих больше чем задач (вряд ли, но все же), то предлагаю спуститься к задачам из третьестепенной группы (второстепенные задачи слишком тесно связаны с первостепенными).&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/6611/</id>
    <title type="text">Взял 4. Составные инструменты. из Третьестепенная группа:</title>
    <published>2011-03-11T13:20:39Z</published>
    <updated>2011-03-11T13:20:39Z</updated>
    <author>
      <name>guk</name>
      <uri>https://stocksharp.com/users/28160/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Взял &lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;4. Составные инструменты.&lt;/div&gt;&lt;/div&gt; из &lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&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/6026/</id>
    <title type="text"> Я думал что это будет или object или object... Это сильно критично через что данные будут передават...</title>
    <published>2011-02-16T20:21:33Z</published>
    <updated>2011-02-16T20:22:09Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/5997/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;Я думал что это будет или object[] или object[][]... Это сильно критично через что данные будут передаваться?&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Просто, чтобы понимать куда передавать данные дальше.  Сейчас они приходят по одной записи/строчке в методе void OnStreamDataInserted(CP2DataStream stream, string tableName, CP2Record record) класса PlazaStream.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/5997/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;2. Тоесть, PlazaTableSerializer восстанавливает из конфига PlazaTable и он уже передается в PlazaStream?&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Да, причем, на мой взгляд, клиентскому коду лучше не давать доступа к PlazaTableSerializer.  Пускай он это лучше делает через методы Load/Save класса PlazaTable.  Формат ini-файлов это внутренность Плазы, и ее лучше, хотя бы на первых порах, инкапсулировать от клиентского кода.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/5997/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;3. Распиши, как ты это видишь и где это нужно сделать.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Создать интерфейс IPlazaStreamFilter, у которого будет метод bool Validate(object value) и свойство string ColumnName.  В конструктор PlazaTable передавать IEnumerable&amp;lt;IPlazaStreamFilter&amp;gt;, который, в свою очередь будет эту энумерацию передавать в конструктор PlazaStream.  Внутри себя PlazaStream в методе void OnStreamDataInserted(CP2DataStream stream, string tableName, CP2Record record) будет перебирать эту энумерацию, вызывать для каждого элемента метод Validate(object Value) и передавать данные, приходящие в потоке репликации, дальше (в клиентский код) только, если все вызовы Validate(object Value) возвращают true.  Но это только верхушка айсберга, потому что, оперируя понятиями SQL, мы только реализуем AND связки, например, price&amp;gt;100 AND code_vcb=xyz.  А нужно еще предосмотреть, как минимум связку OR, например, price&amp;gt;100 OR code_vcb=xyz.   Дальше я пока над этим не думал.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/5997/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;4. Как насчет для каждого стрима создавать по отдельному CP2ConnectionClass? Можно пока задачу подвинуть как оптимизациюнную (а следовательно не приоритетную[biggrin])&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Да, это точно на потом.  Сначала нужно с первыми тремя задачами разобраться.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/5997/</id>
    <title type="text">Похоже я нагородил кучу лишнего. Короче все это нужно отринуть. МИХАИЛ: вопрос, который меня занимае...</title>
    <published>2011-02-15T19:56:01Z</published>
    <updated>2011-02-15T19:56: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;aspirant &lt;a href="https://stocksharp.com/posts/m/5995/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Похоже я нагородил кучу лишнего. Короче все это нужно отринуть.&lt;br /&gt;&lt;br /&gt;МИХАИЛ: вопрос, который меня занимает сейчас больше всего: какой класс будет содержать все себе данные, которые будут приходить в потоках Плазы?  Если PlazaStream мы не будем показывать клиентскому коду, тогда, может быть, это будет PlazaTable?  А если не он, то что это будет за класс, и как он будет  связан с PlazaTable?&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Я думал что это будет или object[] или object[][]... Это сильно критично через что данные будут передаваться?&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;aspirant &lt;a href="https://stocksharp.com/posts/m/5995/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;По задачам, связанными с подпиской на потоки репликации Плазы я вижу, что нужно сделать следующее:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Создать буфер накопления входящих данных стрима.&lt;br /&gt;&lt;li&gt;Расписать методы Deserialize у PlazaTableSerializer, чтобы можно было инициализировать PlazaStream из ini файлов. Прикрутить инфраструктуру инициализации из файлов к PlazaStreamManager/PlazaTrader.&lt;br /&gt;&lt;li&gt;Фильтрация входящих данных.&lt;br /&gt;&lt;li&gt;Создание пула CP2ConnectionClass&amp;#39;ов для оптимизации и возможности параллельного получения данных по потокам. Сейчас, насколько я понял из тестирования, если данные из нескольких стримов идут по одному CP2ConnectionClass, это происходит порционно, т.е. идет партия данных одного стрима, за ней партия данных другого стрима и т.д.&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Я сейчас занимаюсь первым пунктом, а остальные пункты можно разобрать на задачи.  Самым сложным и интересным вижу пункт 3.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ок, тогда по первому задавать вопросы не буду.&lt;br /&gt;&lt;br /&gt;2. Тоесть, PlazaTableSerializer восстанавливает из конфига PlazaTable и он уже передается в PlazaStream?&lt;br /&gt;3. Распиши, как ты это видишь и где это нужно сделать.&lt;br /&gt;4. Как насчет для каждого стрима создавать по отдельному CP2ConnectionClass? Можно пока задачу подвинуть как оптимизациюнную (а следовательно не приоритетную[biggrin])&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/5995/</id>
    <title type="text">Похоже я нагородил кучу лишнего. Короче все это нужно отринуть. МИХАИЛ: вопрос, который меня занимае...</title>
    <published>2011-02-15T19:42:13Z</published>
    <updated>2011-02-15T19:42:13Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Похоже я нагородил кучу лишнего. Короче все это нужно отринуть.&lt;br /&gt;&lt;br /&gt;МИХАИЛ: вопрос, который меня занимает сейчас больше всего: какой класс будет содержать все себе данные, которые будут приходить в потоках Плазы?  Если PlazaStream мы не будем показывать клиентскому коду, тогда, может быть, это будет PlazaTable?  А если не он, то что это будет за класс, и как он будет  связан с PlazaTable?&lt;br /&gt;&lt;br /&gt;По задачам, связанными с подпиской на потоки репликации Плазы я вижу, что нужно сделать следующее:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Создать буфер накопления входящих данных стрима.&lt;br /&gt;&lt;li&gt;Расписать методы Deserialize у PlazaTableSerializer, чтобы можно было инициализировать PlazaStream из ini файлов. Прикрутить инфраструктуру инициализации из файлов к PlazaStreamManager/PlazaTrader.&lt;br /&gt;&lt;li&gt;Фильтрация входящих данных.&lt;br /&gt;&lt;li&gt;Создание пула CP2ConnectionClass&amp;#39;ов для оптимизации и возможности параллельного получения данных по потокам. Сейчас, насколько я понял из тестирования, если данные из нескольких стримов идут по одному CP2ConnectionClass, это происходит порционно, т.е. идет партия данных одного стрима, за ней партия данных другого стрима и т.д.&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Я сейчас занимаюсь первым пунктом, а остальные пункты можно разобрать на задачи.  Самым сложным и интересным вижу пункт 3.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/5798/</id>
    <title type="text">Не могу сейчас развернуто вникнуть в суть проблемы. 1. Я думаю это неправильно. Иерархия Плазы как р...</title>
    <published>2011-02-10T10:57:29Z</published>
    <updated>2011-02-10T10:57:29Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Не могу сейчас развернуто вникнуть в суть проблемы.&lt;br /&gt;&lt;br /&gt;1. Я думаю это неправильно. Иерархия Плазы как раз сама по себе избыточная (я так понимаю тогда задача стояла сделать что то по быстрому, а не что-то стоящее). Идти за их иерархией - просто повторять их ошибки.&lt;br /&gt;&lt;br /&gt;2. PlazaTable - это то что конфигурируется пользователем. PlazaColumns - базовый класс, содержащийся основные поля. Даже не представляю, как одно может заменить другое... Плюс дальше по описанию вижу, что пользователю предлагается вынести управление потоками. Я однозначно понял за последнее время - этого делать не нужно. Лучше придерживать принципа инкапсуляции. Разрушить его можно в любое время (что опять же не очень хорошо).&lt;br /&gt;&lt;br /&gt;3. Скажу так, все эти PlazaColumnListBuilder PlazaTableConfiguration говорит о том, что уже начался овер дизайн.[biggrin] Надо как-то проще. Потому что сейчас уже не совсем понятно. Что будет потом? А что будет с теми пользователями, которые захотят переползти с голой Плазы? Одно сложное на другое сложно не меняют.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/5773/</id>
    <title type="text">Что я предлагаю: Сейчас все метаданные описаны классами-наследниками PlazaColumns, что не совсем соо...</title>
    <published>2011-02-07T20:42:11Z</published>
    <updated>2011-02-07T20:42:54Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Что я предлагаю:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Сейчас все метаданные описаны классами-наследниками PlazaColumns, что не совсем соответствует иерархии метаданных самой Плазы.  Я предлагаю создать абстрактный класс PlazaReplicationStream (название можно как-нибудь сократить, например PlazaReplStream), наследники которого будут соответствовать потокам репликации, например, FortsOptTradeReplicationStream - FORTS_OPTTRADE_REPL, RtsIndexReplicationStream - RTS_INDEX_REPL и т.д.  По аналогии со структурой PlazaColumns в самом PlazaReplicationStream будут открытые переменные readonly для каждого потока репликации, например&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;public static readonly FortsOptTradeReplicationStream FortsOptTradeRepl = new FortsOptTradeReplicationStream();&lt;br /&gt;public static readonly RtsIndexReplicationStream RtsIndexRepl = new RtsIndexReplicationStream();&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;li&gt;PlazaColumns предалагю переименовать в PlazaTable, потому что это все-таки таблицы, а не наборы колоннок, которые можно между собой смешивать (но это лишь моя интерпретация названия PlazaColumns).  В каждом классе потоке репликации будут свои наследники PlazaTable, что будет соответствовать содержанию самих потоков репликации в Плазе.  Так, что если в FORTS_OPTTRADE_REPL есть таблицы orders_log, deal, heartbeat, в классе FortsOptTradeReplicationStream будут такие поля:&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;public readonly PlazaOptionOrdersLogColumns OrdersLog = new PlazaOptionOrdersLogColumns();&lt;br /&gt;public readonly PlazaOptionDealColumns Deal = new PlazaOptionDealColumns();&lt;br /&gt;public readonly PlazaHeartBeatColumns HeartBeat;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Теперь, если нужно подписаться на весь поток FORTS_OPTTRADE_REPL и получать данные по всем таблицам, это можно сделать так:&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;_plazaStreamManager.AddStream(&amp;quot;FortsOptTradeRepl_OrdersLog&amp;quot;, PlazaReplicationStream.FortsOptTradeRepl);&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;А, если нужно подписаться только на одну таблицу, например orders_log, это можно сделать так&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;_plazaStreamManager.AddStream(&amp;quot;FortsOptTradeRepl_OrdersLog&amp;quot;, PlazaReplicationStream.FortsOptTradeRepl.OrdersLog);&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Если нужно передать только отдельные колонки, то это делатется так:&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;_plazaStreamManager.AddStream(&amp;quot;FortsOptTradeRepl_OrdersLog&amp;quot;, PlazaReplicationStream.FortsOptTradeRepl.OrdersLog, columns1);&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;где columns1 это&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;var columns1 = new PlazaColumn&amp;#91;&amp;#93;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.ReplId,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.ReplRev,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.ReplAct,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.Price,&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.Hedge&lt;br /&gt;};&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Кстати, уже сейчас по ходу написания родилась мысль, что в последнем примере вместо IEnumerable&amp;lt;PlazaColumn&amp;gt; можно будет передавать новый класс, называющийся, например, PlazaColumnListBuilder, который, во-первых, будет за клиента автоматом добавлять первыми тремя колонками служебные колонки ReplId, ReplRev, ReplAct (это обязательно, иначе не подключишься), а, во-вторых, будет проверять, чтобы все колонки были одной таблицы.&lt;br /&gt;&lt;li&gt;Нынешний PlazaTable предлагаю переименовать в PlazaTableConfiguration.  Он будет уметь сохранять заданную конфигурацию таблицы (читай нужный набор колоннок) в ini-файле в формате Плазы, а также создаваться из таких файлов для последующего подключения к потокам репликации.&lt;br /&gt;&lt;li&gt;PlazaTableTypes нужно, наверное, либо прицепить к наследникам PlazaReplicationStream, либо убрать вообще.&lt;/ol&gt;&lt;br /&gt;Если мои предложения принимаются, я могу начать вносить изменения.  Также беру на себя рефакторинг всех наследников PlazaColumns.  Постараюсь сделать на этой неделе до конца выходных.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/5758/</id>
    <title type="text"> Хочу предложить серьезные изменения в структуре метаданных. Вместе с обоснованием хочу для наглядно...</title>
    <published>2011-02-06T12:25:46Z</published>
    <updated>2011-02-06T12:25:46Z</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;aspirant &lt;a href="https://stocksharp.com/posts/m/5757/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;Хочу предложить серьезные изменения в структуре метаданных.  Вместе с обоснованием хочу для наглядности выложить пример на WPF.  Как это лучше сделать?&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;aspirant &lt;a href="https://stocksharp.com/posts/m/5757/" 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;Можно, но муторно как и любой откат.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/5757/</id>
    <title type="text">Михаил, Хочу предложить серьезные изменения в структуре метаданных. Вместе с обоснованием хочу для н...</title>
    <published>2011-02-06T11:49:32Z</published>
    <updated>2011-02-06T11:49:32Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Михаил,&lt;br /&gt;&lt;br /&gt;Хочу предложить серьезные изменения в структуре метаданных.  Вместе с обоснованием хочу для наглядности выложить пример на WPF.  Как это лучше сделать?&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/5716/</id>
    <title type="text">А где теперь делать проверку, что в таблицу попала правильная колонка? Предлагаю у PlazaColumn сдела...</title>
    <published>2011-02-02T19:08:19Z</published>
    <updated>2011-02-02T19:08:19Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/5682/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;А где теперь делать проверку, что в таблицу попала правильная колонка?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Предлагаю у PlazaColumn сделать readonly поле Owner типа PlazaColumns, инициализировать его в конструкторе PlazaColumn.  В конструкторе PlazaTable перебирать IEnumerable&amp;lt;PlazaColumn&amp;gt; columns и сравнивать у каждого элемента Owner.ReplicationStream, Owner.ReplicationScheme и Owner.Table c replicationStream, replicationScheme, переданными в конструктор PlazaTable.&lt;br /&gt;&lt;br /&gt;Как вариант, можно убрать из параметров конструктора PlazaTable параметры ReplicationStream replicationStream, ReplicationScheme replicationScheme, string name вообще и считать, что правильные параметры ReplicationStream, ReplicationScheme, [Table]name указаны в первом элементе IEnumerable&amp;lt;PlazaColumn&amp;gt; columns.  Соответственно, проверку на правильность остальных элементов IEnumerable&amp;lt;PlazaColumn&amp;gt; columns проводить с значениями полей первого элемента.&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.com/posts/m/5682/</id>
    <title type="text"> public abstract ReplicationStream ReplicationStream { get; } public virtual ReplicationScheme Repli...</title>
    <published>2011-02-01T06:42:54Z</published>
    <updated>2011-02-01T06:42:54Z</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;aspirant &lt;a href="https://stocksharp.com/posts/m/5681/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;public abstract ReplicationStream ReplicationStream { get; }&lt;br /&gt;public virtual ReplicationScheme ReplicationScheme { get { return ReplicationScheme.CustReplScheme; } }&lt;br /&gt;public abstract string Table { get; }&lt;br /&gt;&lt;br /&gt;У каждой таблицы потока репликации, т.е. наследника PlazaColumns, своя уникальная неизменная комбинация ReplicationStream + ReplicationScheme + Table.  Она мне нужна для создания ini-файла.&lt;br /&gt;&lt;br /&gt;Букв много.  Надеюсь, что не запутал окончательно.&lt;br /&gt;&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/5681/</id>
    <title type="text">Но мне не понятно эта иерархия. Стрим - репликация - таблица. Это реально нужная вещь, без которой П...</title>
    <published>2011-01-31T20:18:16Z</published>
    <updated>2011-01-31T20:18:16Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/5675/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Но мне не понятно эта иерархия. Стрим - репликация - таблица. Это реально нужная вещь, без которой Плаза не взлетит? Пока выглядит как избыточность.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Это не мои изобретения.  Выдача данных клиентов Плазой строится следующим образом: есть несколько потоков репликации (FORTS_OPTINFO_REPL и т.д.).  У каждого потока есть dbscheme.  Вроде у каждого потока она одна, но пока не успел проверить точно.  Зачем она нужна, если она одна, - ума не приложу.  И наконец в каждом потоке есть от одной до несколько таблиц.  Это их мы описывали наследниками PlazaColumns.  &lt;br /&gt;&lt;br /&gt;Чтобы подписаться на потоки и получать данные, я могу просто указать имя потока (второй конструктор PlazaStream).  В этом случае будут приходить ВСЕ данные потока, т.е. если в нем несколько таблиц, например в FORTS_FUTINFO_REPL их 17 штук, их данные будут приходить через событие CP2DataStreamClass.StreamDataInserted вперемешку.  Второй вариант - это, когда я отправляю на сервер содержимое ini-файла таблицы с обязательным указанием потока репликации, dbscheme, именем таблицы и списка нужных колонок запрашиваемой таблицы.  В этом случае, понятно, приходят только запрошенные колонки запрошенной таблицы.&lt;br /&gt;&lt;br /&gt;Из-за того, что процесс подписки на потоки построен именно таким образом, я считаю необходимым добавить в PlazaColumns&lt;br /&gt;&lt;br /&gt;public abstract ReplicationStream ReplicationStream { get; }&lt;br /&gt;public virtual ReplicationScheme ReplicationScheme { get { return ReplicationScheme.CustReplScheme; } }&lt;br /&gt;public abstract string Table { get; }&lt;br /&gt;&lt;br /&gt;У каждой таблицы потока репликации, т.е. наследника PlazaColumns, своя уникальная неизменная комбинация ReplicationStream + ReplicationScheme + Table.  Она мне нужна для создания ini-файла.&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.com/posts/m/5675/</id>
    <title type="text"> Вопрос: еще раз хотел вернуться, потому что не совсем для себя уяснил. Как вам видится (изначально ...</title>
    <published>2011-01-31T08:42:55Z</published>
    <updated>2011-01-31T08:43:19Z</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;aspirant &lt;a href="https://stocksharp.com/posts/m/5668/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;&lt;b&gt;Вопрос:&lt;/b&gt; еще раз хотел вернуться, потому что не совсем для себя уяснил.  Как вам видится (изначально виделась) работа клиентского кода с PlazaTrader в применении к плазовским стримам (потоками репликации).  При запуске PlazaTrader из клиентского кода, PlazaTrader подключается&lt;br /&gt;&lt;ol&gt;&lt;li&gt;к стримам, чьи схемы расписаны в ini-файлах специальной папке?&lt;br /&gt;&lt;li&gt;и/или клиентский код создает схемы программным путем на лету?&lt;/ol&gt;&lt;br /&gt;Во втором случае это будет происходить через создание экземпляра PlazaTable и передачу его в PlazaTrader или мы оставим PlazaStreamManager public?  Сейчас он сделан public только в целях тестирования (чтобы можно было вызывать напрямую из тестового проекта).&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;И то и другое. При старте настройки PlazaTable берутся из уже созданных ini файлов. Если их нет, то создается минимально допустимый набор метаданных (как это было сделано с Quik таблицами) и по свеже созданным таблицам создаются соответствующие ini файлы. Если клиентский код модифицирует PlazaTable, его действия так же применяются и к ini файлам.&lt;br /&gt;&lt;br /&gt;Но мне не понятно эта иерархия. Стрим - репликация - таблица. Это реально нужная вещь, без которой Плаза не взлетит? Пока выглядит как избыточность.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;aspirant &lt;a href="https://stocksharp.com/posts/m/5668/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;Но тогда подразумевается, что в PlazaTable можно передать колонки из разных наследников PlazaColumns, но с одинаковым PlazaTableTypes.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Я думаю, неправильно было изначально делать разные PlazaColumns с одинаковыми PlazaTableTypes. Я же не знал, что для одной сущности в Плазе триллион таблиц соответствует. Потому и написал изначально, Position Portfolio и т.д. Так что да, или его переделывать, или его выкидывать.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/5668/</id>
    <title type="text">Михаил, Вопрос и комментарий. Вопрос: еще раз хотел вернуться, потому что не совсем для себя уяснил....</title>
    <published>2011-01-31T05:47:15Z</published>
    <updated>2011-01-31T05:47:15Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Михаил,&lt;br /&gt;&lt;br /&gt;Вопрос и комментарий.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Вопрос:&lt;/b&gt; еще раз хотел вернуться, потому что не совсем для себя уяснил.  Как вам видится (изначально виделась) работа клиентского кода с PlazaTrader в применении к плазовским стримам (потоками репликации).  При запуске PlazaTrader из клиентского кода, PlazaTrader подключается&lt;br /&gt;&lt;ol&gt;&lt;li&gt;к стримам, чьи схемы расписаны в ini-файлах специальной папке?&lt;br /&gt;&lt;li&gt;и/или клиентский код создает схемы программным путем на лету?&lt;/ol&gt;&lt;br /&gt;Во втором случае это будет происходить через создание экземпляра PlazaTable и передачу его в PlazaTrader или мы оставим PlazaStreamManager public?  Сейчас он сделан public только в целях тестирования (чтобы можно было вызывать напрямую из тестового проекта).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Комментарий:&lt;/b&gt; наверное, перечисление PlazaTableTypes будет лишним.  Как я понимаю, оно сделано для проверки совместимости PlazaTable и PlazaColumn (см. внизу)&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/5455/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Для чего нужен тип таблицы. Для того, чтобы предотвращать в пользовательском коде такие вещи:&lt;br /&gt;&lt;br /&gt;plazaTrader.&lt;span class="highlight"&gt;SecuritiesTable&lt;/span&gt;.Columns.Add(PlazaColumns.&lt;span class="highlight"&gt;OrdersColumns&lt;/span&gt;.Direction)&lt;br /&gt;&lt;br /&gt;и выбрасывать исключения при запуске программы.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Но тогда подразумевается, что в PlazaTable можно передать колонки из разных наследников PlazaColumns, но с одинаковым PlazaTableTypes.  А это не пройдет.  Еще раз повторюсь: &amp;quot;синтетические&amp;quot; схемы из колонок разных плазовских схем (PlazaColumns) создавать нельзя.  Корректным при наполненни PlazaTable набором PlazaColumn&amp;#39;ов будет проверять каждую PlazaColumn на одинаковость с PlazaTable по ReplicationStream, ReplicationScheme и Table(Name).&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.com/posts/m/5666/</id>
    <title type="text">Добавил класс с кодами ошибок плазы - PlazaErrors парсит код ошибки и возвращает текст ps ктото нача...</title>
    <published>2011-01-30T21:35:57Z</published>
    <updated>2011-01-30T22:00:05Z</updated>
    <author>
      <name>skuvv</name>
      <uri>https://stocksharp.com/users/28621/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/5659/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;skuvv &lt;a href="https://stocksharp.com/posts/m/5654/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Добавил класс с кодами ошибок плазы - PlazaErrors&lt;br /&gt;парсит код ошибки и возвращает текст&lt;br /&gt;ps ктото начал заниматься ошибками - пользуйтесь&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Я этим занимаюсь[blush]. Но пока нет времени доделать, так что большое спасибо, что помогли. Но раз уж сделали, вот и Вам code review:&lt;br /&gt;&lt;br /&gt;1. public class Errors. Его не нужно сделать статическим? Нужен ли он для public?&lt;br /&gt;2. Error_Code. Лучше параметры называть в C# стиле.&lt;br /&gt;3. Dictionary&amp;lt;int, List&amp;lt;string&amp;gt;&amp;gt; &lt;b&gt;List&lt;/b&gt;. Конечно же, это никакой не Лист. Но и Дикшинари тоже будет неправильно назвать. У этого поля должно быть осмысленное имя.&lt;br /&gt;4. List.ElementAt(i) - лучше использовать List[i]. Так быстрее, особенно если это Dictionary.&lt;br /&gt;5. BitConverter.GetBytes(Error_Code)[i] Можно написать проще - Error_Code.To&amp;lt;byte[]&amp;gt;()[i].&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Просто готовый был класс [smile] &lt;br /&gt;насчет 4. в Dictionary таким способом (List[i]) доступ к ключу не получить вроде</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/5665/</id>
    <title type="text">Увидел такую подписку: plazaStream.DataBegin += (p) =&amp;gt; OnPlazaStreamDataBegin(key, p); Она плоха тем...</title>
    <published>2011-01-30T20:59:57Z</published>
    <updated>2011-01-30T20:59:57Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/5658/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Увидел такую подписку:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;plazaStream.DataBegin += (p) =&amp;gt; OnPlazaStreamDataBegin(key, p);&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Она плоха тем, что при таком подписывании нельзя будет отписаться от события и объект будет продолжать висеть в памяти (не так страшно при существующих гигабайтах, но все же). Лямбда выражения создают &amp;quot;на лету&amp;quot; метод обработчик, от которого потом не отписаться. Чтобы производить правильное освобождение ресурсов, нужно от них отказать вообще и писать по старинке:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;plazaStream.DataBegin += OnPlazaStreamDataBegin;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Я думаю, лучше сразу проговорить для чего вообще нужны лямбда. Они появились тогда, когда в .NET начал входить функциональный стиль. Для этого и только для этого их и придумали (явный пример - это LINQ). Я в своих примерах использовал лямбду не потому что так правильно. А потому что мне было лень писать правильно, и быстрее + короче написать как это сделали Вы. Но внутри S# я так конечно же не делаю, к чему призываю делать и в ПлазаТрейдере.[laugh] &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Это пока временный вариант, потому что я пока еще не определился с окончательным набором параметров событий.  По ходу написания добавил string key, а поскольку хотелось залить первый черновой вариант, оставил как есть.&lt;br /&gt;&lt;br /&gt;Свои делегаты я убрал вообще.  Вы правы, они лишние.  Все вызовы событий передал через SafeInvoke.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/5664/</id>
    <title type="text"> 1. Плохой код. try { _dataStream.Close(); } catch (System.Runtime.InteropServices.COMException e) {...</title>
    <published>2011-01-30T20:38:19Z</published>
    <updated>2011-01-30T20:39:24Z</updated>
    <author>
      <name>aspirant</name>
      <uri>https://stocksharp.com/users/6114/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/5657/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;&lt;br /&gt;1. Плохой код.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;try&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;_dataStream.Close();&lt;br /&gt;}&lt;br /&gt;catch (System.Runtime.InteropServices.COMException e)&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;// Исправить обработку исключения&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;System.Diagnostics.Trace.WriteLine(&amp;quot;Exception {0:X}: {1}&amp;quot;.Put(e.ErrorCode, e.Message));&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Исключения нужно перехватывать как можно выше. Кто будет вызывать Close, тот пусть и этим занимается. А так ошибка просто проглотиться.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Я пока сделал такую заплату, чтобы можно было тестировать код (поэтому и оставил для себя комментарий).  Вообще мне кажется, COMException нужно везде перехватывать и выдавать свои исключения, чтобы внешнему коду не видеть внутреннюю кухню.  Если внешний код имеет дело с PlazaStream, то он и должен оперировать понятиями (читай методами, статусами и т.д.) PlazaStream.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/5657/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;3. &lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;_dataStream.TableSet.set_rev(plazaTable.Name, _currentRevision++);&lt;/div&gt;&lt;/div&gt; Это меняется на более элегантное, как подсказал R#:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;_dataStream.TableSet.rev&amp;#91;plazaTable.Name&amp;#93; = _currentRevision++;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;исправлю.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/5657/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;4. ReplicationStream и ReplicationScheme явно как то не так используется. Это же уровень метаданных, а именно таблица PlazaTable (таблица олицетворяет стрим данных, PlazaStream по этом олицетворению производит подключение). А получилось так, что эти два перечисления размазались по всем практически классам в Плазе. Нехорошо. Конструктора PlazaStream(PlazaTable plazaTable, TRequestType requestType) более чем достаточно. Зачем нужен еще один я не понял.&lt;br /&gt;&lt;br /&gt;5. public void AddStream(string key, PlazaColumns schema, IEnumerable&amp;lt;PlazaColumn&amp;gt; columns) Выглядит как то не так. Зачем столько аргументов? Можно же ведь передать один PlazaTable и уже по нему создать стрим, и уже оперировать им в дальнейшем.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Иерархия данных в потоках репликации: ReplicationStream -&amp;gt; ReplicationScheme -&amp;gt; Table -&amp;gt; Field, т,е. у каждой плазовской таблицы (в PlazaTrader это PlazaColumns) есть только одно значение ReplicationStream и ReplicationScheme, поэтому я и счел нужным добавить эти поля в PlazaColumns, чтобы при создании PlazaStream значения ReplicationStream и ReplicationScheme можно было вычислить из PlazaColumns.  &lt;br /&gt;&lt;br /&gt;Есть два варианта получения данных репликации. Во-первых, можно передать Плазе полный или урезанный набор полей какой-то таблицы (создавать &amp;quot;свои&amp;quot; таблицы с полями из нескольких таблиц нельзя).  Второй вариант запроса данных - без указания схемы (см. P2ClientGate.doc стр. 18: &amp;quot;Клиент также может не указывать никакой схемы при открытии потока, в этом случае сервер будет отдавать все данные, которые публикуются в потоке (далее этот режим будет называться &amp;#171;получение данных по схеме сервера&amp;#187;)&amp;quot;.  Поскольку такой вариант подключения существует, я предусмотрел второй конструктор PlazaStream, в котором только передается ReplicationStream.  При таком подключении при получении данных через события нужно будет проверять название таблицы, именно поэтому у CP2DataStreamClass второй параметр событий StreamDataInserted, StreamDataUpdated и StreamDataDeleted - это string tableName.&lt;br /&gt;&lt;br /&gt;AddStream(string key, PlazaColumns schema, IEnumerable&amp;lt;PlazaColumn&amp;gt; columns) я исправлю на AddStream(string key, PlazaTable plazaTable)</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/5659/</id>
    <title type="text">Добавил класс с кодами ошибок плазы - PlazaErrors парсит код ошибки и возвращает текст ps ктото нача...</title>
    <published>2011-01-30T17:16:11Z</published>
    <updated>2011-01-30T17:16:11Z</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;skuvv &lt;a href="https://stocksharp.com/posts/m/5654/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Добавил класс с кодами ошибок плазы - PlazaErrors&lt;br /&gt;парсит код ошибки и возвращает текст&lt;br /&gt;ps ктото начал заниматься ошибками - пользуйтесь&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Я этим занимаюсь[blush]. Но пока нет времени доделать, так что большое спасибо, что помогли. Но раз уж сделали, вот и Вам code review:&lt;br /&gt;&lt;br /&gt;1. public class Errors. Его не нужно сделать статическим? Нужен ли он для public?&lt;br /&gt;2. Error_Code. Лучше параметры называть в C# стиле.&lt;br /&gt;3. Dictionary&amp;lt;int, List&amp;lt;string&amp;gt;&amp;gt; &lt;b&gt;List&lt;/b&gt;. Конечно же, это никакой не Лист. Но и Дикшинари тоже будет неправильно назвать. У этого поля должно быть осмысленное имя.&lt;br /&gt;4. List.ElementAt(i) - лучше использовать List[i]. Так быстрее, особенно если это Dictionary.&lt;br /&gt;5. BitConverter.GetBytes(Error_Code)[i] Можно написать проще - Error_Code.To&amp;lt;byte[]&amp;gt;()[i].</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/5658/</id>
    <title type="text">Увидел такую подписку: plazaStream.DataBegin += (p) =&amp;gt; OnPlazaStreamDataBegin(key, p); Она плоха тем...</title>
    <published>2011-01-30T17:04:22Z</published>
    <updated>2011-01-30T17:04:22Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Увидел такую подписку:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;plazaStream.DataBegin += (p) =&amp;gt; OnPlazaStreamDataBegin(key, p);&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Она плоха тем, что при таком подписывании нельзя будет отписаться от события и объект будет продолжать висеть в памяти (не так страшно при существующих гигабайтах, но все же). Лямбда выражения создают &amp;quot;на лету&amp;quot; метод обработчик, от которого потом не отписаться. Чтобы производить правильное освобождение ресурсов, нужно от них отказать вообще и писать по старинке:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;plazaStream.DataBegin += OnPlazaStreamDataBegin;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Я думаю, лучше сразу проговорить для чего вообще нужны лямбда. Они появились тогда, когда в .NET начал входить функциональный стиль. Для этого и только для этого их и придумали (явный пример - это LINQ). Я в своих примерах использовал лямбду не потому что так правильно. А потому что мне было лень писать правильно, и быстрее + короче написать как это сделали Вы. Но внутри S# я так конечно же не делаю, к чему призываю делать и в ПлазаТрейдере.[laugh] </content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>