← Zurück

Order.GetAveragePrice равно 0

В стратегии цена стоп заявки рассчитывается как "GetAveragePrice исполнившейся Short заявки " - 80 Стратегия работало какое-то время, все было нормально, стоп-заявки исполнялись. В какой то момент почему-то при расчете стопа GetAveragePrice было 0 и цена получилась отрицательная, произошел сбой:

System.ArgumentOutOfRangeException: Цена заявки должна быть положительной. Parameter name: order Actual value was -80. at #=qGoBuDlT6LOhOqFv3WY9JfVoUGMLwCQqmxGn3ux1xsRU=.#=qrmBGhucdwUvMBWxvyf90OGFH_$dcrvDHgJnWvyziAz4=(Order #=qRqhlCAIZNVQm5yp$9tOMHw==, Boolean #=qcRD_tAfwy2bBT7qJZOuzHw==) at #=qGoBuDlT6LOhOqFv3WY9JfVoUGMLwCQqmxGn3ux1xsRU=.#=qF6Ws2dOW1i8aCwov_qo_Xw==(Order #=qZn3kSxtavZ876oTZ3s7DtQ==, Boolean #=qjNfQ2svAOHqFj5BSaDISdQ==) at StockSharp.Algo.BaseTrader.RegisterOrder(Order order) at StockSharp.Algo.Strategies.Strategy.RegisterOrder(Order order)

Подскажите почему так могло получится? Каким образом и в какой момент в библиотеке происходит расчет AveragePrice для исполнившейся заявки? Выходит нельзя полагаться на GetAveragePrice ?

Версия S# 4.1.1

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

paveld
paveld Autor

Неужели ни кто не сталкивался с таким? Может разработчики подскажут каким образом и в какой момент в библиотеке происходит расчет AveragePrice для исполнившейся заявки? Проблема в нестабильности заполнения значения на стороне библиотеки или квика?

Moadip
Moadip

В какой то момент почему-то при расчете стопа GetAveragePrice было 0 Если почитать справку, то там написано: "Если заявка не была исполнена ни по одному контракту, то возвращается 0"

Может надо проверку делать исполнился ордер или нет?

paveld
paveld Autor

Moadip: Если почитать справку, то там написано: "Если заявка не была исполнена ни по одному контракту, то возвращается 0"

Может надо проверку делать исполнился ордер или нет? В том то и проблема что заявка исполнилась. И в большинстве случаев по ходу работы стратегии AveragePrice заполнена, но возникают такие сбои когда почему-то оказывается не заполнена. Чтобы разобраться с этим я и написал на форуме.

Alexander
Alexander

Это могло произойти в том случае, если не успела придти информация по своим сделкам по данному ордеру. Т.е. надо дожидаться когда все сделки придут - средняя цена вычисляется именно по совершившимся сделкам данного ордера.

paveld
paveld Autor

Alexander Mukhanchikov: Это могло произойти в том случае, если не успела придти информация по своим сделкам по данному ордеру. Т.е. надо дожидаться когда все сделки придут - средняя цена вычисляется именно по совершившимся сделкам данного ордера.

Подскажите пожалуйста, как тогда правильнее в стратегии выставлять защитные заявки, по событию NewMyTrades или по правилу OrderPartiallyMatched? Сейчас я выставляю при вызове правила OrderPartiallyMatched, где как раз и получается ситуация когда GetAveragePrice нулевая.

esper
esper

paveld: Подскажите пожалуйста, как тогда правильнее в стратегии выставлять защитные заявки, по событию NewMyTrades или по правилу OrderPartiallyMatched? Сейчас я выставляю при вызове правила OrderPartiallyMatched, где как раз и получается ситуация когда GetAveragePrice нулевая. Т.к. защищается именно сделка, то и выставлять логично по событию NewMyTrades. Стандартные защитные стратегии как раз принимают на входе MyTrade.

paveld
paveld Autor

Подскажите пожалуйста еще ответы на такие вопросы:

  1. Изменение Order.Balance у заявки происходит по событию NewMyTrades?
  2. Почему информация о собственных сделках приходит позднее, чем срабатывает событие OrderPartiallyMatched. Изначально делал по событию OrderPartiallyMatched именно потому что оно срабатывает быстрее.
esper
esper

paveld: Подскажите пожалуйста еще ответы на такие вопросы:

  1. Изменение Order.Balance у заявки происходит по событию NewMyTrades?
  2. Почему информация о собственных сделках приходит позднее, чем срабатывает событие OrderPartiallyMatched. Изначально делал по событию OrderPartiallyMatched именно потому что оно срабатывает быстрее.
  1. Нет, по OrderChanged, когда меняется столбец остаток в таблице квика.
  2. Экспорт таблиц асинхронный, поэтому нельзя сказать какие данные придут быстрее.
paveld
paveld Autor

esper:

  1. Нет, по OrderChanged, когда меняется столбец остаток в таблице квика.
  2. Экспорт таблиц асинхронный, поэтому нельзя сказать какие данные придут быстрее.

Что-то я запутался. Если выставляемые защитные заявки зависят от средней цены исполнения и баланса исполнившейся заявки, а эти данные приходят в разное время и по разным событиям, как тогда правильно выставлять защитные заявки и в каком событии, чтобы гарантированно эти поля были заполнены?

esper
esper

paveld: Что-то я запутался. Если выставляемые защитные заявки зависят от средней цены исполнения и баланса исполнившейся заявки, а эти данные приходят в разное время и по разным событиям, как тогда правильно выставлять защитные заявки и в каком событии, чтобы гарантированно эти поля были заполнены?

  1. Защищать каждую приходящую свою сделку. Пример здесь.
  2. Дожидаться пока придут все сделки по заявке, вычислять среднюю цену и защищать сделку по средней цене.
paveld
paveld Autor

esper:

  1. Защищать каждую приходящую свою сделку. Пример здесь.

Извиняюсь, но еще раз уточню. Если выставлять защитные заявки как по ссылке, те по правилу заявки WhenNewTrades, я так понимаю все равно остается риск того что Balance у заявки не успеет обновиться (так как это делается по другому событию OrderChanged), правильно?

esper
esper

Да, такая ситуация вполне вероятна. А зачем там баланс, если защищается именно каждая сделка?

paveld
paveld
paveld Autor

esper: Да, такая ситуация вполне вероятна. А зачем там баланс, если защищается именно каждая сделка? Вообще вроде не нужен баланс если из MyTrade можно получить объем исполненный по собственной заявке. А то, что приходит в MyTrade.Volume - это весь объем по собственной заявке?

esper
esper

Весь объем по заявке в MyTrade.Order.Volume, объем прошедший по сделке в MyTrade.Trade.Volume

paveld
paveld Autor

esper: Весь объем по заявке в MyTrade.Order.Volume, объем прошедший по сделке в MyTrade.Trade.Volume MyTrade.Trade.Volume - это именно объем закрытый у заявки для которой сработало правило?

У меня по логике стратегии нужно еще определять исполнилась ли заявка полностью или нет, а если исполнилась то должно известна быть средняя цена исполнения. Это в правиле WhenNewTrades как я понимаю никак не определить?