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


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

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

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



Теги:


Спасибо:



Скидка 15% на все обучение до 1 августа (осталось 11 дней).

192 Ответов
<< < 6 7 8 
frontman

Фотография
Дата: 29.11.2011
Ответить


Ну это понятно...
Спасибо:

frontman

Фотография
Дата: 07.12.2011
Ответить


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


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

Alexander

Фотография
Дата: 07.12.2011
Ответить


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


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

frontman

Фотография
Дата: 07.12.2011
Ответить


В 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());
				}
			});
		}
Спасибо:

frontman

Фотография
Дата: 07.12.2011
Ответить


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

Код
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

Фотография
Дата: 07.12.2011
Ответить


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

Alexander

Фотография
Дата: 07.12.2011
Ответить


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());
				}


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

Где это ещё используется? Кроме данного места?
Автор топика
Спасибо:

frontman

Фотография
Дата: 07.12.2011
Ответить


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

Alexander

Фотография
Дата: 07.12.2011
Ответить


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


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

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

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

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

frontman

Фотография
Дата: 07.12.2011
Ответить


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

Alexander

Фотография
Дата: 07.12.2011
Ответить


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


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

frontman

Фотография
Дата: 07.12.2011
Ответить


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 07.12.2011
Ответить


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


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

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

frontman

Фотография
Дата: 07.12.2011
Ответить


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 07.12.2011
Ответить


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


Аффтар MVP. Этот народ изучать начинает 4.5 когда еще 3.0 не вышла.Laugh
Спасибо:

frontman

Фотография
Дата: 07.12.2011
Ответить


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 07.12.2011
Ответить


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


Не должны. У нас ссылочная целостность. Перезакачка данных - это от лукавого.
Спасибо:
<< < 6 7 8 

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy