Текущие задачи по 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)


Теги:


Спасибо:


<< < 16 17 18 19 20  >
Alexander

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


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

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

Спасибо:

frontman

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


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

Спасибо:

Alexander

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


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

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

Спасибо:

frontman

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


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

Спасибо:

Alexander

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


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

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

Спасибо:

frontman

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


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

Спасибо:

frontman

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


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

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

Спасибо:

Alexander

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


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

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

Спасибо:

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);
			})));
		}
Спасибо:
<< < 16 17 18 19 20  >

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

loading
clippy