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

Текущие задачи по PlazaTrader
Atom
10/10/2011
Alexander


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

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

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



Tags:


Thanks:


<< < 16 17 18 19 20  >
Alexander

Avatar
Date: 11/28/2011
Reply


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


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

frontman

Avatar
Date: 11/29/2011
Reply


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

Alexander

Avatar
Date: 11/29/2011
Reply


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


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

frontman

Avatar
Date: 11/29/2011
Reply


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

Alexander

Avatar
Date: 11/29/2011
Reply


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


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

frontman

Avatar
Date: 11/29/2011
Reply


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

frontman

Avatar
Date: 12/7/2011
Reply


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


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

Alexander

Avatar
Date: 12/7/2011
Reply


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


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

frontman

Avatar
Date: 12/7/2011
Reply


В PazaTrader много такого...
Code
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());
				}
			});
		}
Thanks:

frontman

Avatar
Date: 12/7/2011
Reply


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

Code
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);
			})));
		}
Thanks:
<< < 16 17 18 19 20  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy