← 返回

Цена лимитной заявки не может быть равной 0

_order = this.CreateOrder(_direction, base.Security.GetMarketPrice(_direction), base.Volume); 
this.RegisterOrder(_order);

Прога вылетает с исключением: "Цена лимитной заявки не может быть равной 0." (Security c FORTS)

本主题对您有帮助吗?

分享主题

评论 (12)

登录创建账户, 登录或注册以发表评论

Alexander
Alexander

raf: ...

Прога вылетает с исключением: "Цена лимитной заявки не может быть равной 0." (Security c FORTS)

Не экспортируется стакан судя по всему

Marco
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 рассчитывается по стакану). Стек с ошибкой в логе:

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.

Alexander
Alexander

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 для округления цены
Marco
Marco

price != 0 передается в CreateOrder. При размещении ордера без котирования (через RegisterOrder()) заявка успешно регистрируется.

Cпасибо за совет по поводу ShrinkPrice().

Marco
Marco

Сейчас попробовал подключиться через QuikTrader. В отличие от подключения через SmartCOM, при работе через QUIK в поле Security.Decimal содержится корректное значение знаков цены. Заявки отправлять не пробовал - QUIK у меня только "боевой".

Возможно, проблема при размещении ордера с котированием при работе через SmartTrader вызвана тем, что некорректно заполняется поле Security.Decimal. Т.к. в этом поле содержится ноль, возможно при размещении заявки цена округляется до целого значения (=0, если price < 0.5). При размещении заявки с нулевой ценой возникает ошибка.

Завтра попробую руками выставлять поле Security.Decimal, возможно это поможет обойти проблему.

Mikhail Sukhov
Mikhail Sukhov

А чему равен MinStepSize?

Marco
Marco

MinStepSize при подключении через SmartTrader был равен 2 для SBER03@EQBR и 5 для VTBR@EQNL. Т.е. в этом поле четко было количество знаков цены после запятой.

Alexander
Alexander

Marco: MinStepSize при подключении через SmartTrader был равен 2 для SBER03@EQBR и 5 для VTBR@EQNL. Т.е. в этом поле четко было количество знаков цены после запятой.

В итоге - через ShrinkPrice всё работает, проблем нет?

Mikhail Sukhov
Mikhail Sukhov

Marco: MinStepSize при подключении через SmartTrader был равен 2 для SBER03@EQBR и 5 для VTBR@EQNL. Т.е. в этом поле четко было количество знаков цены после запятой.

Запустите SampleSmart и пройдитесь по своим инструментам. Посмотрите, какие указаны правильно, а какие нет. Напишите об этом в АйТи. У меня тоже для ММВБ глюки. Для РТС все норм.

Marco
Marco

Я запустил пример 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 (обновлялся перезаписью файлов поверх предыдущей версии).

Mikhail Sukhov
Mikhail Sukhov

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 (обновлялся перезаписью файлов поверх предыдущей версии).

using StockSharp.Algo;

и будет виден метод.

Marco
Marco

Вот ведь, до чего возможности полиморфизма дошли... Большое спасибо за помощь! :)