← Zurück

Ошибка метода ReRegisterOrder

Обнаружил ошибку в protected методе OnReRegisterOrder в PlazaTrader. Неправильно выставляется обьем заявки и режим. Исходники плазатрейдера у меня достаточно древние, может уже пофиксили, новых исходников в открытом доступе не нашел, чтоб проверить.

War dieses Thema hilfreich?

Thema teilen

Kommentare (15)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Alexander
Alexander

FiNick: Обнаружил ошибку в protected методе OnReRegisterOrder в PlazaTrader. Неправильно выставляется обьем заявки и режим. Исходники плазатрейдера у меня достаточно древние, может уже пофиксили, новых исходников в открытом доступе не нашел, чтоб проверить.

		protected override void OnReRegisterOrder(Order oldOrder, Order newOrder)
		{
			InitNewOrder(newOrder);

			var transaction = _transactionManager.Factory.CreateReRegister(oldOrder, newOrder);

			transaction
				.SetMoveMode(oldOrder.Volume == newOrder.Volume)
				.SetFirstOrderId(oldOrder.Id)
				.SetFirstVolume((int)newOrder.Volume)
				.SetFirstPrice(newOrder.Price)
				.SetFirstTransactionId(newOrder.TransactionId);

			_transactionManager.SendTransaction(transaction);
		}

текущая реализация. вроде ничего не меняли.

FiNick
FiNick Autor

Да, не изменилось. Если я ставлю некоторую заявку с обьемом например 20, а потом с коротким интервалом (500мс) перерегистрирую её с новым обьемом oldOrder.Balance, то в результате я могу набрать больше чем 20 контрактов. Это происходит потому что в момент перерегистрации мой робот может еще не знать, что баланс изменился, и послать команду Reregister со старым обьемом, а к тому моменту как команда придет на биржу баланс старой заявки изменится. Эта проблема исчезает, если посылать транзакцию с regime 0, то есть в вашем коде написать SetMoveMode(true). Но тогда иногда будет получаться, что в таблице "заявки" новые заявки (отправленные с помощью ReRegister) будут иметь один обьем, а фактически по ним будет проходить другой обьем. Т.е. в regime 0 неважно какой обьем поставить новой заявке, ей на бирже все равно присвоят обьем равный остатку по старой заявке.

esper
esper

FiNick: Если я ставлю некоторую заявку с обьемом например 20, а потом с коротким интервалом (500мс) перерегистрирую её с новым обьемом oldOrder.Balance, то в результате я могу набрать больше чем 20 контрактов. Т.е. вы хотите добрать тот же объем но по другой цене? Зачем тогда изменять объем? Пусть он будет равен объему предыдущей заявки, а не балансу.

FiNick
FiNick Autor

esper:

FiNick: Если я ставлю некоторую заявку с обьемом например 20, а потом с коротким интервалом (500мс) перерегистрирую её с новым обьемом oldOrder.Balance, то в результате я могу набрать больше чем 20 контрактов. Т.е. вы хотите добрать тот же объем но по другой цене? Зачем тогда изменять объем? Пусть он будет равен объему предыдущей заявки, а не балансу. Вам не кажется нелогичным, что я выставляю один обьем, а фактически у меня уходит другой обьем. Почему бы не написать метод, где точно сказано, что ререгистриться заявка будет на остаток, и в параметрах вообще не указывать никакой обьем. Я три дня воевал с этим ререгистром, офигевал от того как криво он работает и ошибок всяких, пока не залез в исходники и документацию по плазе.

Mikhail Sukhov
Mikhail Sukhov

FiNick: что ререгистриться заявка будет на остаток, и в параметрах вообще не указывать никакой обьем.

Это очень интересно. Согласен.

lesser
lesser

Mikhail Sukhov:

FiNick: что ререгистриться заявка будет на остаток, и в параметрах вообще не указывать никакой обьем.

Это очень интересно. Согласен.

Лучше когда обьем не указан тогда на остаток , а если указан то на тот что указан. Зачем делать лишние транзакции. Параметр обьема нужно сохранить .

Alexander
Alexander

FiNick: Почему бы не написать метод, где точно сказано, что ререгистриться заявка будет на остаток

это фактически regime = 3 выходит

SetMoveMode(oldOrder.Volume == newOrder.Volume) почему так неверно?

если oldOrder.Volume == newOrder.Volume - это regime = 0

Не менять объёмы заявок в ином случае - regime = 1 Изменить объёмы заявок

можете более подробно расписать в какой момент у вас возникает проблема, в чём она проявляется и как вы предлагаете её фиксить?

FiNick
FiNick Autor

Alexander Mukhanchikov:

FiNick: Почему бы не написать метод, где точно сказано, что ререгистриться заявка будет на остаток

это фактически regime = 3 выходит

Такс, а вот про режим 3 я не читал раньше. Это что получается, самый нужный режим у вас не реализован? Короче, странно, но эксперимент показывает, что в режиме 0 заявки ререгистрируются на остаток (то что по документации должно происходить в режиме 3). Может мы просто неправильно понимаем фразу "0 – не менять объёмы заявок", ведь по логике, кому может понадобиться режим, когда вы ставите заявку с обьемом 20, из него уходит 7, а вы переставляете эту заявку опять с тем же обьемом 20 и в итоге набираете 27?=)

Тут вот эту тему перетирают, но как-то не ясно все равно. Надо еще экспериментировать.

FiNick
FiNick Autor
SetMoveMode(oldOrder.Volume == newOrder.Volume)
``` - так вообще не правильно.
Думаю надо плазатрейдеру опцию сделать: режим перерегистрации, либо сделать у метода ReRegisterOrder параметр режим, а если не указан по умолчанию 1 ставить.  
Alexander
Alexander

можно подробнее с цифрами объёма пример привести?

FiNick
FiNick Autor

Alexander Mukhanchikov: можно подробнее с цифрами объёма пример привести? Ставите заявку с обьемом 20, уходит 7, остается 13, ререгистрим заявку выставляя обьем 20 (т.е. внутри плазатрейдера транзакции выставится режим 0). В результате ререгистрации выставится заявка с обьемом 13, а не 20 как мы указали.

Alexander
Alexander

FiNick:

Alexander Mukhanchikov: можно подробнее с цифрами объёма пример привести? Ставите заявку с обьемом 20, уходит 7, остается 13, ререгистрим заявку выставляя обьем 20 (т.е. внутри плазатрейдера транзакции выставится режим 0). В результате ререгистрации выставится заявка с обьемом 13, а не 20 как мы указали.

Спасибо, будет фикс

Alexander
Alexander

Фикс сделан в ветке 4.1

FiNick
FiNick Autor

Alexander Mukhanchikov: Фикс сделан в ветке 4.1

А можно ссылку? не могу найти

Alexander
Alexander

FiNick:

Alexander Mukhanchikov: Фикс сделан в ветке 4.1

А можно ссылку? не могу найти

stocksharp.codeplex.com