📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

API v2 Тинькофф Инвестиции + Python ❤️‍🔥 Покупка и продажа | postOrder, лимитки, алготрейдинг

Azzrael Code21:17

Transcription

Привет, коллеги! Вы на канале "Назрел Код". Меня зовут Денис.

Сегодня долгожданное видео, посвященное покупке ценных бумаг в Тинькофф Инвестиции через их новый API 2 версии, нагнетание с официальным SDK для Питона.

Во второй версии API Тинькофф дал нам возможность работать через API, сообщит они Тинькофф Инвестиции. Поэтому я настоятельно вам рекомендую в первую очередь создать отдельный субсчет, отдельный субсчет конкретно для торговли через API. Это позволит вам повысить безопасность, если вдруг что-то у вас пойдет не так, чтобы не купить лишнего, не против него.

И обязательно проверьте, чтобы у вас было отключено на этом тестовом счете маржинальной торговли, если вдруг она вам доступна.

Следующим вам понадобится токен с полным доступом. Полным доступом я рекомендую вам выпустить токен с полным доступом к конкретному тестовому счету, через который вы будете осуществлять сделки через API. Настоятельно рекомендую сделать отдельный токен, так как учиться мы с вами будем на реальном счете.

Соответственно, при покупке и продаже бумаг мы будем платить реальную комиссию. То очевидно, стоит для обучения подобрать те бумаги, которые самые дешевые и на которые самой минимальной комиссии.

Очевидно, первым, что приходит в голову, воспользоваться фондами Тинькова. Они дешевые и, в общем-то, они вообще без комиссии. Но, к сожалению, у Тинькова есть лимиты на продажу фондов через API. Точную цифру не скажу, но, по-моему, что-то около 100 ордеров, то ли на одну бумагу, то ли в принципе на все фонды. Поправьте меня в комментариях, как точно на самом деле.

Если вы вдруг упрётесь в эти лимиты, то есть, естественно, фонды предпочтительны для экспериментов, потому что комиссии не будет. В общем, вот, ну и цена низкая. Соответственно, если мы что-то купим, она упадет, мы немного потеряем.

Пока и грации будем. Вот, но если вдруг упрётесь в лимиты по отрывкам киевским, то вот вам списочек некоторых бумаг, которые, в общем-то, самые дешевые, которыми тоже можно играться.

Ну и, как обычно, исходники по ссылке в описании не будут лежать. Накид хобби базовая. Вот эти все вещи, как подключиться к API, что такое токены и все такое прочее, я рассказывал в предыдущих видео. Посмотрите их, если не смотрели.

Сегодня мы этих вещей касаться не будем. Питон 3.8 и выше, SDK официальной от Тинькофф Инвестиции.

Поскакали!

Покупать-продавать бумаги в Тинькофф Инвестиции через API можно двумя способами. Один способ — это HTTP-запросы, похоже чем-то на REST-запросы. То есть, как вы видите на экране, мы отправляем запрос и покупаем бумагу или продаем.

Также есть возможность подключиться через Stream API Тинькофф Инвестиции и в одном потоке, не отключаясь от стрима, покупать-продавать бумаги. Вот сегодня стрим и трогать не будем.

Вообще будут только HTTP-запросы, простые, легкие, с которыми легко работать и привычные вам, скорее всего.

Покупка или продажа бумаги осуществляется в сервисе торговых поручений. Востока этот сервис называется "Orders". В документации метод, с помощью которого мы направляем запрос на заявку, ордер называется POST Order. В SDK это называется также POST Order.

В документации мы можем посмотреть тело запроса. Здесь мы передаем FIGI инструменты, которые хотим купить, quantity — количество лотов, не акций, лотов, не паев. Короче, вот в одном лоте у нас может быть несколько акций.

Вы знаете, на MIG Price мы указываем. Не всегда мы можем залезть. Мы можем залезть в описание этого метода и увидим, что все, что у нас выделено, передавать не обязательно.

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

Direction — направление операции: покупка или продажа. Аккаунт — это номер брокерского счета, его идентификатор. Нигде в терминале, нигде в Тинькове вы не можете узнать номер вашего конкретного счета, но вы можете его узнать, используя метод Get Accounts Users.

Я об этом методе рассказывал в предыдущих видео. Посмотрите их, если не смотрели.

Ранее Get Accounts и пытаюсь быть пока. Вот это уберем воды. Просто отправляю запрос с помощью вот такой простой конструкции. То есть клиент, служба, метод службы.

А когда вы создаете клиент, когда вы создаете клиент, вот он, вы должны использовать токен, который имеет право покупать на этом субсчете. Это важно, потому что если вы укажете токен только для чтения, то вы не сможете ничего не купить, будете получать ошибку.

Если вы укажете токен, который имеет право покупать, но укажите неверный аккаунт, то вы не сможете ничего купить на этом счете.

Давайте поставим парочку экспериментов. Возьмем какой-нибудь токен только для чтения, который у меня есть, и попробуем с помощью отправить запрос на покупку. Мы получили ответ: "Permission denied". С этим токеном мы не можем покупать на этом счете.

Перемещая "denied", достаточно прав для совершения операции. Давайте попробуем использовать токен для записи, но при этом попробуем купить на аккаунте, для которого у этого токена, по идее, прав нет.

Получим ту же самую ошибку. Ну, конечно, мы можем выпустить токен, который имеет полное право ко всем счетам. Так гораздо проще, если у вас всего лишь один брокерский счет, на котором вы будете только экспериментировать.

И так можно делать, и можно не заморачиваться. Дальше. Аргумент "order ID" — это идентификатор, который мы должны сгенерировать. Как это можно использовать? Рандомным способом и передать при отправке заявки. Он может быть нужен, но если вы просто покупаете и продаете что-то, то, по большому счету, без разницы, что вы там укажете.

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

Вот, все это все, что нам нужно. Итого, у нас есть "order ID", "FIGI", "quantity", которые хотим купить, "account ID", где мы хотим купить, при этом токен соответствует направлению: покупка-продажа.

Покупаем "FIGI" и покупаем по рынку. А вот давайте попробуем. Смотрите, вот мой тестовый расчет. Здесь пока и т.к. от Тинькова нету. Отправим заявочку, попробуем купить.

Вот в ответ я принял ответ на POST. У нас возвращает POST Order Response. Вот его можно также посмотреть. Здесь куча всякого разного информации, которая может быть для вас важна, может быть нет, но так или иначе все прошло успешно.

Вот у меня фонд, который купил там за 5 рублей без комиссии. Вот, видите, все сработало. Чтобы продать, меняем всего лишь один пункт. То есть с direction "buy" меняю на direction "sell".

Вот, есть, вот его продаю, получая опять же ответ, в котором есть статус. Его что он полностью выполнен. Вот количество хотели, количество до. В общем, можно почитать документацию и детям стать.

В терминале увидим все. И вот, соответственно, наши логи, история операции идет. Мы купили один лот и продали 10. Комиссии никаких при этом не платили.

Ну и, собственно, цена никуда не ушла, мы ничего не потеряли. Все так просто.

Что если я захочу продать бумагу, которой у меня нет? Мы посмотрим. То сейчас у меня нету фондов Тинькова. Давайте попробуем продать. Получим "invalid argument".

Глава "not in of a set for mo режим". Вот, то есть мы не можем продать бумагу, которая не торгуется в шорт и, соответственно, которой у нас нет в активах. Получаем ошибку.

Лимитками чуть посложнее, но в целом не сильно. Смотрите, во-первых, нам нужно здесь выбрать вместо "market" нам нужно выбрать "limit". Соответственно, выбрать направление. Я уберу "buy".

Вот, но самое главное, нам нужно указать цену. Если мы пойдем просто в терминал и попробуем выставить заявку лимитную на, скажем, 1 лот по цене, которая в стакане, мы видим где-то в районе 4,5. Короче, болтает.

Попробуем выставить, допустим, по рублю лимит на и попробуем купить по рублю. И лимитка поставить. Мы видим, что минимальная цена выбранного инструмента там 2,916.

Откуда берется вот эта цифра 2,916? Рублю нам даже лимитку поставить не дает. Почему? Можем сходить в документацию. Вообще, в принципе, регулирует.

Сходим в эту часть документации и почитаем здесь про разные особенности работы с ордерами. Но важно, что мы не можем указать в лимитке совершенно любую цену, какую мы хотим. Мы ограничены стаканом.

