- Избавиться от накопления очереди сообщений в первые секунды работы (необходимо разбить получение реплики на несколько соединений, работающих в отдельных thread'ах, каждое со своим циклом выборки).
- Добавить профилировщик получения данных и отправки заявок - необходимо понять насколько быстрый PlazaTrader у нас (особенно в связи с грядущими изменениями в плазе после нового года).
- Отфильтровывать данные от уже прошедшей сессии (вечером приходят данные как от дневной, так и от вечерней сессии).
- Если заявка GTC, то в вечерний клиринг приходит сообщение Inserted, с id_ord = новому номеру заявки и с id_ord1 = старому номеру заявки. Необходимо заменить одно на другое.
Ничего не упустил?
3ий таск я уже начал делать в фоновом режиме. Кто готов взяться за другие задачи?
Сделано: 2) Обрабатывать снятие заявки в клиринг (сейчас заявка остаётся активной и снять её невозможно). (Alexander) 3) Поддержка Plaza 64x. (frontman) 4) Возможность задания даты истечения заявки (сейчас делается через PlazaStopCondition.ExpiryDate, что не прозрачно, т.к. на Plaza вообще нет стоп заявок). (Alexander) 7) Добавить поддержку FutMoveOrder - одновременное перемещение 2х заявок. (frontman)
Kommentare (192)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
По первому пункту хотел бы вопрос задать: я правильно понял что изменять надо вот эту часть:
Просто пытаюсь разобраться в механизмах стокшарпа. Вот на всякий случай переспрашиваю)
Скорее всего именно эту часть менять не придется. Надо завести пару PlazaStreamManager, в методе StartExport написать что-то вроде
Где 1 и 2 номер стрим менеджера, в который соответствующие потоки надо добавить. И так далее...
Я смогу заняться 1 пунктом в конце недели, как освобожусь...
Спасибо. Понял. Я просто думал чт для каждого потока надо создать отдельный thread, а тут как я понимаю разделение только фьючерсов и опционов идет...
Для каждого потока отдельный thread точно не нужен. Надо часть потоков - в один thread, часть - в другой.
Занялся пунктом 2), добавил пункт 6) - его тоже надо сделать, сейчас некорректно работает после клиринга из-за него.
Кто возьмётся?
Кстати сегодня разговаривал с одним из специалистов РТС. Он сказал что есть метод перерегистрации пары заявок. Что нибудь слышали об этом? По моему в плазе это не реализовано еще...
Что за "перерегистрация пары заявок"?
ReRegisterOrder(Order, Order) - Перерегистрировать заявку на бирже. Это прям из мануала строчка. Я в рамках терминологии этой написал... Так вот есть метод позволяющий передвигать пару заявок. Ну так меня заверил человек с РТС))
FutMoveOrder - это для передвижения одной заявки А есть что то такое же для двух... Я вот и спрашиваю знаете ли вы об этом что то?
Знаем. FutMoveOrder - для перемещения 2х заявок как раз, а не 1ой.
Т.е ReRegisterOrder(Order, Order) перемещает вот эти две заявки? А куда тогда? Если бы он выглядил вот так : ReRegisterOrder(Order, Order, Order, Order) я б еще понял ... А так что то не пойму(( Извините...
У вас исходный код есть - смотрите сами. Там всё очевидно, я только что по коду сам посмотрел. Почему другие могут пользоваться поиском, а вы не умеете? Надо учиться. И лучше поздно, чем никогда.
Этот метод для отмены одной заявки и регистрации другой в рамках одной транзакции. А я говорю о методе отменяющем 2 заявки и выставляющим 2 заявки в рамках одной транзакции. То что есть явно это не делает.
Я ведь говорю что по коду несложно понять. :) Добавил пункт 7. Опять никто не готов взяться, будем ждать пока у нас руки дойдут?
Не пойму, чем ReRegisterOrder(Order, Order, Order, Order) лучше двух последовательных ReRegisterOrder(Order, Order) в плане быстродействия или удобства?? Одной транзакцией это сделать нельзя вродебы.
Тоже не понимаю, зачем такой костыль. Для такого метода нужно и код написать в стратегии. Что мне кажется совсем уж не удобно. Подозреваю, что это сделано для атомарного изменения multi leg заявки. Но могу ошибаться.
Это вроде не костыль, FutMoveOrder (OptMoveOrder) позволяет переставить две заявки за одну транзакцию
Да если меня с работы раньше не выгонят то скоро займусь)
Для меня это экономия в деньгах прежде всего. http://www.rts.ru/s186#trans - денег неплохо так берут.
Я правильно понял, что вы взялись делать пункт с MoveOrder?
Ну... Да)) Как сделаю вам написать надо, что бы вы мне логин и пароль дали для?
Да. Или сюда к сообщению фикс приложите, мы сами закоммитим.
ок.
Добавил 8-9 пункты.
Сделал 2)
1 задача с очередями пока не получается, ошибки сыпятся
7 - сделал. Как залить то?)
Сюда, в зип архиве.
Вот. Там ток часть плазы
TransactionManager.cs битый в архиве. В нём изменения есть? Или у меня только проблемы - у кого-нибудь получилось полностью скачать?
Частично сделал задачу один. Разделил реплики на три потока, вроде как работает. Но работет как-то криво, даже медленнее данные стали подгружаться (раньше 10 секунд, теперь 25). При подключении большая очередь сохраняется (раньше до 40, теперь до 80-90), что оч странно. Также некоторые моменты не сделал, например:
Давайте лучше сразу на КодеПлекс. У Александра сейчас пока нет времени, так что коммитьте сразу в код. Можно через Shelves.
Залил на кодеплекс.
З.Ы. Забыл комент написать, блин) а можно как-нибудь комент потом вписывать в ченжсет?
Да, через Show History, changeset details и комментарий вписать.
/// <summary> /// Потоки, которые будут запущены при вызове метода <see cref="StartExport"/>. /// </summary> public PlazaStreamList Streams { get { return _streamManager1.Streams; } //??? Надо как-то обьеденить потоки от всех _streamManager }
Александр а что с 7м пунктом то? Вроде как все сделал я ... И давно... Или что то не так?
У вас работает? Если да - пользуйтесь, нас не ждите.
Я начал смотреть, мне там кое-что не понравилось. Я не забыл, помню. :) Как конференцию проведём - досмотрю, отпишусь.
Ок.
Приложи к сообщению, пожалуйста. Глюк какой-то видимо у меня. Из разных браузеров пробовал - одно и тоже.
сабж
7 пункт допилил и залил. Спасибо frontman
Отлично! Посмотри первый пункт, плиз=) давно уже с ним бьюсь, не получается, такое ощущение, что несколько потоков пытаются использовать какие-то общие ресурсы, мешают друг-другу и поэтому данные наоборот медленнее подгружаются
Сегодня смотрел. Там полный рефакторинг необходим работы с потоками репликации. В общем - в ближайших планах.
Можно пояснить что было сделано в "Change Set 11295. Plaza. Рефакторинг работы с подключениями."? У меня после него перестали заявки ставиться, пишет "Specified cast is not valid." at P2ClientGateMTA32.CP2BLMessageClass.SendAsync2(CP2Connection conn, UInt32 Timeout, Object event, Int64 eventParam)
Известно, решаем. Была сделана корректная работа с потоками и стримами.
Убрал атрибут public у TransactionManager. В итоге public потерял и MessageDispatcher, который быть не пабликом не может. Вот думаю, надо наверное не просто вернуть public у TransactionManager, а еще и дать доступ внешнему коду к этому объекту.
Я так понял теперь можно создавать несколько потоков отправки команд? Интересно, это дало что-нибудь в плане быстродействия?
Фронтмэн жмется с написанием тестера.😂 Без тестера только гадание на кофейной гуще.
Оооп) А может кто нить поделиться секретом это как?)
Plaza: возможность создавать несколько транзакционных потоков.
Михаил, помнится во времена, когда тестовый сервак плазы не работал, вы (или Александр) тестировали плазу на реальном боевом сервере плазы. Откройте секрет, как можно получить доступ к реальному серверу не проходя сертификацию робота? Дело в том, что с этими очередями сообщений сертификацию не пройти (первый таск собственно), а мне бы уже давно надо отрабатывать быстрые стратегии на реальном сервере...
Купить логин у брокера. Сертификацию кто-то из брокеров еще требует?
У нас тут деревня похоже=) БКС требует сертификацию, финам вообще не предоставляет прямой доступ на РТС со своей программкой. А разве можно подключиться на РТС в обход брокера? Не охота еще и брокеру комиссию отстегивать
А что с другими брокерами? БКС вообще попутал что-то, имхо. Забыл на какой стороне поля играет.
Нет, только через брокера.
Кроме БКС и Финама больше в Новосибирске никого нет.
Обложили.😂 А дистанционно разве нельзя открыться у другого брокера? Скан пасспорта по факсу и т.д.
Офигееееть) Тут все изменения можно смотреть)) Вот я быдляра) Спасибо.
Сделал существенное увеличение производительности и стабильности выставления заявок. Положил на codeplex. Тестируйте в своих тестерах, пока frontman пишет общий профилировщик. У меня по моим тестам на бою получилось ускорение в 3-5 раз. 😎
to frontman: договаривались уже, что BrokerCode в PlazaTrader ни к чему. Нужен вам локально - создавайте наследника PlazaTrader локально и используйте его там.
Александр не получиться. В наследники придется переопределить методы в которых используются закрытые поля класса PlazaTrader. Например _transactionManager в методе OnRegisterOrder. Мне придется весь PlazaTrader переписать...
Попробуйте так:
есть событие
Подписываетесь на него. Вам приходит Transaction. Делаете ему SetBrokerCode.
Подтверждаю, Latency заявок снизился очень значительно (у меня, в среднем, со 150 мс. до 50 мс.) и у заявок стали появляться статусы Failed (а раньше просто подвисали на None). Глянул изменения в коде коннектора, примерно понял.
Огромное спасибо, завтра еще буду тестировать :)
А что за брокерский код? Почему мне его не нужно вводить?
frontman делает какую-то хрень на стороне брокера. ему надо его вводить, физикам - нет. в PlazaTrader полю BrokerCode точно не место.
😂
Подтверждаю, ускорение есть, правда не в разы, как у Александра. У меня до москвы задержка 53мс в среднем, заявки ставятся в среднем за 100 мс, раньше было 120-140 вроде.
Александр благодарю. Вот ток мне кажется время выполнения транзакций из за этого может увеличиться... И попрошу без вот таких вот оценок. Тем более что вы не в курсе моей работы. И насчет брокерского кода: он есть во ВСЕХ транзакциях отправляемых РТС. Только вот лично вам он не нужен и поэтому вы считаете, что это лишне. Я не понимаю в чем проблема... Что он места много занимает? Или что? Принцип?
"Кажется"? А если потестировать, да посмотреть? Вот для этого и нужен профилировщик-тестировщик, о котором месяца 2 ведётся разговор. Уже вон отписались и подтвердили мои тесты - снизилось время в 3-4 раза.
Давайте конкретно, без кажется. Где у вас увеличилось время? На каких транзакциях? На каком сервере? Насколько? И у меня и у aleksej средний Latency снизился со 150мс до 50мс. С каких до каких он вырос у вас?
Пока лишь всё что я вижу - это кажется, наверное, думается. Нужны конкретно цифры. На кажется уже отвечать надоело.
Ну я образно говорю. Я делаю хрень на стороне физика, вы - на стороне брокера :)
Я уже много раз спрашивал - зачем брокерский код простому смертному? Для чего его вписывать в каждую транзакцию? Брокерский код добавляется в транзакцию уже на стороне биржи. И чем вас не устраивает тот метод изменения транзакции, который я описал выше?
Зачем он в PlazaTrader? Это не то поле, которое нужно знать шлюзу. Оно там явно лишнее. Далее - в Transaction не будут добавляться новые поля. Нужно что-то установить - пользуйтесь GetField \ SetField. Те немногие поля, которые там есть - я почищу. Постоянно таблицы модифицируется, что-то добавляется, что-то удаляется. Transaction не будет содержать сотни полей, не будет завязан на конкретную версию шлюза.
И да, доступ давался несколько для иных задач чем добавление BrokerCode :)
это
Готов сделать. Все таки давайте решим делаем это через
Через SecurityType, которое может быть: Future (фьючерсы), Option (только опционы), Common (общее)
Да нет Александр) Я не про то что вы пофиксили... Я про событие ProcessRequest)) Ну что вы так сразу близко к сердцу то) Все я понял. Так бы сразу и написали...😭
На сколько оно у вас увеличилось по ProcessRequest? На пару микросекунд? :) Сделайте тест, там увеличение если и будет, то << 1 мс.
Я вроде так сразу и писал - спрашивал нафига оно рядовому пользователю. :)
Сделал...
Отлично. Только поставьте у себя в настройках Visual Studio для табов - сохранение табов (а не пробелы), tab size 4, ident size 4
Ок. Щас полазаю))
У меня такой вопрос: А почему для StockSharpa используется .NET Framework 3.5? В нем нет например Parallel LINQ, а так было бы приятно)))
Из-за SmartCom
По шестой задачи хотел спросить. Может укажите так сказать направление)) Александр вы можете я знаю)
Если запускать в вечернюю сессию робота, то данные придут и по дневной сессии - т.е. будут одни и теже isin_id инструментов, с разными номерами сессий. Надо брать ту, которая идёт. Также надо понять как заменять текущие инструменты на новые при смене сессии.
Хм... Все спасиб)
Александр а что дает ваше "Plaza: возможность снимать заявку по ext_id (TransactionId)"? Можно разъяснить... Я там увидел что вроде как можно теперь создать транзакцию для отмены сразу нескольких заявок... А вот реализации такой функции в PlazaTrader не нашел... Можете как то объяснить? Спасибо.
Я добавил возможность снимать заявку для которой ещё неизвестен order_id. Делается это по внешнему id - по ext_id в понятиях шлюза или по TransactionId в наших понятиях. Попробуйте снять заявку которая в состоянии None до моих изменений и после них - поймёте.
Т.е. сейчас есть возможность снимать заявку в промежуток между отправкой заявки и ответом биржи.
Но все таки если нетрудно смысл изменений объясните) Спасибо)
Ок. Спасибо. У меня возможно по этой причине и не снимались заявки. Оч классно)
Как дела с 5-6 задачами?
Ну думаю 6е я добью. Щас уже делаю. А вот 5е точ не буду. Кстати вы не скажите почему SessionId = new PlazaColumn(TableId, "sess_id", typeof(int), false) Т.е. IsMandatory == false.? Это в классе PlazaDealDerivativeColumns...
А зачем sess_id для сделок? Если надо - можно и true передавать.
5е не будете по причине что теперь всё летает и не надо сверять производительность "до" и "после"?
Это вообще не при чём. Сегодня одна сессия, завтра - другая. Надо иметь возможность заменять один инструмент на другой при смене сессии, т.к. для разных сессий инструменты разные.
Т.е. если приходят несколько сессий - надо брать инструмент по активной сессии, а не по закончившейся.
Просто я так понимаю из за этого я при получении сделок не могу sess_id посмотреть...
))) Нет Александр я уже говорил. У меня каждая транзакция на счету. Я не могу такую прогу тестить. Меня уволят)
Тестовый сервер так и не подключили? :) Да и я вроде говорил - можно и по 100 транзакциям тестить. Нет, так нет. Вам надо, не нам 😎
ууу))) Хм... Тогда думать надо...
А у инструмента только sess_id меняется?
Посмотрите всё сами раз взялись за задачу.
Я ее по другому понял. Ну ок)
просто порой проще самому посмотреть что конкретно меняется у инструмента или позвонить в службу поддержки ртс. я и сам не знаю.
насколько мне известно - у инструмента может измениться isin_id - в этом случае нам надо заменить старый isin_id на новый. далее - порой могут придти несколько инструментов с одинаковым isin_id но с разным sess_id - надо брать только тот isin_id, который торгуется.
как-то так.
взялись бы лучше за 1), 3) или 8) задачи. Данную я не представляю как вы будете делать без доступа к BaseTrader.
Насчет 1 пункта я вообще не понимаю что там можно сделать. Все равно что не делай все данные попасть должны попасть в основной поток, т.е. при условии что их много будут тормозить его...
Вы глубоко заблуждаетесь.
Ну. Только рад буду если это не так))
Может возьмёте 3ий пункт? Он нужный всем и там как раз всё очевидно что и как делать.
Ну... Давайте я попробую. Если че нить получиться выложу. Ну т.е. если кто то захочет его сделать еще меня пусть не ждет))
Посмотрите через Visual Studio в Shelve по моему нику, я там уже многое сделал для этой задачи. File -> Source Control -> Unshelve бла бла -> AMukhanchikov_cp Вам нужно Plaza2 _ part2
изменения старые, делал их в конце сентября ещё. Но хотя бы будет понятно в какую сторону идти.
Ок.
3й пункт готов. Вроде))
Отлично. Тестировали?
Замечания по коду, которые стоит исправить:
Это то, как завелось во всём проекте ещё издавна, давайте придерживаться одного стиля. :) Сделаете?
Еще одно замечание. Табы вместо пробелов.
Весь IPlazaWrappers.cs оттабулирован пробелами. К тому же зачем то все сделали паблик.
Ок. Мне решарпер подсвечивал просто) Я решил изменить... Ну раз так "завелось во всём проекте ещё издавна" )) Сейчас...
Вот с тестированием проблема... Но под 32 работает. Тоже не плохо уже)
А вот по 6му пункту хотел спросить: а для чего это делается?
Ну просто для саморазвития так сказать)
Потому что Logging может быть у нескольких проектов. Чтобы четко понимать, какой логгинг. Плюс такие namespace можно группировать по имени. Если не писать полностью, то группировки не будет.
Ну насчет модификаторов доступа я тоже думал... Публичными можно только интерфейсы оставить... Ну вот как то решил так оставить))
От этого стало более 2 сотен варнингов. Лучше так не оставлять. Лучше делать на совесть. Для себя же пишите. Потом сами будете удивляться, что что-то не работает или работает не так, как ожидалось. Хороший и чистый код залог уменьшения числа ошибок.
Доделаю не проблема. А вот с пробелами не знаю что делать... Каждую строчку руками проверять?
Поменяйте в студию табуляцию на табы. А затем сделайте реформат всего файла. Удаляете последнюю } и заново вставляете.
Так... Я старался) Давайте если неправильно, то сами поправите. Я не знаю как)
Вы не знаете как убрать public?
namespace не везде вернули в то что было. сделайте последние шаги и доведите до ума что положили :)
АААА!!!)) Public убрал же... С namespace вернул ...
Смотрите TFS.
В первый и последний раз делаю исправления за вас. Доисправлял namespace.
А кстати можно как нибудь подправить уже выложенное? Или обязательно новую версию кидать?
Вот честн слово все исправил же... Я больше прост трогать не буду ни че. Раз уж ту сток традиций...
Да ладно, не бросайтесь из крайностей в крайности :) Пару раз привыкнуть - и всё в порядке.
Мне тоже было многое непривычно и я тоже старался поправить все ворнинги R# когда вошёл в команду и открыл репозиторий S# в первый раз. Что-то я в итоге поправил (юзинги this и base в ядре), что-то - согласился, что так удобнее (как в случае с юзингами).
За фикс с 64х - респект и уважуха. 👍
Кстати, ворнинг о localized string - его действительно нужно править? Чем плохо то как было, почему нужна @ перед строкой? Я уже думал чтоб поправить все эти места в ядре.
Плохо, это когда будем коннектор делать для буржуев и нас. А сейчас ничего плохого.
Какие еще традиции? Делаю ребилд - получаю 268 варнингов. Где это так код позволяют писать?😒
А... Понял...
Теперь и я посмотрел и понял о чём вёл речь Миша. Давайте такой код больше класть не будем, количество ворнингов бьёт все разумные пределы.
Задача №1 - убрать все ворнинги.
А у меня их ток 111)) Все я буду хорошим) Согласен надо править....
Так. Вроде все предупреждения убрал... Остались только пару. Исправленный вариант не заливаю пока что. Предлагаю сначала посмотреть его. Он сохранен в отложенных изменениях под моим ником frontman_cp Plaza_x64. Если все устраивает залью его.
Глянул. Пошли самым сложным путем - написать комментарии. Зачем, если нужно было то всего удалить public модификатор?
Александр? Хотя бы как нибудь отреагировали) Ну там ага или неа...
Ага, будет время - посмотрю. :) Вечером скорее всего.
Там только минимум 2 файла из 4 без изменений :)
Нет изменения в Wrappers... Ну а они немного повлияли на другие классы где используются классы и методы из Wrappers. Там основные проблемы были с отсутствием коментов и не CLR несовместимыми типами, причем те же несовместимые типы исп P2ClientGateMTA32 и P2ClientGateMTA64. У меня больше не на что не ругается...
Я о другом. 2 файла из 4х которые вы положили в shelve вообще не имеют изменений.
Ам... А он автоматом вроде бы кидает только измененные файлы... Странно...
Все рекомендую перед коммитом проверять все изменения во всех файлах. Иногда всплывают такие изменения, которые попали по ошибке.
Спасибо за совет. Я еще раз перепроверю... Но я обязательно тестирую все перед тем как залить. Ошибок не было...
Проверка относиться к чистоте кода, а не рабоспособности написанного.
Ок) Подчистим))
Хм)) Ну то ли я что то туплю... Я все что можно сделал internal. Интерфейсы в данном случае могут быть только public. Или я что то не так понимаю и мне пора на курсы C#?))
Заливайте что сделали.
Сделаю. Но все таки Михаил если несложно объясните как можно было проще сделать. Интересно ж)
Залейте, и я свой код залью. Посмотрите.
Закончил рефакторинг рефакторинга.
Я бы назвал это косметическим ремонтом)))
ни фига себе косметические ремонты, по 10 файлов изменения... это скорее евро ремонт тогда уж :)
Ну если вы обратите внимание содержимое классов не изменилось совершенно. Их раскидали по разным файликам. Но должен признаться для меня это образец хорошего кода...
Что-то перестала Плаза работать. Не могу понять из-за чего.
upd. Пофиксил. SampleGUI теперь работает с роутерам под x64 и x86 без перекомпиляции.👍 Странно то, что сам роутер в процессах показывается по старому, в 32-разрядном режиме. Видимо под x64 сделана только прокси.👎
По поводу isin_id
Ну это я понимаю... Ток не понимаю в чем проблема обновления значения инструмента. НУ обновлять все поля да и все)) INotifyPropertyChanged - у вас реализован...
Александр PlazaTrader(EndPoint address) в последней версии явно не правильный. Порядок создания объектов в конструкторе нарушен. Вы знаете об этом?
Я переделал еще круче стало: Методу "StockSharp.Plaza.Wrappers.ConnectionWrapper32..ctor()", прозрачному для безопасности, не удалось вызвать машинный код с использованием метода "P2ClientGateMTA32.CP2ConnectionClass.add_ConnectionStatusChanged(P2ClientGateMTA32.IP2ConnectionEvent_ConnectionStatusChangedEventHandler)". Для вызова машинного кода требуются критические для безопасности или безопасные методы. ))
Ок.
Я это всё исправил сегодня с утра. Первое - следствие чьего-то фикса, лень смотреть чьего. Кто-то местами поменял инициализацию.
Второе - следствие перехода на .Net 4.0. Я поставил Security.Level1 для Plaza.
Пообщался с поддержкой - говорят StreamDataDeleted теоретически может придти для любой таблицы -
Сейчас мы это никак не обрабатываем. Есть идеи как данное событие обрабатывать?
РТС придумала событие, но не знает для чего оно нужно😂
Александр я не очень хорошо знаю код еще... А вот это разве не исп этого события?
private void OnStreamDataDeleted(IStreamWrapper stream, string tableName, long id, IRecordWrapper record) { var evt = Deleted;
)) Мне вот то же показалось что оно как то не очень то и нужно)))
Тяжело мне что то разбираться в логике плазы... Если не трудно можете объяснить для чего нужен PlazaOrderBuilder. Вот не пойму..
Для построения ордеров по ордер_логу Комментов вроде хватает, непонятные и неоднозначные моменты все с комментариями
Большой минус в том что очень мало комментов в коде(
Александр по пункту 8 я так понял если, например заявка была выставлена до вечернего клиринга, то после него у данной заявки, если она активна остается, биржа меняет id? Т.е. таким образом если заявки были выставлены до клиринга мы не можем ее отменить например(это сейчас так). Я правильно понял?
Если робот работает 24 часа в сутки - то как я понимаю, в вечерний клиринг у данной заявки (не today) сменится id. И да, мы не сможем её отменить в этом случае.
А на дневной клиринг это правило не распространяется?
Да вроде нет. Лучше протестить. Ну на фикс это точто не должно влиять.
Ну это понятно...
Хотел бы поднять следующий вопрос связанный со стилем написания кода. <mark>Используйте анонимные методы с умом Большинство опытных разработчиков знает, что не нужно бросаться с руками и ногами на каждую новомодную фишку языка программирования и использовать ее где попало. То же самое относится и к анонимным методам. Анонимные методы – это очень полезная возможность, которая может как существенно упростить понимание кода, так и усложнить его. Не существует формальных правил, которые бы определяли, когда следует применять анонимные методы, а когда лучше создать обыкновенный именованный метод (хотя Джеффри Рихтер придерживается правила, что любой анонимный метод длиннее 3-х строк должен быть преобразован в именованный). Анонимный метод есть смысл использовать в том случае, когда он является логической частью какого-то другого метода и не имеет особого смысла без этого контекста. Если же метод является самостоятельным, полностью выполняет некоторую задачу и может вызываться в различных условиях, то стоит подумать о создании именованного метода.</mark>
Это замечание я вычитал вот тут http://rsdn.ru/article/csharp/Closure_in_Csharp.xml и по моему оно очень справедливо... Из за на мой взгляд не совсем корректного использования анонимных методов понимание кода ОЧЕНЬ усложнено...
можно пример где у нас есть такое и не выделено в полноценный метод?
В PazaTrader много такого...
А вот мое любимое место:))
Тут 4 анонимных метода... причем некоторые вложены друг в друга... Оч сложно для понимания...
Александр смысл этой фразы в том что в общем не стоит злоупотреблять анонимными методами)) Мне кажется их слишком много...
Смысл этой фразы ровно как и написано - в том, что в методы стоит выделять то, что может быть использовано где-то ещё. Додумывать не стоит. Данное место и с ордерами - единственное где используется.
Если используется в нескольких местах - выделяется в отдельные методы, ровно как и должно быть.
Собственно поработайте поплотнее с кодом, сложного и непонятного там ничего нет. С ордером - второй => - создание ордера, третий - обновление. Ну первый и так понятно.
Смысл плодить методы, которые никто никогда не будет использовать кроме одного единственного места?
Ну. Александр я просто попытался поднять вопрос который лично мне мешает при понимании кода... Если ни кто больше не считает что в этом ест проблема то ладно. Я правда думаю что на текущий момент кроме меня, вас и Михаила туда ни кто и не заглядывает(Я о плазе)...
Ну. А я просто попытался объяснить почему не стоит плодить методы которые никто не будет использовать :)
Ну хотя бы для того что бы не загромождать вызов функций передачей анонимных методов... Очень сложно уследить где один метод заканчивается а где начинается другой, а где передается параметр...
Смысл анонимных методов как раз в том, чтобы такие вещи не отслеживать, как то, где он заканчивает, и что передается. Поэтому и придумали замыкания.
А вообще C# с каждой новой версией становиться функциональным языком. Лямбды и замыкания - это свойство функциональности. В 4-ой версии параллелинг стал частью языка. Поэтому лямбды будут все больше и больше использоваться. Статья годичной давности. Хотел бы я узнать, как у автора дела на текущий момент с await и async. И не напишет ли он новую статью, что лямбды рулят и только их и нужно использовать.
)) Ну.. await и async разве не в 4.5 появятся только?
Аффтар MVP. Этот народ изучать начинает 4.5 когда еще 3.0 не вышла.😂
Ну понял. Вопрос значит закрыт... Но есть еще один) Теперь уже по логике работы плазы)) А разве при вызове метода Trader.Reconnect данные по инструментам не должны снова поступить?
Не должны. У нас ссылочная целостность. Перезакачка данных - это от лукавого.