// создаем заявку
price = Math.Round(price, (int)Security.MinStepSize);
var order = this.CreateOrder(direction, price, Volume);
var strategy = new BestByPriceQuotingStrategy(order, new Unit());
this.ChildStrategies.Add(strategy);
На входе переменная price меньше 1, и не равна нулю (цена VTBR). В CreateOrder цена передается 100% не нулевая. Стакан экспортируется (price рассчитывается по стакану). Стек с ошибкой в логе:
14:31:43.357 | Error | BBPQS | System.ArgumentException: Цена лимитной заявки не может быть равной 0.
Parameter name: order
at StockSharp.Algo.TraderHelper.#=qOq70Je$UoKCShNLmMVzO9HI_uuOFv1ssprl8_o8AiEA=(Order #=qKagG8k8Ovb7PHC_7HOGsJQ==)
at StockSharp.Algo.TraderHelper.#=q4EdRWmQ1sJYR9DrIQmw0yw==(Order #=qDVBVu9ZsVP7dj1O6fXTk4w==)
at StockSharp.Algo.BaseTrader.RegisterOrder(Order order)
at StockSharp.Algo.Strategies.Strategy.RegisterOrder(Order order)
at StockSharp.Algo.Strategies.QuotingStrategy.RegisterQuotingOrder(Order order)
at StockSharp.Algo.Strategies.QuotingStrategy.#=qlzj8y4$hZOZhZ1RmbdCH5A==()
at StockSharp.Algo.Strategies.QuotingStrategy.#=qwzmGrKnG$0lhDHOD3BPyMIGfnz8VBUNasvaLcrP14wU=.#=qpnYNY5NzqM5$u8ALBzvFrQ==()
at StockSharp.Algo.Strategies.StrategyRule.#=qTWtDdAyrOvqqwpPlWrMf1m0edz0ruOnkaCHoSLip4ks=.#=q2RRA2fuP59dWvgRZa59Gqg==(Object #=q4OL4JqmMEDgWWJZhruqntA==)
at StockSharp.Algo.Strategies.Strategy.#=qvdzE7plDm9pf3MELiCeSYQ==(StrategyRule #=qsmucCotxPBQXTe6b$Z3ZaA==, Object #=qD9yTFrYDMWYEFcMIrHi4xw==)
Аналогичная заявка с ценой Сбера проходит нормально. Есть ощущение, что исключение возникает в любом случае, если цена инструмента < 1 рубля.
Еще, судя по документации, свойство Security.Decimal должно содержать количество знаков после запятой в цене. Фактически у меня там ноль, а искомое количество знаков содержится в свойстве Security.MinStepSize.
Marco:
Возникла аналогичная проблема. Кусочек кода:
// создаем заявку
price = Math.Round(price, (int)Security.MinStepSize);
var order = this.CreateOrder(direction, price, Volume);
var strategy = new BestByPriceQuotingStrategy(order, new Unit());
this.ChildStrategies.Add(strategy);
>
> На входе переменная price меньше 1, и не равна нулю (цена VTBR). В CreateOrder цена передается 100% не нулевая. Стакан экспортируется (price рассчитывается по стакану). Стек с ошибкой в логе:
>
> :::spoiler
14:31:43.357 | Error | BBPQS | System.ArgumentException: Цена лимитной заявки не может быть равной 0.
> Parameter name: order
> at StockSharp.Algo.TraderHelper.#=qOq70Je$UoKCShNLmMVzO9HI_uuOFv1ssprl8_o8AiEA=(Order #=qKagG8k8Ovb7PHC_7HOGsJQ==)
> at StockSharp.Algo.TraderHelper.#=q4EdRWmQ1sJYR9DrIQmw0yw==(Order #=qDVBVu9ZsVP7dj1O6fXTk4w==)
> at StockSharp.Algo.BaseTrader.RegisterOrder(Order order)
> at StockSharp.Algo.Strategies.Strategy.RegisterOrder(Order order)
> at StockSharp.Algo.Strategies.QuotingStrategy.RegisterQuotingOrder(Order order)
> at StockSharp.Algo.Strategies.QuotingStrategy.#=qlzj8y4$hZOZhZ1RmbdCH5A==()
> at StockSharp.Algo.Strategies.QuotingStrategy.#=qwzmGrKnG$0lhDHOD3BPyMIGfnz8VBUNasvaLcrP14wU=.#=qpnYNY5NzqM5$u8ALBzvFrQ==()
> at StockSharp.Algo.Strategies.StrategyRule.#=qTWtDdAyrOvqqwpPlWrMf1m0edz0ruOnkaCHoSLip4ks=.#=q2RRA2fuP59dWvgRZa59Gqg==(Object #=q4OL4JqmMEDgWWJZhruqntA==)
> at StockSharp.Algo.Strategies.Strategy.#=qvdzE7plDm9pf3MELiCeSYQ==(StrategyRule #=qsmucCotxPBQXTe6b$Z3ZaA==, Object #=qD9yTFrYDMWYEFcMIrHi4xw==)
:::
>
> Аналогичная заявка с ценой Сбера проходит нормально. Есть ощущение, что исключение возникает в любом случае, если цена инструмента < 1 рубля.
>
> Еще, судя по документации, свойство Security.Decimal должно содержать количество знаков после запятой в цене. Фактически у меня там ноль, а искомое количество знаков содержится в свойстве Security.MinStepSize.
>
> Использую StockSharp 4.0.2.0.
price на входе куда != 0?
в CreateOrder что передаётся? распечатайте перед вызовом.
и да, у нас есть специальный метод ShrinkPrice для округления цены
Сейчас попробовал подключиться через QuikTrader. В отличие от подключения через SmartCOM, при работе через QUIK в поле Security.Decimal содержится корректное значение знаков цены. Заявки отправлять не пробовал - QUIK у меня только "боевой".
Возможно, проблема при размещении ордера с котированием при работе через SmartTrader вызвана тем, что некорректно заполняется поле Security.Decimal. Т.к. в этом поле содержится ноль, возможно при размещении заявки цена округляется до целого значения (=0, если price < 0.5). При размещении заявки с нулевой ценой возникает ошибка.
Завтра попробую руками выставлять поле Security.Decimal, возможно это поможет обойти проблему.
MinStepSize при подключении через SmartTrader был равен 2 для SBER03@EQBR и 5 для VTBR@EQNL. Т.е. в этом поле четко было количество знаков цены после запятой.
Marco:
MinStepSize при подключении через SmartTrader был равен 2 для SBER03@EQBR и 5 для VTBR@EQNL. Т.е. в этом поле четко было количество знаков цены после запятой.
В итоге - через ShrinkPrice всё работает, проблем нет?
Marco:
MinStepSize при подключении через SmartTrader был равен 2 для SBER03@EQBR и 5 для VTBR@EQNL. Т.е. в этом поле четко было количество знаков цены после запятой.
Запустите SampleSmart и пройдитесь по своим инструментам. Посмотрите, какие указаны правильно, а какие нет. Напишите об этом в АйТи. У меня тоже для ММВБ глюки. Для РТС все норм.
Я запустил пример TestConnect, который поставляется со SmartCOM. Судя по его логам, в событие AddSymbol значение Decimal передается правильно (2 - для Сбера, 5 - для VTBR). В параметрах punkt и step действительно передаются целые числа. Если бы Security.Decimal не рассчитывалось из MinStepSize, а бралось бы из параметра decimal события AddSymbol - все бы работало. В IT-Invest я напишу.
Пока я выставил поля Security руками - котирование заработало.
ShrinkPrice - стыдно сказать, у меня не получилось его использовать. В моем проекте этот метод не виден, при сборке я получаю ошибку. В примерах - да, метод есть. Опыта работы с C# у меня нет совсем, если подскажете, что поправить - буду очень благодарен. References я проверил - все ссылки ведут на папку References из StockSharp 4, так же, как и в примерах. Пробовал делать build clean, чистить папки bin и obj руками, перестраивать проект - не помогло. StockSharp использую версии 4.0.3 (обновлялся перезаписью файлов поверх предыдущей версии).
Marco:
Я запустил пример TestConnect, который поставляется со SmartCOM. Судя по его логам, в событие AddSymbol значение Decimal передается правильно (2 - для Сбера, 5 - для VTBR). В параметрах punkt и step действительно передаются целые числа. Если бы Security.Decimal не рассчитывалось из MinStepSize, а бралось бы из параметра decimal события AddSymbol - все бы работало. В IT-Invest я напишу.
Рассчитать по кол-ву знаков шаг цены невозможно. Потому что Decimal = 4, то MinStepSize = 0,0001 0,0002, 0,0005 и т.д. В АйТи нужно писать регулярно, потому что если не писать, у них сервис вообще перестанет что-либо слать.
Marco:
ShrinkPrice - стыдно сказать, у меня не получилось его использовать. В моем проекте этот метод не виден, при сборке я получаю ошибку. В примерах - да, метод есть. Опыта работы с C# у меня нет совсем, если подскажете, что поправить - буду очень благодарен. References я проверил - все ссылки ведут на папку References из StockSharp 4, так же, как и в примерах. Пробовал делать build clean, чистить папки bin и obj руками, перестраивать проект - не помогло. StockSharp использую версии 4.0.3 (обновлялся перезаписью файлов поверх предыдущей версии).
Комментарии (12)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Не экспортируется стакан судя по всему
Возникла аналогичная проблема. Кусочек кода:
На входе переменная price меньше 1, и не равна нулю (цена VTBR). В CreateOrder цена передается 100% не нулевая. Стакан экспортируется (price рассчитывается по стакану). Стек с ошибкой в логе:
14:31:43.357 | Error | BBPQS | System.ArgumentException: Цена лимитной заявки не может быть равной 0. Parameter name: order at StockSharp.Algo.TraderHelper.#=qOq70Je$UoKCShNLmMVzO9HI_uuOFv1ssprl8_o8AiEA=(Order #=qKagG8k8Ovb7PHC_7HOGsJQ==) at StockSharp.Algo.TraderHelper.#=q4EdRWmQ1sJYR9DrIQmw0yw==(Order #=qDVBVu9ZsVP7dj1O6fXTk4w==) at StockSharp.Algo.BaseTrader.RegisterOrder(Order order) at StockSharp.Algo.Strategies.Strategy.RegisterOrder(Order order) at StockSharp.Algo.Strategies.QuotingStrategy.RegisterQuotingOrder(Order order) at StockSharp.Algo.Strategies.QuotingStrategy.#=qlzj8y4$hZOZhZ1RmbdCH5A==() at StockSharp.Algo.Strategies.QuotingStrategy.#=qwzmGrKnG$0lhDHOD3BPyMIGfnz8VBUNasvaLcrP14wU=.#=qpnYNY5NzqM5$u8ALBzvFrQ==() at StockSharp.Algo.Strategies.StrategyRule.#=qTWtDdAyrOvqqwpPlWrMf1m0edz0ruOnkaCHoSLip4ks=.#=q2RRA2fuP59dWvgRZa59Gqg==(Object #=q4OL4JqmMEDgWWJZhruqntA==) at StockSharp.Algo.Strategies.Strategy.#=qvdzE7plDm9pf3MELiCeSYQ==(StrategyRule #=qsmucCotxPBQXTe6b$Z3ZaA==, Object #=qD9yTFrYDMWYEFcMIrHi4xw==)
Аналогичная заявка с ценой Сбера проходит нормально. Есть ощущение, что исключение возникает в любом случае, если цена инструмента < 1 рубля.
Еще, судя по документации, свойство Security.Decimal должно содержать количество знаков после запятой в цене. Фактически у меня там ноль, а искомое количество знаков содержится в свойстве Security.MinStepSize.
Использую StockSharp 4.0.2.0.
price != 0 передается в CreateOrder. При размещении ордера без котирования (через RegisterOrder()) заявка успешно регистрируется.
Cпасибо за совет по поводу ShrinkPrice().
Сейчас попробовал подключиться через QuikTrader. В отличие от подключения через SmartCOM, при работе через QUIK в поле Security.Decimal содержится корректное значение знаков цены. Заявки отправлять не пробовал - QUIK у меня только "боевой".
Возможно, проблема при размещении ордера с котированием при работе через SmartTrader вызвана тем, что некорректно заполняется поле Security.Decimal. Т.к. в этом поле содержится ноль, возможно при размещении заявки цена округляется до целого значения (=0, если price < 0.5). При размещении заявки с нулевой ценой возникает ошибка.
Завтра попробую руками выставлять поле Security.Decimal, возможно это поможет обойти проблему.
А чему равен MinStepSize?
MinStepSize при подключении через SmartTrader был равен 2 для SBER03@EQBR и 5 для VTBR@EQNL. Т.е. в этом поле четко было количество знаков цены после запятой.
В итоге - через ShrinkPrice всё работает, проблем нет?
Запустите SampleSmart и пройдитесь по своим инструментам. Посмотрите, какие указаны правильно, а какие нет. Напишите об этом в АйТи. У меня тоже для ММВБ глюки. Для РТС все норм.
Я запустил пример TestConnect, который поставляется со SmartCOM. Судя по его логам, в событие AddSymbol значение Decimal передается правильно (2 - для Сбера, 5 - для VTBR). В параметрах punkt и step действительно передаются целые числа. Если бы Security.Decimal не рассчитывалось из MinStepSize, а бралось бы из параметра decimal события AddSymbol - все бы работало. В IT-Invest я напишу.
Пока я выставил поля Security руками - котирование заработало.
ShrinkPrice - стыдно сказать, у меня не получилось его использовать. В моем проекте этот метод не виден, при сборке я получаю ошибку. В примерах - да, метод есть. Опыта работы с C# у меня нет совсем, если подскажете, что поправить - буду очень благодарен. References я проверил - все ссылки ведут на папку References из StockSharp 4, так же, как и в примерах. Пробовал делать build clean, чистить папки bin и obj руками, перестраивать проект - не помогло. StockSharp использую версии 4.0.3 (обновлялся перезаписью файлов поверх предыдущей версии).
Рассчитать по кол-ву знаков шаг цены невозможно. Потому что Decimal = 4, то MinStepSize = 0,0001 0,0002, 0,0005 и т.д. В АйТи нужно писать регулярно, потому что если не писать, у них сервис вообще перестанет что-либо слать.
using StockSharp.Algo;
и будет виден метод.
Вот ведь, до чего возможности полиморфизма дошли... Большое спасибо за помощь! :)