Как получить стакан через API? Я вам показывал в самом первом видео. Большому счету все очень просто. Используя метод Get Order Book из Market Data сервиса, который нам возвращает, в общем-то, все очень просто.

Нам возвращают "bid" и "ask", их цена последняя, последствия продажи. На самом деле, насколько я видел в других API, в смысле в других SDK Тинькофф Инвестиций, в некоторых API нам также возвращают вот эти штуки, которые называются "limit price down".

То есть границы минимальные цены, по которой мы можем выставить лимитную заявку. Но вот конкретно в Питоне, конкретно в этом SDK, к сожалению, вот здесь, вот здесь, вот здесь, вот не "limit price down" не передается, и мы не можем узнать через этот запрос, по какой минимальной и максимальной цене мы можем выставить лимит.

Все, что мы можем сделать, это получить ответ "Get Order Book Response", взять "bid" и "ask" и взять крайние границы стаканов. И это наши будут минималка и максималка цен, по которым мы можем выставить лимитки.

Я по другому способу пока не знаю. Если вы вдруг знаете или, возможно, потом что-то в API изменится, мы это допишем, но пока так.

То есть через API мы можем вытащить стакан максимальной глубиной в 50. Вот и границы этого стакана у нас и будут границами, по которым мы можем выставить лимитки. Максимум или минимум.

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

Ну и, соответственно, вот эти цены — это максимальные минимальные цены, по которым можем выставить лимит.

Можем взглянуть еще раз в терминал, увидим здесь 457, здесь 1,457. Здесь у нас чем мы видим, то 49, тут вот 599 побольше. Мы видим.

Ну, то есть понятно, что у нас есть "bid", у нас есть "ask". Соответственно, выставить лимитку на продажу мы можем максимум по 5399. Здесь, хотя на самом деле, скорее всего, можем выставить и по большей цене, но в этом избегая.

Мы можем увидеть только эту цену. Можем тут что-то придумывать, пытаться выставлять повыше. Вот, но, короче, вы поняли, уже чему веду.

Вот и, соответственно, можем пытаться купить по минимальной цене лимита, который можем выставить. Это в данном случае 457.

Вот, то есть если это обернуть все в код, то получается в комментариях. То есть вот мы берем "ask", берем "bid", выбираем цены, которую мы можем заявить для продажи и "bid" для покупки.

Соответственно, вот если мы хотим продать быстро, то мы ставим соответственно цены, которые с минимальным спредом. Соответственно, индекса берем "bid" "ask" нулевые.

Вот, ну а соответственно, если мы хотим выставить лимит с максимальным минимальным, чтобы продать дешевле, дороже максимально, вот, то мы ставим по краям стаканом с максимальным спредом.

Соответственно, у нас будет вот. То есть если мы хотим выставить лимит с максимальным профитом, вот, мы берем стакан, мы берем индекс минус 1 и мы получаем лучшую цену на для покупки или лучшую цену для продажи.

Вот, и эту цену отдаем уже в POST Order. Давайте посмотрим, как это будет выглядеть. Но для начала попробуем выставить лимитку ниже допустимого уровня цены.

То есть попробуем купить лимитку за рубль. То, что у нас вроде там был 2,916, что минималка, да? Вот, то есть пока вот это все не используем.

Обратите внимание, цену в POST Order мы передаем не во float, а передаем в кастомном типе "Quotation". Вот, вот она где у нас тут. Вот он.

То есть "Quotation" я рассказывал о кастомных типах в первом видео этого сезона. То есть, чтобы создать экземпляр этого типа, мы просто используем конструктор, куда передаем юниты.

И на, где юниты, то соответственно целую часть, она на этой, а дробная часть. В данном случае мы покупаем рублевый инструмент, соответственно, здесь у нас один рубль.

И это, мною, капель пота были доллары. Соответственно, это было бы доллары и центры. Но все достаточно просто.

А "гитарный бог" нам сразу отдает в капюшонах все, поэтому здесь ничего преобразовывать не придется.

Ну, короче, попробуем купить лимитку за рубль. Что получится? Вот, нам выдали. Вот, выдали сразу текст ошибки в латинице.

Вот, что мы должны поставить нормальную цену. И ошибку 30,049. 30,049. Давайте посмотрим.

А вот, да, ну вот видите, то есть не получилось у нас выставить по такой неправильной цене. А теперь давайте все это разкомментируем.

И возьмем best price. Однако, если вы были внимательны, то на века заметили, что best price buy в артбуке "bid" и "ask" у нас идут в виде экземпляров класса "Order", в котором есть поле "price", который как раз хватаешь.

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

То есть нам нужно отсюда только "price". Такое вот. И вот этот вот уже "price" мы передаем в POST Order. Вот так вот.

И все, вроде должно заработать. Посмотрим. Но вот, то есть результат нас вроде все хорошо. На лот "request" один, "executed" 0. Пока 0, то есть он нас ничего не купил.

Но лимитка у нас выставилась. Пойдем в терминал. Здесь у нас есть виджет активные заявки. Вот, и здесь есть лимитка, которую мы выстроили.

Мы выставили как раз его по 457, но там мы можем редактировать, мы можем ее удалить в терминале. Но, в общем, все прошло успешно.

Копеек, соответственно, это лимитная заявка. Пока не выполнено. И мы можем ее, во-первых, увидеть с помощью метода Get Orders и можем отменить с помощью метода Cancel Order.

Давайте посмотрим. Итак, первый метод Get Orders, который возвращает список открытых лимитов, открытых ордеров. Но тут могут быть не только лимитки, здесь могут быть и рыночные заявки, которые вдруг еще не исполнились.

Низко ликвидность, мы не смогли купить запрошенный объем. Вот, и мы можем, в общем-то, увидеть не только лимитки. В качестве аргумента передается только аккаунт ID, номер брокерского счета, с которым мы работаем.

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

В данном случае вот здесь этот ответ можно разобрать в документации. То есть это у нас торговое поручение Get Orders Response. Здесь есть ордера.

Дилан, нам нужен вот его статус. Можно посмотреть, что за статус и вот количество запрошенных лотов для покупки-продажи, количество лотов, которые купили-продали, ну и так далее.

Все вот тут вот все это видно. То есть для чего нам это нужно? Мы можем взять этот список, это просто массив объектов класса Order State.

В каждом из Order State у нас есть вот "order ID", который нам нужен для того, чтобы изменить заявку ордер или удалить ее.

Давайте удалим. Теперь для удаления текущей заявки, которая еще не исполнена, мы используем метод Cancel Order из службы Orders, в котором, например, в качестве аргумента передается ID брокерского счета.

И самое главное, "order ID". Андроид, который мы получили вот отсюда. То есть у нас есть массив "orders", в котором первый элемент у нас "order ID".

Ну вот, но у вас может быть много. Это, собственно, ну короче, вы видели. Конечно, нужен уровень ордера. Не вот и моего сюда передаем, и тогда мы отменим.

Это проверим. Висит, ничего не купилось. Окей, вот поскакали.

Вот, то есть сначала мы вывели ордера, которые у нас открыты, и потом начали удалять. В ответ мы получили Cancel Order Response. У нас дата, когда все было совершено.

Меня посмотреть, видим активных заявок больше нет. Ну да, линии при этом в логах не где тут не отображается. Ничего, все.

Все вот так вот очень просто. Главное, не забывайте, что в зависимости от количества поставленных заявок и отмененных заявок у вас меняются лимиты API и на количество запросов, которыми вы можете управлять.

И не забывайте о том, что на покупку-продажу фондов, которые без комиссии, в API тоже есть лимиты. Об этом это в начале видео.

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

Вот, в общем, основной функционал мы с вами рассмотрели. С помощью этого функционала вы можете уже покупать-продавать бумаги.

Ну вот, но, конечно, здесь есть еще масса всяких разных нюансов. Мы о них поговорим в следующих видео, если вам будет интересно.

Если вы будете активны в комментариях, лайки и будете ставить, делиться каким-то своим опытом, интересными моментами, которые вы встречаете при работе с API и Тинькофф Инвестициями, то есть, если вы будете активны, то видосы будут продолжаться.

Поэтому, пожалуйста, пишите в комментах, как вам видос, что вам понятно, что непонятно, что раскрыть в следующих видосах, что для вас наиболее важно.

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

Вот, на этом сегодня все. Вам спасибо, что досмотрели. Лайки и дизлайки, вы знаете, что делать. До новых встреч!