jamesRUS52/tinkoff-invest

Изменение API со стороны Тинькова: не работают лимитные ордера и пустой orderBook

Closed this issue · 3 comments

  1. Внезапно перестали работать лимитные ордера (как раз в тот момент когда они должны были сработать :). После обращения в Тинькофф и двух недель ожидания получил ответ техподдержки, который позволил понять, что изменился парсер JSON со стороны Тинькова и то что раньше у меня работало:

{"lots":1,"operation":"Buy","price":"67.68"}

теперь должно быть записано в точности как в их сваггере (67.68 без кавычек):

{"lots":1,"operation":"Buy","price":67.68}

  1. orderBook пустой из-за изменения формата (теперь получаемый от Тинькова массив не ассоциативный, в нём нет quality и amount)

Я не программист, к сожалению сейчас нет времени проверить все остальные функции API, нет времени разобраться как сделать пул реквест. Прикладываю патч, который работает для меня

sadm2014.patch.gz

  1. You should use an integer or a float value in sendOrder method. All tests processed successfull. You perhaps use string value. Not a bug.
  2. Not confirmed. I have added test for GetBestPrice and it success with current code. Not a bug.
  ["asks":"jamesRUS52\TinkoffInvest\TIOrderBook":private]=>
  array(1) {
    [0]=>
    object(stdClass)#2505 (2) {
      ["price"]=>
      int(5398)
      ["quantity"]=>
      int(10)
    }
  }
  1. You should use an integer or a float value in sendOrder method. All tests processed successfull. You perhaps use string value. Not a bug.
  2. Not confirmed. I have added test for GetBestPrice and it success with current code. Not a bug.
  ["asks":"jamesRUS52\TinkoffInvest\TIOrderBook":private]=>
  array(1) {
    [0]=>
    object(stdClass)#2505 (2) {
      ["price"]=>
      int(5398)
      ["quantity"]=>
      int(10)
    }
  }

По 2-му пункту проблема определенно есть.

У Вас есть два метода getHistoryOrderBook и getOrderBook. В первом случае ответ получается через rest-протокол и там ассоциативный массив. А во втором через streaming и в ответе уже не ассоциативный массив.
В итоге во 2-м случае методы getBestPriceToBuy(), getBestPriceToBuyLotCount(), getBestPriceToSell(), getBestPriceToSellLotCount() ничего не возвращают. И в var_dump будет:

["asks":"jamesRUS52\TinkoffInvest\TIOrderBook":private]=>
  array(2) {
    [0]=>
    array(2) {
      [0]=>
      float(222.68)
      [1]=>
      int(32)
    }
    [1]=>
    array(2) {
      [0]=>
      float(222.69)
      [1]=>
      int(21)
    }
  }

См. https://tinkoffcreditsystems.github.io/invest-openapi/marketdata/#orderbooksubscribe

Тестируемый код:

$orderbook = $TIClient->getOrderBook('BBG000BCSST7',2);

print 'Price to buy: '.$orderbook->getBestPriceToBuy().' Available lots: '.$orderbook->getBestPriceToBuyLotCount().
        ' Price to Sell: '.$orderbook->getBestPriceToSell().' Available lots: '.$orderbook->getBestPriceToSellLotCount()."\n";

getOrderBook fixed in version 1.2.3

thanks for reply