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

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


  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)


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


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

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

Thanks:

Alexander

Avatar
Date: 12/7/2011
Reply


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

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

Thanks:

frontman

Avatar
Date: 12/7/2011
Reply


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

frontman

Avatar
Date: 12/7/2011
Reply


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

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