← Назад

Текущие задачи по PlazaTrader

  1. Избавиться от накопления очереди сообщений в первые секунды работы (необходимо разбить получение реплики на несколько соединений, работающих в отдельных thread'ах, каждое со своим циклом выборки).
  2. Добавить профилировщик получения данных и отправки заявок - необходимо понять насколько быстрый PlazaTrader у нас (особенно в связи с грядущими изменениями в плазе после нового года).
  3. Отфильтровывать данные от уже прошедшей сессии (вечером приходят данные как от дневной, так и от вечерней сессии).
  4. Если заявка GTC, то в вечерний клиринг приходит сообщение Inserted, с id_ord = новому номеру заявки и с id_ord1 = старому номеру заявки. Необходимо заменить одно на другое.

Ничего не упустил?

3ий таск я уже начал делать в фоновом режиме. Кто готов взяться за другие задачи?

Сделано: 2) Обрабатывать снятие заявки в клиринг (сейчас заявка остаётся активной и снять её невозможно). (Alexander) 3) Поддержка Plaza 64x. (frontman) 4) Возможность задания даты истечения заявки (сейчас делается через PlazaStopCondition.ExpiryDate, что не прозрачно, т.к. на Plaza вообще нет стоп заявок). (Alexander) 7) Добавить поддержку FutMoveOrder - одновременное перемещение 2х заявок. (frontman)

Комментарии (192)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

frontman
frontman

По первому пункту хотел бы вопрос задать: я правильно понял что изменять надо вот эту часть:

Streams.SyncDo(c =>
				{
					foreach (var stream in Streams)
					{
						try
						{
							stream.CheckConnection(_connection);
                            anySuccess = true;
						}
						catch (COMException e)
						{
                            System.Diagnostics.Trace.WriteLine("Ошибка проверки потока репликации - stream.CheckConnection(_connection) - COMException " + e.ErrorCode.ToString());
						}
					}
				});

Просто пытаюсь разобраться в механизмах стокшарпа. Вот на всякий случай переспрашиваю)

FiNick
FiNick

frontman: По первому пункту хотел бы вопрос задать: я правильно понял что изменять надо вот эту часть

Скорее всего именно эту часть менять не придется. Надо завести пару PlazaStreamManager, в методе StartExport написать что-то вроде


StartStream(1,
            StreamRegistry.CommonFutureStream,
            StreamRegistry.SessionContentsFutureStream,
	    StreamRegistry.CommonOptionStream,		 	 
	    StreamRegistry.SessionContentsOptionStream,
	    StreamRegistry.PortfoliosStream,
	    StreamRegistry.PositionsStream
	    );

StartStream(2,
            StreamRegistry.DealFutureStream,
            StreamRegistry.DealOptionStream,
            StreamRegistry.OrdersLogFutureStream,
            StreamRegistry.OrdersLogOptionStream,
            DefaultFutureDepthStream,
            DefaultOptionDepthStream,
            StreamRegistry.SessionFutureStream);

Где 1 и 2 номер стрим менеджера, в который соответствующие потоки надо добавить. И так далее...

Я смогу заняться 1 пунктом в конце недели, как освобожусь...

frontman
frontman

Спасибо. Понял. Я просто думал чт для каждого потока надо создать отдельный thread, а тут как я понимаю разделение только фьючерсов и опционов идет...

Alexander
Alexander Автор

frontman: Спасибо. Понял. Я просто думал чт для каждого потока надо создать отдельный thread, а тут как я понимаю разделение только фьючерсов и опционов идет...

Для каждого потока отдельный thread точно не нужен. Надо часть потоков - в один thread, часть - в другой.

Alexander
Alexander Автор

Занялся пунктом 2), добавил пункт 6) - его тоже надо сделать, сейчас некорректно работает после клиринга из-за него.

Кто возьмётся?

frontman
frontman

Кстати сегодня разговаривал с одним из специалистов РТС. Он сказал что есть метод перерегистрации пары заявок. Что нибудь слышали об этом? По моему в плазе это не реализовано еще...

Alexander
Alexander Автор

frontman: Кстати сегодня разговаривал с одним из специалистов РТС. Он сказал что есть метод перерегистрации пары заявок. Что нибудь слышали об этом? По моему в плазе это не реализовано еще...

Что за "перерегистрация пары заявок"?

frontman
frontman

ReRegisterOrder(Order, Order) - Перерегистрировать заявку на бирже. Это прям из мануала строчка. Я в рамках терминологии этой написал... Так вот есть метод позволяющий передвигать пару заявок. Ну так меня заверил человек с РТС))

frontman
frontman

FutMoveOrder - это для передвижения одной заявки А есть что то такое же для двух... Я вот и спрашиваю знаете ли вы об этом что то?

Alexander
Alexander Автор

frontman: FutMoveOrder - это для передвижения одной заявки А есть что то такое же для двух... Я вот и спрашиваю знаете ли вы об этом что то?

Знаем. FutMoveOrder - для перемещения 2х заявок как раз, а не 1ой.

frontman
frontman

Т.е ReRegisterOrder(Order, Order) перемещает вот эти две заявки? А куда тогда? Если бы он выглядил вот так : ReRegisterOrder(Order, Order, Order, Order) я б еще понял ... А так что то не пойму(( Извините...

Alexander
Alexander Автор

frontman: Т.е ReRegisterOrder(Order, Order) перемещает вот эти две заявки? А куда тогда? Если бы он выглядил вот так : ReRegisterOrder(Order, Order, Order, Order) я б еще понял ... А так что то не пойму(( Извините...

У вас исходный код есть - смотрите сами. Там всё очевидно, я только что по коду сам посмотрел. Почему другие могут пользоваться поиском, а вы не умеете? Надо учиться. И лучше поздно, чем никогда.

frontman
frontman

Этот метод для отмены одной заявки и регистрации другой в рамках одной транзакции. А я говорю о методе отменяющем 2 заявки и выставляющим 2 заявки в рамках одной транзакции. То что есть явно это не делает.

Alexander
Alexander Автор

frontman: Этот метод для отмены одной заявки и регистрации другой в рамках одной транзакции. А я говорю о методе отменяющем 2 заявки и выставляющим 2 заявки в рамках одной транзакции. То что есть явно это не делает.

Я ведь говорю что по коду несложно понять. :) Добавил пункт 7. Опять никто не готов взяться, будем ждать пока у нас руки дойдут?

FiNick
FiNick

Alexander Mukhanchikov: 7) Добавить поддержку FutMoveOrder - одновременное перемещение 2х заявок.

Не пойму, чем ReRegisterOrder(Order, Order, Order, Order) лучше двух последовательных ReRegisterOrder(Order, Order) в плане быстродействия или удобства?? Одной транзакцией это сделать нельзя вродебы.

Mikhail Sukhov
Mikhail Sukhov

FiNick:

Alexander Mukhanchikov: 7) Добавить поддержку FutMoveOrder - одновременное перемещение 2х заявок.

Не пойму, чем ReRegisterOrder(Order, Order, Order, Order) лучше двух последовательных ReRegisterOrder(Order, Order) в плане быстродействия или удобства?? Одной транзакцией это сделать нельзя вродебы.

Тоже не понимаю, зачем такой костыль. Для такого метода нужно и код написать в стратегии. Что мне кажется совсем уж не удобно. Подозреваю, что это сделано для атомарного изменения multi leg заявки. Но могу ошибаться.

esper
esper

FiNick: Не пойму, чем ReRegisterOrder(Order, Order, Order, Order) лучше двух последовательных ReRegisterOrder(Order, Order) в плане быстродействия или удобства?? Одной транзакцией это сделать нельзя вродебы.

Это вроде не костыль, FutMoveOrder (OptMoveOrder) позволяет переставить две заявки за одну транзакцию

Alexander
Alexander Автор

FiNick:

Alexander Mukhanchikov: 7) Добавить поддержку FutMoveOrder - одновременное перемещение 2х заявок.

Не пойму, чем ReRegisterOrder(Order, Order, Order, Order) лучше двух последовательных ReRegisterOrder(Order, Order) в плане быстродействия или удобства?? Одной транзакцией это сделать нельзя вродебы.

  1. На бирже это учитывается как 1 транзакция. Когда у тебя ограничение в 30\60\150 транзакций в секунду - такая экономия крайне важна.
  2. Результат приходит в одном ответе
  3. Крайне удобно для выполнения обязательств маркет мейкинга
frontman
frontman

Да если меня с работы раньше не выгонят то скоро займусь)

Alexander
Alexander Автор
  1. пункт сделал
frontman
frontman

Для меня это экономия в деньгах прежде всего. http://www.rts.ru/s186#trans - денег неплохо так берут.

Alexander
Alexander Автор

frontman: Для меня это экономия в деньгах прежде всего. http://www.rts.ru/s186#trans - денег неплохо так берут.

Я правильно понял, что вы взялись делать пункт с MoveOrder?

frontman
frontman

Ну... Да)) Как сделаю вам написать надо, что бы вы мне логин и пароль дали для?

Alexander
Alexander Автор

frontman: Ну... Да)) Как сделаю вам написать надо, что бы вы мне логин и пароль дали для?

Да. Или сюда к сообщению фикс приложите, мы сами закоммитим.

frontman
frontman

ок.

Alexander
Alexander Автор

Добавил 8-9 пункты.

Alexander
Alexander Автор

Сделал 2)

FiNick
FiNick

1 задача с очередями пока не получается, ошибки сыпятся

frontman
frontman

7 - сделал. Как залить то?)

Alexander
Alexander Автор

frontman: 7 - сделал. Как залить то?)

Сюда, в зип архиве.

frontman
frontman

Вот. Там ток часть плазы

Alexander
Alexander Автор

frontman: Вот. Там ток часть плазы

TransactionManager.cs битый в архиве. В нём изменения есть? Или у меня только проблемы - у кого-нибудь получилось полностью скачать?

FiNick
FiNick

Частично сделал задачу один. Разделил реплики на три потока, вроде как работает. Но работет как-то криво, даже медленнее данные стали подгружаться (раньше 10 секунд, теперь 25). При подключении большая очередь сохраняется (раньше до 40, теперь до 80-90), что оч странно. Также некоторые моменты не сделал, например:

/// <summary>
/// Потоки, которые будут запущены при вызове метода <see cref="StartExport"/>.
/// </summary>
public PlazaStreamList Streams
{
	get { return _streamManager1.Streams; } //??? Надо как-то обьеденить потоки от всех _streamManager
}
Mikhail Sukhov
Mikhail Sukhov

Давайте лучше сразу на КодеПлекс. У Александра сейчас пока нет времени, так что коммитьте сразу в код. Можно через Shelves.

FiNick
FiNick

Mikhail Sukhov: Давайте лучше сразу на КодеПлекс. У Александра сейчас пока нет времени, так что коммитьте сразу в код. Можно через Shelves.

Залил на кодеплекс.

З.Ы. Забыл комент написать, блин) а можно как-нибудь комент потом вписывать в ченжсет?

Mikhail Sukhov
Mikhail Sukhov

FiNick: З.Ы. Забыл комент написать, блин) а можно как-нибудь комент потом вписывать в ченжсет?

Да, через Show History, changeset details и комментарий вписать.

Alexander
Alexander Автор

FiNick: Частично сделал задачу один. Разделил реплики на три потока, вроде как работает. Но работет как-то криво, даже медленнее данные стали подгружаться (раньше 10 секунд, теперь 25). При подключении большая очередь сохраняется (раньше до 40, теперь до 80-90), что оч странно. Также некоторые моменты не сделал, например:

/// <summary> /// Потоки, которые будут запущены при вызове метода <see cref="StartExport"/>. /// </summary> public PlazaStreamList Streams { get { return _streamManager1.Streams; } //??? Надо как-то обьеденить потоки от всех _streamManager }



Посмотрел - совсем не то что хотелось бы.
Нет возможности самому регулировать создание потоков и выделение им реплик.
+ подтверждаю что быстрее как минимум не стало.

Наверное в ближайшее время займусь.


P.S. Предлагаю все изменения класть в shelve, а не на main trunk. Отписываясь об этом здесь, чтоб знать где что смотреть.
frontman
frontman

Александр а что с 7м пунктом то? Вроде как все сделал я ... И давно... Или что то не так?

Alexander
Alexander Автор

frontman: Александр а что с 7м пунктом то? Вроде как все сделал я ... И давно... Или что то не так?

У вас работает? Если да - пользуйтесь, нас не ждите.

Я начал смотреть, мне там кое-что не понравилось. Я не забыл, помню. :) Как конференцию проведём - досмотрю, отпишусь.

frontman
frontman

Ок.

esper
esper

TransactionManager.cs битый в архиве. В нём изменения есть? Или у меня только проблемы - у кого-нибудь получилось полностью скачать? Сейчас попробовал, у меня нормально открылся.

Alexander
Alexander Автор

TransactionManager.cs битый в архиве. В нём изменения есть? Или у меня только проблемы - у кого-нибудь получилось полностью скачать? Сейчас попробовал, у меня нормально открылся.

Приложи к сообщению, пожалуйста. Глюк какой-то видимо у меня. Из разных браузеров пробовал - одно и тоже.

esper
esper

сабж

Alexander
Alexander Автор

7 пункт допилил и залил. Спасибо frontman

FiNick
FiNick

Alexander Mukhanchikov: 7 пункт допилил и залил. Спасибо frontman

Отлично! Посмотри первый пункт, плиз=) давно уже с ним бьюсь, не получается, такое ощущение, что несколько потоков пытаются использовать какие-то общие ресурсы, мешают друг-другу и поэтому данные наоборот медленнее подгружаются

Alexander
Alexander Автор

FiNick:

Alexander Mukhanchikov: 7 пункт допилил и залил. Спасибо frontman

Отлично! Посмотри первый пункт, плиз=) давно уже с ним бьюсь, не получается, такое ощущение, что несколько потоков пытаются использовать какие-то общие ресурсы, мешают друг-другу и поэтому данные наоборот медленнее подгружаются

Сегодня смотрел. Там полный рефакторинг необходим работы с потоками репликации. В общем - в ближайших планах.

FiNick
FiNick

Можно пояснить что было сделано в "Change Set 11295. Plaza. Рефакторинг работы с подключениями."? У меня после него перестали заявки ставиться, пишет "Specified cast is not valid." at P2ClientGateMTA32.CP2BLMessageClass.SendAsync2(CP2Connection conn, UInt32 Timeout, Object event, Int64 eventParam)

Alexander
Alexander Автор

FiNick: Можно пояснить что было сделано в "Change Set 11295. Plaza. Рефакторинг работы с подключениями."? У меня после него перестали заявки ставиться, пишет "Specified cast is not valid." at P2ClientGateMTA32.CP2BLMessageClass.SendAsync2(CP2Connection conn, UInt32 Timeout, Object event, Int64 eventParam)

Известно, решаем. Была сделана корректная работа с потоками и стримами.

Mikhail Sukhov
Mikhail Sukhov

Alexander Mukhanchikov: Известно, решаем. Была сделана корректная работа с потоками и стримами.

Убрал атрибут public у TransactionManager. В итоге public потерял и MessageDispatcher, который быть не пабликом не может. Вот думаю, надо наверное не просто вернуть public у TransactionManager, а еще и дать доступ внешнему коду к этому объекту.

FiNick
FiNick

Я так понял теперь можно создавать несколько потоков отправки команд? Интересно, это дало что-нибудь в плане быстродействия?

Mikhail Sukhov
Mikhail Sukhov

FiNick: Я так понял теперь можно создавать несколько потоков отправки команд? Интересно, это дало что-нибудь в плане быстродействия?

Фронтмэн жмется с написанием тестера.😂 Без тестера только гадание на кофейной гуще.

frontman
frontman

FiNick: Я так понял <mark>теперь можно создавать несколько потоков отправки команд</mark>? Интересно, это дало что-нибудь в плане быстродействия?

Оооп) А может кто нить поделиться секретом это как?)

Alexander
Alexander Автор

frontman:

FiNick: Я так понял <mark>теперь можно создавать несколько потоков отправки команд</mark>? Интересно, это дало что-нибудь в плане быстродействия?

Оооп) А может кто нить поделиться секретом это как?)

Plaza: возможность создавать несколько транзакционных потоков.

FiNick
FiNick

Михаил, помнится во времена, когда тестовый сервак плазы не работал, вы (или Александр) тестировали плазу на реальном боевом сервере плазы. Откройте секрет, как можно получить доступ к реальному серверу не проходя сертификацию робота? Дело в том, что с этими очередями сообщений сертификацию не пройти (первый таск собственно), а мне бы уже давно надо отрабатывать быстрые стратегии на реальном сервере...

Mikhail Sukhov
Mikhail Sukhov

FiNick: Михаил, помнится во времена, когда тестовый сервак плазы не работал, вы (или Александр) тестировали плазу на реальном боевом сервере плазы. Откройте секрет, как можно получить доступ к реальному серверу не проходя сертификацию робота?

Купить логин у брокера. Сертификацию кто-то из брокеров еще требует?

FiNick
FiNick

Mikhail Sukhov: Купить логин у брокера. Сертификацию кто-то из брокеров еще требует?

У нас тут деревня похоже=) БКС требует сертификацию, финам вообще не предоставляет прямой доступ на РТС со своей программкой. А разве можно подключиться на РТС в обход брокера? Не охота еще и брокеру комиссию отстегивать

Mikhail Sukhov
Mikhail Sukhov

FiNick: У нас тут деревня похоже=) БКС требует сертификацию, финам вообще не предоставляет прямой доступ на РТС со своей программкой.

А что с другими брокерами? БКС вообще попутал что-то, имхо. Забыл на какой стороне поля играет.

FiNick: А разве можно подключиться на РТС в обход брокера? Не охота еще и брокеру комиссию отстегивать

Нет, только через брокера.

FiNick
FiNick

Кроме БКС и Финама больше в Новосибирске никого нет.

Mikhail Sukhov
Mikhail Sukhov

FiNick: Кроме БКС и Финама больше в Новосибирске никого нет.

Обложили.😂 А дистанционно разве нельзя открыться у другого брокера? Скан пасспорта по факсу и т.д.

dart
dart

FiNick: Кроме БКС и Финама больше в Новосибирске никого нет. Здрасте, а Открытие например, ВТБ-24

frontman
frontman

Офигееееть) Тут все изменения можно смотреть)) Вот я быдляра) Спасибо.

Alexander
Alexander Автор

Сделал существенное увеличение производительности и стабильности выставления заявок. Положил на codeplex. Тестируйте в своих тестерах, пока frontman пишет общий профилировщик. У меня по моим тестам на бою получилось ускорение в 3-5 раз. 😎

to frontman: договаривались уже, что BrokerCode в PlazaTrader ни к чему. Нужен вам локально - создавайте наследника PlazaTrader локально и используйте его там.

frontman
frontman

Alexander Mukhanchikov: Сделал существенное увеличение производительности и стабильности выставления заявок. Положил на codeplex. Тестируйте в своих тестерах, пока frontman пишет общий профилировщик. У меня по моим тестам на бою получилось ускорение в 3-5 раз. 😎

to frontman: договаривались уже, что BrokerCode в PlazaTrader ни к чему. Нужен вам локально - создавайте наследника PlazaTrader локально и используйте его там.

Александр не получиться. В наследники придется переопределить методы в которых используются закрытые поля класса PlazaTrader. Например _transactionManager в методе OnRegisterOrder. Мне придется весь PlazaTrader переписать...

Alexander
Alexander Автор

frontman:

Alexander Mukhanchikov: Сделал существенное увеличение производительности и стабильности выставления заявок. Положил на codeplex. Тестируйте в своих тестерах, пока frontman пишет общий профилировщик. У меня по моим тестам на бою получилось ускорение в 3-5 раз. 😎

to frontman: договаривались уже, что BrokerCode в PlazaTrader ни к чему. Нужен вам локально - создавайте наследника PlazaTrader локально и используйте его там.

Александр не получиться. В наследники придется переопределить методы в которых используются закрытые поля класса PlazaTrader. Например _transactionManager в методе OnRegisterOrder. Мне придется весь PlazaTrader переписать...

Попробуйте так:

есть событие

		/// <summary>
		/// Обработать отправляемую транзакцию до того, как она будет отослана на сервер Plaza.
		/// </summary>
		public event Action<Transaction> ProcessRequest;

Подписываетесь на него. Вам приходит Transaction. Делаете ему SetBrokerCode.

aleksej
aleksej

Alexander Mukhanchikov: Сделал существенное увеличение производительности и стабильности выставления заявок. Положил на codeplex. Тестируйте в своих тестерах, пока frontman пишет общий профилировщик. У меня по моим тестам на бою получилось ускорение в 3-5 раз. 😎

to frontman: договаривались уже, что BrokerCode в PlazaTrader ни к чему. Нужен вам локально - создавайте наследника PlazaTrader локально и используйте его там.

Подтверждаю, Latency заявок снизился очень значительно (у меня, в среднем, со 150 мс. до 50 мс.) и у заявок стали появляться статусы Failed (а раньше просто подвисали на None). Глянул изменения в коде коннектора, примерно понял.

Огромное спасибо, завтра еще буду тестировать :)

Mikhail Sukhov
Mikhail Sukhov

Alexander Mukhanchikov: Подписываетесь на него. Вам приходит Transaction. Делаете ему SetBrokerCode.

А что за брокерский код? Почему мне его не нужно вводить?

Alexander
Alexander Автор

Mikhail Sukhov:

Alexander Mukhanchikov: Подписываетесь на него. Вам приходит Transaction. Делаете ему SetBrokerCode.

А что за брокерский код? Почему мне его не нужно вводить?

frontman делает какую-то хрень на стороне брокера. ему надо его вводить, физикам - нет. в PlazaTrader полю BrokerCode точно не место.

Mikhail Sukhov
Mikhail Sukhov

Alexander Mukhanchikov: frontman делает какую-то хрень на стороне брокера.

😂

FiNick
FiNick

Alexander Mukhanchikov: Сделал существенное увеличение производительности и стабильности выставления заявок. Положил на codeplex. Тестируйте в своих тестерах, пока frontman пишет общий профилировщик. У меня по моим тестам на бою получилось ускорение в 3-5 раз. 😎

Подтверждаю, ускорение есть, правда не в разы, как у Александра. У меня до москвы задержка 53мс в среднем, заявки ставятся в среднем за 100 мс, раньше было 120-140 вроде.

frontman
frontman

Александр благодарю. Вот ток мне кажется время выполнения транзакций из за этого может увеличиться... И попрошу без вот таких вот оценок. Тем более что вы не в курсе моей работы. И насчет брокерского кода: он есть во ВСЕХ транзакциях отправляемых РТС. Только вот лично вам он не нужен и поэтому вы считаете, что это лишне. Я не понимаю в чем проблема... Что он места много занимает? Или что? Принцип?

Alexander
Alexander Автор

frontman: Александр благодарю. Вот ток мне кажется время выполнения транзакций из за этого может увеличиться...

"Кажется"? А если потестировать, да посмотреть? Вот для этого и нужен профилировщик-тестировщик, о котором месяца 2 ведётся разговор. Уже вон отписались и подтвердили мои тесты - снизилось время в 3-4 раза.

Давайте конкретно, без кажется. Где у вас увеличилось время? На каких транзакциях? На каком сервере? Насколько? И у меня и у aleksej средний Latency снизился со 150мс до 50мс. С каких до каких он вырос у вас?

Пока лишь всё что я вижу - это кажется, наверное, думается. Нужны конкретно цифры. На кажется уже отвечать надоело.

frontman: И попрошу без вот таких вот оценок. Тем более что вы не в курсе моей работы. И насчет брокерского кода: он есть во ВСЕХ транзакциях отправляемых РТС. Только вот лично вам он не нужен и поэтому вы считаете, что это лишне. Я не понимаю в чем проблема... Что он места много занимает? Или что? Принцип?

Ну я образно говорю. Я делаю хрень на стороне физика, вы - на стороне брокера :)

Я уже много раз спрашивал - зачем брокерский код простому смертному? Для чего его вписывать в каждую транзакцию? Брокерский код добавляется в транзакцию уже на стороне биржи. И чем вас не устраивает тот метод изменения транзакции, который я описал выше?

Зачем он в PlazaTrader? Это не то поле, которое нужно знать шлюзу. Оно там явно лишнее. Далее - в Transaction не будут добавляться новые поля. Нужно что-то установить - пользуйтесь GetField \ SetField. Те немногие поля, которые там есть - я почищу. Постоянно таблицы модифицируется, что-то добавляется, что-то удаляется. Transaction не будет содержать сотни полей, не будет завязан на конкретную версию шлюза.

Alexander
Alexander Автор

И да, доступ давался несколько для иных задач чем добавление BrokerCode :)

это

  1. модификация стримов по группам чтоб можно было их удалять \ добавлять удобно;
  2. программа-тестировщик скорости работы.
frontman
frontman

Alexander Mukhanchikov:

  1. модификация стримов по группам чтоб можно было их удалять \ добавлять удобно;

Готов сделать. Все таки давайте решим делаем это через

  1. Свойство для каждого потока SecurityType или
  2. Группировку потоков в коллекции futuresStreams, optionsStreams, commonStreams?
Alexander
Alexander Автор

frontman:

Alexander Mukhanchikov:

  1. модификация стримов по группам чтоб можно было их удалять \ добавлять удобно;

Готов сделать. Все таки давайте решим делаем это через

  1. Свойство для каждого потока SecurityType или
  2. Группировку потоков в коллекции futuresStreams, optionsStreams, commonStreams?

Через SecurityType, которое может быть: Future (фьючерсы), Option (только опционы), Common (общее)

frontman
frontman

Да нет Александр) Я не про то что вы пофиксили... Я про событие ProcessRequest)) Ну что вы так сразу близко к сердцу то) Все я понял. Так бы сразу и написали...😭

Alexander
Alexander Автор

frontman: Да нет Александр) Я не про то что вы пофиксили... Я про событие ProcessRequest)) Ну что вы так сразу близко к сердцу то) Все я понял. Так бы сразу и написали...😭

На сколько оно у вас увеличилось по ProcessRequest? На пару микросекунд? :) Сделайте тест, там увеличение если и будет, то << 1 мс.

Я вроде так сразу и писал - спрашивал нафига оно рядовому пользователю. :)

frontman
frontman

Сделал...

Alexander
Alexander Автор

frontman: Сделал...

Отлично. Только поставьте у себя в настройках Visual Studio для табов - сохранение табов (а не пробелы), tab size 4, ident size 4

frontman
frontman

Ок. Щас полазаю))

frontman
frontman

У меня такой вопрос: А почему для StockSharpa используется .NET Framework 3.5? В нем нет например Parallel LINQ, а так было бы приятно)))

Alexander
Alexander Автор

frontman: У меня такой вопрос: А почему для StockSharpa используется .NET Framework 3.5? В нем нет например Parallel LINQ, а так было бы приятно)))

Из-за SmartCom

frontman
frontman

По шестой задачи хотел спросить. Может укажите так сказать направление)) Александр вы можете я знаю)

Alexander
Alexander Автор

frontman: По шестой задачи хотел спросить. Может укажите так сказать направление)) Александр вы можете я знаю)

Если запускать в вечернюю сессию робота, то данные придут и по дневной сессии - т.е. будут одни и теже isin_id инструментов, с разными номерами сессий. Надо брать ту, которая идёт. Также надо понять как заменять текущие инструменты на новые при смене сессии.

frontman
frontman

Хм... Все спасиб)

frontman
frontman

Александр а что дает ваше "Plaza: возможность снимать заявку по ext_id (TransactionId)"? Можно разъяснить... Я там увидел что вроде как можно теперь создать транзакцию для отмены сразу нескольких заявок... А вот реализации такой функции в PlazaTrader не нашел... Можете как то объяснить? Спасибо.

frontman
frontman

frontman: Я там увидел что вроде как можно теперь создать транзакцию для отмены сразу нескольких заявок... А вот реализации такой функции в PlazaTrader не нашел... Извиняюсь проглядел)

Alexander
Alexander Автор

frontman: Александр а что дает ваше "Plaza: возможность снимать заявку по ext_id (TransactionId)"? Можно разъяснить... Я там увидел что вроде как можно теперь создать транзакцию для отмены сразу нескольких заявок... А вот реализации такой функции в PlazaTrader не нашел... Можете как то объяснить? Спасибо.

Я добавил возможность снимать заявку для которой ещё неизвестен order_id. Делается это по внешнему id - по ext_id в понятиях шлюза или по TransactionId в наших понятиях. Попробуйте снять заявку которая в состоянии None до моих изменений и после них - поймёте.

Т.е. сейчас есть возможность снимать заявку в промежуток между отправкой заявки и ответом биржи.

frontman
frontman

Но все таки если нетрудно смысл изменений объясните) Спасибо)

frontman
frontman

Ок. Спасибо. У меня возможно по этой причине и не снимались заявки. Оч классно)

Alexander
Alexander Автор

frontman: Ок. Спасибо. У меня возможно по этой причине и не снимались заявки. Оч классно)

Как дела с 5-6 задачами?

frontman
frontman

Ну думаю 6е я добью. Щас уже делаю. А вот 5е точ не буду. Кстати вы не скажите почему SessionId = new PlazaColumn(TableId, "sess_id", typeof(int), false) Т.е. IsMandatory == false.? Это в классе PlazaDealDerivativeColumns...

Alexander
Alexander Автор

frontman: Ну думаю 6е я добью. Щас уже делаю. А вот 5е точ не буду. Кстати вы не скажите почему SessionId = new PlazaColumn(TableId, "sess_id", typeof(int), false) Т.е. IsMandatory == false.? Это в классе PlazaDealDerivativeColumns...

А зачем sess_id для сделок? Если надо - можно и true передавать.

5е не будете по причине что теперь всё летает и не надо сверять производительность "до" и "после"?

frontman
frontman

Alexander Mukhanchikov: А зачем sess_id для сделок? Так... Скорее всего я не понял знач задачи) Я думал что он качает сделки лишнии)) Хотя вот сам вижу что нет) Так что он тогда лишнего качает то?) Инструменты только?

Alexander
Alexander Автор

frontman:

Alexander Mukhanchikov: А зачем sess_id для сделок? Так... Скорее всего я не понял знач задачи) Я думал что он качает сделки лишнии)) Хотя вот сам вижу что нет) Так что он тогда лишнего качает то?) Инструменты только?

Это вообще не при чём. Сегодня одна сессия, завтра - другая. Надо иметь возможность заменять один инструмент на другой при смене сессии, т.к. для разных сессий инструменты разные.

Т.е. если приходят несколько сессий - надо брать инструмент по активной сессии, а не по закончившейся.

frontman
frontman

Просто я так понимаю из за этого я при получении сделок не могу sess_id посмотреть...

frontman
frontman

))) Нет Александр я уже говорил. У меня каждая транзакция на счету. Я не могу такую прогу тестить. Меня уволят)

Alexander
Alexander Автор

frontman: ))) Нет Александр я уже говорил. У меня каждая транзакция на счету. Я не могу такую прогу тестить. Меня уволят)

Тестовый сервер так и не подключили? :) Да и я вроде говорил - можно и по 100 транзакциям тестить. Нет, так нет. Вам надо, не нам 😎

frontman
frontman

ууу))) Хм... Тогда думать надо...

frontman
frontman

А у инструмента только sess_id меняется?

Alexander
Alexander Автор

frontman: А у инструмента только sess_id меняется?

Посмотрите всё сами раз взялись за задачу.

frontman
frontman

Я ее по другому понял. Ну ок)

Alexander
Alexander Автор

frontman: Я ее по другому понял. Ну ок)

просто порой проще самому посмотреть что конкретно меняется у инструмента или позвонить в службу поддержки ртс. я и сам не знаю.

насколько мне известно - у инструмента может измениться isin_id - в этом случае нам надо заменить старый isin_id на новый. далее - порой могут придти несколько инструментов с одинаковым isin_id но с разным sess_id - надо брать только тот isin_id, который торгуется.

как-то так.

взялись бы лучше за 1), 3) или 8) задачи. Данную я не представляю как вы будете делать без доступа к BaseTrader.

frontman
frontman

Насчет 1 пункта я вообще не понимаю что там можно сделать. Все равно что не делай все данные попасть должны попасть в основной поток, т.е. при условии что их много будут тормозить его...

Alexander
Alexander Автор

frontman: Насчет 1 пункта я вообще не понимаю что там можно сделать. Все равно что не делай все данные попасть должны попасть в основной поток, т.е. при условии что их много будут тормозить его...

Вы глубоко заблуждаетесь.

frontman
frontman

Ну. Только рад буду если это не так))

Alexander
Alexander Автор

frontman: Ну. Только рад буду если это не так))

Может возьмёте 3ий пункт? Он нужный всем и там как раз всё очевидно что и как делать.

frontman
frontman

Ну... Давайте я попробую. Если че нить получиться выложу. Ну т.е. если кто то захочет его сделать еще меня пусть не ждет))

Alexander
Alexander Автор

frontman: Ну... Давайте я попробую. Если че нить получиться выложу. Ну т.е. если кто то захочет его сделать еще меня пусть не ждет))

Посмотрите через Visual Studio в Shelve по моему нику, я там уже многое сделал для этой задачи. File -> Source Control -> Unshelve бла бла -> AMukhanchikov_cp Вам нужно Plaza2 _ part2

изменения старые, делал их в конце сентября ещё. Но хотя бы будет понятно в какую сторону идти.

frontman
frontman

Ок.

frontman
frontman

3й пункт готов. Вроде))

Alexander
Alexander
Alexander Автор

frontman: 3й пункт готов. Вроде))

Отлично. Тестировали?

Замечания по коду, которые стоит исправить:

  1. using StockSharp.Algo.Logging; не стоит переименовывать в using Logging; неслучайно у нас сделано так.
  2. private const string _futuresClass = "FUT"; не стоит переименовывать в private const string FuturesClass = "FUT"; private - оно всё равно private, пусть и const.
  3. #region Старый код Это далеко не старый код, его надо включить даже. Я доработаю и включить, такой коммент - лишний :)
  4. ext_id -> extId аналогично зря переименование
  5. зачем пустые строки вначале файлов? :)
  6. using StockSharp.Plaza.Wrappers; объявляйте после namespace

Это то, как завелось во всём проекте ещё издавна, давайте придерживаться одного стиля. :) Сделаете?

Mikhail Sukhov
Mikhail Sukhov

Еще одно замечание. Табы вместо пробелов.

frontman
frontman

Mikhail Sukhov: Еще одно замечание. Табы вместо пробелов. Хм... Да вроде не ставлю никогда... В настройках студии изменил тоже все... А где Михаил? Ну одну строчку хотя бы...

Mikhail Sukhov
Mikhail Sukhov

frontman:

Mikhail Sukhov: Еще одно замечание. Табы вместо пробелов. Хм... Да вроде не ставлю никогда... В настройках студии изменил тоже все... А где Михаил? Ну одну строчку хотя бы...

Весь IPlazaWrappers.cs оттабулирован пробелами. К тому же зачем то все сделали паблик.

frontman
frontman

Ок. Мне решарпер подсвечивал просто) Я решил изменить... Ну раз так "завелось во всём проекте ещё издавна" )) Сейчас...

frontman
frontman

Вот с тестированием проблема... Но под 32 работает. Тоже не плохо уже)

frontman
frontman

А вот по 6му пункту хотел спросить: а для чего это делается?
Ну просто для саморазвития так сказать)

Mikhail Sukhov
Mikhail Sukhov

frontman: А вот по 6му пункту хотел спросить: а для чего это делается? Ну просто для саморазвития так сказать)

Потому что Logging может быть у нескольких проектов. Чтобы четко понимать, какой логгинг. Плюс такие namespace можно группировать по имени. Если не писать полностью, то группировки не будет.

frontman
frontman

Ну насчет модификаторов доступа я тоже думал... Публичными можно только интерфейсы оставить... Ну вот как то решил так оставить))

Mikhail Sukhov
Mikhail Sukhov

frontman: Ну насчет модификаторов доступа я тоже думал... Публичными можно только интерфейсы оставить... Ну вот как то решил так оставить))

От этого стало более 2 сотен варнингов. Лучше так не оставлять. Лучше делать на совесть. Для себя же пишите. Потом сами будете удивляться, что что-то не работает или работает не так, как ожидалось. Хороший и чистый код залог уменьшения числа ошибок.

frontman
frontman

Доделаю не проблема. А вот с пробелами не знаю что делать... Каждую строчку руками проверять?

Mikhail Sukhov
Mikhail Sukhov

frontman: Доделаю не проблема. А вот с пробелами не знаю что делать... Каждую строчку руками проверять?

Поменяйте в студию табуляцию на табы. А затем сделайте реформат всего файла. Удаляете последнюю } и заново вставляете.

esper
esper

Mikhail Sukhov: А затем сделайте реформат всего файла. Удаляете последнюю } и заново вставляете. Ctrl-K,F

frontman
frontman

Так... Я старался) Давайте если неправильно, то сами поправите. Я не знаю как)

Mikhail Sukhov
Mikhail Sukhov

frontman: Так... Я старался) Давайте если неправильно, то сами поправите. Я не знаю как)

Вы не знаете как убрать public?

Alexander
Alexander Автор

frontman: Так... Я старался) Давайте если неправильно, то сами поправите. Я не знаю как)

namespace не везде вернули в то что было. сделайте последние шаги и доведите до ума что положили :)

frontman
frontman

АААА!!!)) Public убрал же... С namespace вернул ...

Mikhail Sukhov
Mikhail Sukhov

frontman: АААА!!!)) Public убрал же... С namespace вернул ...

Смотрите TFS.

Alexander
Alexander Автор

frontman: АААА!!!)) Public убрал же... С namespace вернул ...

В первый и последний раз делаю исправления за вас. Доисправлял namespace.

frontman
frontman

А кстати можно как нибудь подправить уже выложенное? Или обязательно новую версию кидать?

frontman
frontman

Вот честн слово все исправил же... Я больше прост трогать не буду ни че. Раз уж ту сток традиций...

Alexander
Alexander Автор

frontman: Вот честн слово все исправил же... Я больше прост трогать не буду ни че. Раз уж ту сток традиций...

Да ладно, не бросайтесь из крайностей в крайности :) Пару раз привыкнуть - и всё в порядке.

Мне тоже было многое непривычно и я тоже старался поправить все ворнинги R# когда вошёл в команду и открыл репозиторий S# в первый раз. Что-то я в итоге поправил (юзинги this и base в ядре), что-то - согласился, что так удобнее (как в случае с юзингами).

За фикс с 64х - респект и уважуха. 👍

Кстати, ворнинг о localized string - его действительно нужно править? Чем плохо то как было, почему нужна @ перед строкой? Я уже думал чтоб поправить все эти места в ядре.

Mikhail Sukhov
Mikhail Sukhov

Alexander Mukhanchikov: Чем плохо то как было, почему нужна @ перед строкой? Я уже думал чтоб поправить все эти места в ядре.

Плохо, это когда будем коннектор делать для буржуев и нас. А сейчас ничего плохого.

Mikhail Sukhov
Mikhail Sukhov

frontman: Вот честн слово все исправил же... Я больше прост трогать не буду ни че. Раз уж ту сток традиций...

Какие еще традиции? Делаю ребилд - получаю 268 варнингов. Где это так код позволяют писать?😒

frontman
frontman

А... Понял...

Alexander
Alexander Автор

Теперь и я посмотрел и понял о чём вёл речь Миша. Давайте такой код больше класть не будем, количество ворнингов бьёт все разумные пределы.

Задача №1 - убрать все ворнинги.

frontman
frontman

А у меня их ток 111)) Все я буду хорошим) Согласен надо править....

frontman
frontman

Так. Вроде все предупреждения убрал... Остались только пару. Исправленный вариант не заливаю пока что. Предлагаю сначала посмотреть его. Он сохранен в отложенных изменениях под моим ником frontman_cp Plaza_x64. Если все устраивает залью его.

Mikhail Sukhov
Mikhail Sukhov

frontman: Так. Вроде все предупреждения убрал... Остались только пару. Исправленный вариант не заливаю пока что. Предлагаю сначала посмотреть его. Он сохранен в отложенных изменениях под моим ником frontman_cp Plaza_x64. Если все устраивает залью его.

Глянул. Пошли самым сложным путем - написать комментарии. Зачем, если нужно было то всего удалить public модификатор?

frontman
frontman

Александр? Хотя бы как нибудь отреагировали) Ну там ага или неа...

Alexander
Alexander Автор

frontman: Александр? Хотя бы как нибудь отреагировали) Ну там ага или неа...

Ага, будет время - посмотрю. :) Вечером скорее всего.

Там только минимум 2 файла из 4 без изменений :)

frontman
frontman

Нет изменения в Wrappers... Ну а они немного повлияли на другие классы где используются классы и методы из Wrappers. Там основные проблемы были с отсутствием коментов и не CLR несовместимыми типами, причем те же несовместимые типы исп P2ClientGateMTA32 и P2ClientGateMTA64. У меня больше не на что не ругается...

Alexander
Alexander Автор

frontman: Нет изменения в Wrappers... Ну а они немного повлияли на другие классы где используются классы и методы из Wrappers. Там основные проблемы были с отсутствием коментов и не CLR несовместимыми типами, причем те же несовместимые типы исп P2ClientGateMTA32 и P2ClientGateMTA64. У меня больше не на что не ругается...

Я о другом. 2 файла из 4х которые вы положили в shelve вообще не имеют изменений.

frontman
frontman

Ам... А он автоматом вроде бы кидает только измененные файлы... Странно...

Mikhail Sukhov
Mikhail Sukhov

frontman: Ам... А он автоматом вроде бы кидает только измененные файлы... Странно...

Все рекомендую перед коммитом проверять все изменения во всех файлах. Иногда всплывают такие изменения, которые попали по ошибке.

frontman
frontman

Спасибо за совет. Я еще раз перепроверю... Но я обязательно тестирую все перед тем как залить. Ошибок не было...

Mikhail Sukhov
Mikhail Sukhov

frontman: Спасибо за совет. Я еще раз перепроверю... Но я обязательно тестирую все перед тем как залить. Ошибок не было...

Проверка относиться к чистоте кода, а не рабоспособности написанного.

frontman
frontman

Ок) Подчистим))

frontman
frontman

Хм)) Ну то ли я что то туплю... Я все что можно сделал internal. Интерфейсы в данном случае могут быть только public. Или я что то не так понимаю и мне пора на курсы C#?))

Mikhail Sukhov
Mikhail Sukhov

frontman: Хм)) Я все что можно сделал internal.

Заливайте что сделали.

frontman
frontman

Сделаю. Но все таки Михаил если несложно объясните как можно было проще сделать. Интересно ж)

Mikhail Sukhov
Mikhail Sukhov

frontman: Сделаю. Но все таки Михаил если несложно объясните как можно было проще сделать. Интересно ж)

Залейте, и я свой код залью. Посмотрите.

Mikhail Sukhov
Mikhail Sukhov

Закончил рефакторинг рефакторинга.

frontman
frontman

Я бы назвал это косметическим ремонтом)))

Alexander
Alexander Автор

frontman: Я бы назвал это косметическим ремонтом)))

ни фига себе косметические ремонты, по 10 файлов изменения... это скорее евро ремонт тогда уж :)

frontman
frontman

Ну если вы обратите внимание содержимое классов не изменилось совершенно. Их раскидали по разным файликам. Но должен признаться для меня это образец хорошего кода...

Mikhail Sukhov
Mikhail Sukhov

Что-то перестала Плаза работать. Не могу понять из-за чего.

upd. Пофиксил. SampleGUI теперь работает с роутерам под x64 и x86 без перекомпиляции.👍 Странно то, что сам роутер в процессах показывается по старому, в 32-разрядном режиме. Видимо под x64 сделана только прокси.👎

Alexander
Alexander Автор
frontman
frontman

Ну это я понимаю... Ток не понимаю в чем проблема обновления значения инструмента. НУ обновлять все поля да и все)) INotifyPropertyChanged - у вас реализован...

frontman
frontman

Александр PlazaTrader(EndPoint address) в последней версии явно не правильный. Порядок создания объектов в конструкторе нарушен. Вы знаете об этом?

frontman
frontman

Я переделал еще круче стало: Методу "StockSharp.Plaza.Wrappers.ConnectionWrapper32..ctor()", прозрачному для безопасности, не удалось вызвать машинный код с использованием метода "P2ClientGateMTA32.CP2ConnectionClass.add_ConnectionStatusChanged(P2ClientGateMTA32.IP2ConnectionEvent_ConnectionStatusChangedEventHandler)". Для вызова машинного кода требуются критические для безопасности или безопасные методы. ))

frontman
frontman

Ок.

Alexander
Alexander Автор

Я это всё исправил сегодня с утра. Первое - следствие чьего-то фикса, лень смотреть чьего. Кто-то местами поменял инициализацию.

Второе - следствие перехода на .Net 4.0. Я поставил Security.Level1 для Plaza.

Alexander
Alexander Автор

Пообщался с поддержкой - говорят StreamDataDeleted теоретически может придти для любой таблицы -

  1. если на сервере удаляется какая-то строка
  2. если на сервере что-то замещается - в этом случае для базового приходит Updated, для безбазового - Inserted + Deleted.

Сейчас мы это никак не обрабатываем. Есть идеи как данное событие обрабатывать?

Mikhail Sukhov
Mikhail Sukhov

Alexander Mukhanchikov: Есть идеи как данное событие обрабатывать?

РТС придумала событие, но не знает для чего оно нужно😂

frontman
frontman

Александр я не очень хорошо знаю код еще... А вот это разве не исп этого события?

private void OnStreamDataDeleted(IStreamWrapper stream, string tableName, long id, IRecordWrapper record)
		{
			var evt = Deleted;

			if (evt != null)
				evt(id, _record.Fill(record));
		}
Alexander
Alexander Автор

frontman: Александр я не очень хорошо знаю код еще... А вот это разве не исп этого события?

private void OnStreamDataDeleted(IStreamWrapper stream, string tableName, long id, IRecordWrapper record) { var evt = Deleted;

		if (evt != null)
			evt(id, _record.Fill(record));
	}

Это поднятие событие Deleted. Его (Deleted) должны потоки обрабатывать - сами PlazaStream.
По аналогии с Inserted \ End (см. PlazaTrader.cs)
frontman
frontman

)) Мне вот то же показалось что оно как то не очень то и нужно)))

frontman
frontman

Тяжело мне что то разбираться в логике плазы... Если не трудно можете объяснить для чего нужен PlazaOrderBuilder. Вот не пойму..

Alexander
Alexander Автор

frontman: Тяжело мне что то разбираться в логике плазы... Если не трудно можете объяснить для чего нужен PlazaOrderBuilder. Вот не пойму..

Для построения ордеров по ордер_логу Комментов вроде хватает, непонятные и неоднозначные моменты все с комментариями

frontman
frontman

Большой минус в том что очень мало комментов в коде(

frontman
frontman

Александр по пункту 8 я так понял если, например заявка была выставлена до вечернего клиринга, то после него у данной заявки, если она активна остается, биржа меняет id? Т.е. таким образом если заявки были выставлены до клиринга мы не можем ее отменить например(это сейчас так). Я правильно понял?

Alexander
Alexander Автор

frontman: Александр по пункту 8 я так понял если, например заявка была выставлена до вечернего клиринга, то после него у данной заявки, если она активна остается, биржа меняет id? Т.е. таким образом если заявки были выставлены до клиринга мы не можем ее отменить например(это сейчас так). Я правильно понял?

Если робот работает 24 часа в сутки - то как я понимаю, в вечерний клиринг у данной заявки (не today) сменится id. И да, мы не сможем её отменить в этом случае.

frontman
frontman

А на дневной клиринг это правило не распространяется?

Alexander
Alexander Автор

frontman: А на дневной клиринг это правило не распространяется?

Да вроде нет. Лучше протестить. Ну на фикс это точто не должно влиять.

frontman
frontman

Ну это понятно...

frontman
frontman

Хотел бы поднять следующий вопрос связанный со стилем написания кода. <mark>Используйте анонимные методы с умом Большинство опытных разработчиков знает, что не нужно бросаться с руками и ногами на каждую новомодную фишку языка программирования и использовать ее где попало. То же самое относится и к анонимным методам. Анонимные методы – это очень полезная возможность, которая может как существенно упростить понимание кода, так и усложнить его. Не существует формальных правил, которые бы определяли, когда следует применять анонимные методы, а когда лучше создать обыкновенный именованный метод (хотя Джеффри Рихтер придерживается правила, что любой анонимный метод длиннее 3-х строк должен быть преобразован в именованный). Анонимный метод есть смысл использовать в том случае, когда он является логической частью какого-то другого метода и не имеет особого смысла без этого контекста. Если же метод является самостоятельным, полностью выполняет некоторую задачу и может вызываться в различных условиях, то стоит подумать о создании именованного метода.</mark>

Это замечание я вычитал вот тут http://rsdn.ru/article/csharp/Closure_in_Csharp.xml и по моему оно очень справедливо... Из за на мой взгляд не совсем корректного использования анонимных методов понимание кода ОЧЕНЬ усложнено...

Alexander
Alexander Автор

метод является самостоятельным, полностью выполняет некоторую задачу <mark>и может вызываться в различных условиях</mark>, то стоит подумать о создании именованного метода.

можно пример где у нас есть такое и не выделено в полноценный метод?

frontman
frontman

В PazaTrader много такого...

private void OnSessionContentsDerivativeStreamInserted(PlazaRecord record, PlazaSessionContentsDerivativeColumns metadata, Action<Security> handler)
		{
			ProcessEvents(() =>
			{
				var secCode = record.Get<string>(metadata.ShortIsin);

				var isinId = record.Get<int>(metadata.IsinId);

				if (_isinIds.Add(isinId))
				{
					GetSecurity(CreateSecurityId(secCode, "RTS"), security =>
					{
						InitSecurityInfo(security, record, metadata);

						security.Code = secCode;
						handler(security);
					}, isinId.ToString());
				}
			});
		}
Alexander
Alexander Автор

frontman: В PazaTrader много такого...

		var secCode = record.Get<string>(metadata.ShortIsin);

			var isinId = record.Get<int>(metadata.IsinId);

			if (_isinIds.Add(isinId))
			{
				GetSecurity(CreateSecurityId(secCode, "RTS"), security =>
				{
					InitSecurityInfo(security, record, metadata);

					security.Code = secCode;
					handler(security);
				}, isinId.ToString());
			}

<mark> и может вызываться в различных условиях</mark>

Где это ещё используется? Кроме данного места?
frontman
frontman

А вот мое любимое место:))

private void OnOrdersLogStreamEnd(PlazaStream stream)
		{
			ProcessEvents(() => _orderBuilder.FlushChanges(stream, (security, metadata, firstRecord, lastRecord) => GetOrder(security, firstRecord.Get<long>(metadata.OrderId), orderId =>
			{
				var transactionId = firstRecord.Get<int>(metadata.ExtId);

				//http://forum.rts.ru/viewtopic.asp?p=115933
				//10. Изменен порядок прихода записей по итогам торговой транзакции в логе заявок.
				//Ранее при постановке заявки первой шла запись о постановке заявки инициатора транзакции, 
				//вслед за которой шли записи о сделках.
				//В версии 3.8 запись о постановке заявки добавляется последней, после записей о сделках.

				var order = GetOrderByTransactionId(transactionId);

				if (order != null)
					order.Id = orderId;
				else
					order = EntityFactory.CreateOrder(orderId);

				order.Security = security;

				var restVolume = firstRecord.Get<decimal>(metadata.AmountRest);
				var initVolume = firstRecord.Get<decimal>(metadata.AmountOperation);

				order.Price = firstRecord.Get<decimal>(metadata.Price);
				order.Volume = initVolume;
				order.Balance = restVolume;
				order.Direction = firstRecord.Get<int>(metadata.Direction) == 1 ? OrderDirections.Buy : OrderDirections.Sell;
				order.Portfolio = GetPortfolio(firstRecord.Get<string>(metadata.ClientCode));
				order.Comment = firstRecord.Get<string>(metadata.Comment);
				order.TransactionId = transactionId;
				order.Time = firstRecord.Get<DateTime>(metadata.Moment);
				order.State = restVolume == 0 ? OrderStates.Done : OrderStates.Active;

				var status = firstRecord.Get<int>(metadata.Status);

				if ((status & 0x01) == 0x01)
					order.ExecutionCondition = OrderExecutionConditions.PutInQueue;
				else if ((status & 0x02) == 0x02)
					order.ExecutionCondition = OrderExecutionConditions.CancelBalance;

				return order;
			},
			order =>
			{
				var action = lastRecord.Get<int>(metadata.Action);
				switch (action)
				{
					case 0: // удалена
						order.CancelTime = lastRecord.Get<DateTime>(metadata.Moment);
						order.Balance = lastRecord.Get<int>(metadata.AmountOperation);
						order.State = OrderStates.Done;
						break;
					case 1: // добавлена
						break;
					case 2: // исполнена
						order.Balance = lastRecord.Get<decimal>(metadata.AmountRest);
						if (order.Balance == 0)
							order.State = OrderStates.Done;
						break;
					default:
						throw new InvalidOperationException("Неизвестное действие заявки {0}.".Put(action));
				}

				FillExtensionInfo(order, lastRecord);
			})));
		}
frontman
frontman

Тут 4 анонимных метода... причем некоторые вложены друг в друга... Оч сложно для понимания...

frontman
frontman

Александр смысл этой фразы в том что в общем не стоит злоупотреблять анонимными методами)) Мне кажется их слишком много...

Alexander
Alexander Автор

frontman: Александр смысл этой фразы в том что в общем не стоит употреблять анонимными методами)) Мне кажется их слишком много...

Смысл этой фразы ровно как и написано - в том, что в методы стоит выделять то, что может быть использовано где-то ещё. Додумывать не стоит. Данное место и с ордерами - единственное где используется.

Если используется в нескольких местах - выделяется в отдельные методы, ровно как и должно быть.

Собственно поработайте поплотнее с кодом, сложного и непонятного там ничего нет. С ордером - второй => - создание ордера, третий - обновление. Ну первый и так понятно.

Смысл плодить методы, которые никто никогда не будет использовать кроме одного единственного места?

frontman
frontman

Ну. Александр я просто попытался поднять вопрос который лично мне мешает при понимании кода... Если ни кто больше не считает что в этом ест проблема то ладно. Я правда думаю что на текущий момент кроме меня, вас и Михаила туда ни кто и не заглядывает(Я о плазе)...

Alexander
Alexander Автор

frontman: Ну. Александр я просто попытался поднять вопрос который лично мне мешает при понимании кода... Если ни кто больше не считает что в этом ест проблема то ладно. Я правда думаю что на текущий момент кроме меня, вас и Михаила туда ни кто и не заглядывает(Я о плазе)...

Ну. А я просто попытался объяснить почему не стоит плодить методы которые никто не будет использовать :)

frontman
frontman

Ну хотя бы для того что бы не загромождать вызов функций передачей анонимных методов... Очень сложно уследить где один метод заканчивается а где начинается другой, а где передается параметр...

Mikhail Sukhov
Mikhail Sukhov

frontman: Ну хотя бы для того что бы не загромождать вызов функций передачей анонимных методов... Очень сложно уследить где один метод заканчивается а где начинается другой, а где передается параметр...

Смысл анонимных методов как раз в том, чтобы такие вещи не отслеживать, как то, где он заканчивает, и что передается. Поэтому и придумали замыкания.

А вообще C# с каждой новой версией становиться функциональным языком. Лямбды и замыкания - это свойство функциональности. В 4-ой версии параллелинг стал частью языка. Поэтому лямбды будут все больше и больше использоваться. Статья годичной давности. Хотел бы я узнать, как у автора дела на текущий момент с await и async. И не напишет ли он новую статью, что лямбды рулят и только их и нужно использовать.

frontman
frontman

)) Ну.. await и async разве не в 4.5 появятся только?

Mikhail Sukhov
Mikhail Sukhov

frontman: )) Ну.. await и async разве не в 4.5 появятся только?

Аффтар MVP. Этот народ изучать начинает 4.5 когда еще 3.0 не вышла.😂

frontman
frontman

Ну понял. Вопрос значит закрыт... Но есть еще один) Теперь уже по логике работы плазы)) А разве при вызове метода Trader.Reconnect данные по инструментам не должны снова поступить?

Mikhail Sukhov
Mikhail Sukhov

frontman: Ну понял. Вопрос значит закрыт... Но есть еще один) Теперь уже по логике работы плазы)) А разве при вызове метода Trader.Reconnect данные по инструментам не должны снова поступить?

Не должны. У нас ссылочная целостность. Перезакачка данных - это от лукавого.