← 戻る

Некорректная работа Order.Canceled()

Правило некорректно срабатывает если происходит частичное исполнение заявки. Т.е если заявка частично сработала правило Order.Canceled() срабатывает. Подозреваю что это связанно с тем, что правило скорее всего правило активизируется при смене статуса заявки на Done, а этот статус и у исполненной частично заявки и у отмененной заявки! Сам я к сожалению не могу посмотреть внутренности Order.Canceled() , так что это только предположение...

このトピックは参考になりましたか?

トピックを共有

コメント (18)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

Alexander
Alexander

Почему в Plaza2?

frontman
frontman 著者

Да честно просто не знаю на других системах так же... Я с плазой только работаю...

Alexander
Alexander

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

Хотите дополнительно отфильтровать те заявки, которые частично исполнились - проверяйте что Balance = Volume. Для таких заявок характерно полная отмена, без частичного исполнения.

frontman
frontman 著者

Нет. Заявка вообще не отменялась. Правило Order.Canceled() сработало именно при частичном исполнении заявки. Мне именно корректное исполнение Order.Canceled() нужно))

Alexander
Alexander

какой при этом order.State? какая версия плазы?

frontman
frontman 著者

Скажу честно это предположение. Т.к у исполненной заявки так же как и у отмененной статус Done, то я предположил и у частично исполненной так же статус Done. отсюда и неверное срабатывание. К сожалению я не могу вот так сразу статус проверить заявки что бы сказать точно, т.к. частичное исполнение в моей стратегии не так часто происходит... Вообщем то я вас понял. Тогда как только получу точную инф. сразу отпишусь...

frontman
frontman 著者

Все проверил. Статус Done у заявки.

frontman
frontman 著者

Может скинете код Order.Canceled() я сам покопаюсь....

Alexander
Alexander

Так ответьте на вопрос про версию плазы. В коммите 10989 я делал фикс.

Order.Canceled() не дам, он тут не при чём. У заявки не должен выставляться статус Done. Если у вас версия >= 10989 - копайте PlazaTrader, который всем доступен.

frontman
frontman 著者

Использую версию 11103. Понят. Ок.

Alexander
Alexander

frontman: Использую версию 11103. Понят. Ок.

Посмотрите почему статус на Done меняется. Это должно происходить только когда Balance = 0

frontman
frontman 著者

Да. При этом баланс не был 0 у заявки. Done - "Заявка больше не активна на бирже (была полностью удовлетворена или снята из программы" . Разве если заявка снята у нее Balance = 0?

Alexander
Alexander

frontman: Да. При этом баланс не был 0 у заявки. Done - "Заявка больше не активна на бирже (была полностью удовлетворена или снята из программы" . Разве если заявка снята у нее Balance = 0?

Ещё раз.

  1. Заявка может быть удалена с биржи - вызван Cancel. Тогда State = Done, Balance != 0. Событие Order.Canceled() срабатывает
  2. Заявка может быть переведена в состояние Done когда Balance становится = 0.

Вам необходимо проверить почему и где у вас переходит в состояние Done когда вы

  1. и не снимаете заявку с биржи
  2. и не Balance = 0.

801\808 строчки в PlazaTrader.cs в последней ревизии.

Ещё детальнее расписать не могу - проще уже будет самому смотреть :)

frontman
frontman 著者

Ва ха)) Спасиб)

frontman
frontman 著者

Если честно у меня вызывает сомнения данный кусок: case 2: // исполнена order.State = OrderStates.Done; order.Balance = lastRecord.Get<decimal>(metadata.AmountRest); break;

Alexander
Alexander

frontman: Если честно у меня вызывает сомнения данный кусок: case 2: // исполнена order.State = OrderStates.Done; order.Balance = lastRecord.Get<decimal>(metadata.AmountRest); break;

Правильно, я уже выше сказал что это старая версия, исправил это давно. Сейчас так:

					case 2: // исполнена
						order.Balance = lastRecord.Get<decimal>(metadata.AmountRest);
						if (order.Balance == 0)
							order.State = OrderStates.Done;
						break;
frontman
frontman 著者

Т.е и статус у заявки уже Done, но при этом баланс еще не ноль...

frontman
frontman 著者

Все. Спасибо...