Мо бо истифода аз Tinkoff Invest API барои автоматикунонии кор бо ҳисоботи брокерӣ ва ҳисобкунии комиссияҳо хидматрасонии хурд таҳия карда истодаем.

Программирование

Илҳомбахшони рушди хадамоти оморӣ барои Tinkoff Investments инҳо буданд:

Чӣ муҳокима хоҳад шуд?

  • Танҳо қисми татбиқшаванда дар бораи рушд.
  • Дониш ва таҷрибаи воқеӣ, ки дар кор бо асбобҳои молиявӣ хеле муҳиманд.
  • Баррасии масъалаҳое, ки бояд рӯи онҳо кор кунанд

Ҳамин тавр, ман мехоҳам омори савдоро ҳисоб кунам ва онро ба таври мувофиқ иҷро кунам. 

Қадам ба қадам таҳияи хадамоти оморӣ: 

  1. Пайвастшавӣ ба Tinkoff Invest API
  2. Гирифтани маълумот аз Tinkoff Invest API дар браузер
  3. Гирифтани ҳисоботи брокерӣ ва муомилот
  4. Ҳисоб кардан ва баровардани иттилооти манфиатдор
  5. Хулоса ва накшахои оянда

Пайвастшавӣ ба Tinkoff Invest API

Барои пайваст шудан ба API, шумо метавонед ҳама гуна SDK-ро аз ҳуҷҷатҳои https://github.com/Tinkoff/investAPI#sdk гиред . Ё бастаи npm ` tinkoff-sdk-grpc-js `. Муҳим аст, ки баста аз ҷониби таҳиягарон ба версияи охирин нав карда шавад. Насб кунед

npm i tinkoff-sdk-grpc-js

Санҷиш

const {createSdk } = талаб (‘tinkoff-sdk-grpc-js’);   // Токенеро, ки ба ин монанд  ба даст овардан мумкин аст const TOKEN = ‘YOURAPI’;   // Номи барномае, ки тавассути он шуморо дар гузоришҳои TCS пайдо кардан мумкин аст. const appName = ‘tcsstat’;   const sdk = createSdk(TOKEN, appName); (async () => {     console.log( интизори sdk.users.getAccounts()); })();

Натиҷа: рӯйхати ҳисобҳои шумо дар консол намоиш дода мешавад. Масалан, биёед нозукиҳоро таҳлил кунем:Мо бо истифода аз Tinkoff Invest API барои автоматикунонии кор бо ҳисоботи брокерӣ ва ҳисобкунии комиссияҳо хидматрасонии хурд таҳия карда истодаем.

  • Дар рӯйхати суратҳисобҳо “Бонки сармоягузорӣ” мавҷуд аст, ки шумо бо истифода аз API кор карда наметавонед
  • Лутфан таваҷҷӯҳ намоед, ки майдонҳо дар camelCase ворид мешаванд, дар ҳоле ки дар ҳуҷҷатҳо ин майдонҳо дар зери_баҳо оварда шудаанд. 
  • Ин дар ҳама ҷо чунин хоҳад буд, бинобар ин шумо наметавонед танҳо майдонро аз ҳуҷҷатҳо гирифта нусхабардорӣ кунед.

Муфид:

  • Шумо метавонед ин кодро дар филиали лоиҳа пайдо кунед

https://github.com/pskucherov/tcsstat/tree/step1 https://github.com/pskucherov/tcsstat/compare/step1   

Гирифтани маълумот аз Tinkoff Invest API дар браузер

Ман next.js ва socket.io гирифтам. Ин як тавсияи қавӣ нест, мувофиқи салоҳдиди худ интихоб кунед. 

npx create-next-app@latest npm ва socket.io socket.io-client

Мо фавран ба қадами дӯстии next+socket+investapi мегузарем ва барои ҳама тафсилот  қисмати муфиди ин қадамро бубинем. Ман тафсилотро тавсиф мекунам: 

  • Дар тарафи nodejs (сервер) файли pages/api/investapi.js мавҷуд аст. Дар ин ҷо мо сервери socket.io эҷод мекунем ва ба investapi пайваст мешавем.
  • Дар тарафи браузер (муштарӣ) мо ба сервер тавассути розетка пайваст мешавем ва аз брокер маълумоти ҳисобро талаб мекунем. 
  • Мо маълумотро аз брокер дар сервер мегирем ва сипас онро ба муштарӣ мефиристем. Вақте ки онҳо дар муштарӣ қабул карда мешаванд, онҳо дар браузер нишон дода мешаванд. 

Натиҷа:  дар консоли браузер мо метавонем маълумотро дар бораи ҳисобҳо бубинем. Яъне, дар марҳилаи охирин, мо маълумотро дар бораи ҳисобҳо дар консоли сервер (nodejs) дидем, дар қадами ҷорӣ мо ин маълумотро ба муштарӣ (браузер) интиқол додем.

Мо бо истифода аз Tinkoff Invest API барои автоматикунонии кор бо ҳисоботи брокерӣ ва ҳисобкунии комиссияҳо хидматрасонии хурд таҳия карда истодаем.

Акнун биёед онро тавре кунем, ки шумо метавонед ҳисобро аз браузер интихоб кунед ва агар ягон нишона мавҷуд набошад, хатогӣ ба консол фиристода мешавад. Кор оддӣ аст ва ҳеҷ чизи нав нест, бинобар ин ман танҳо истинодҳоро ба ӯҳдадориҳо медиҳам

  1. https://github.com/pskucherov/tcsstat/commit/7e1ac57061e5e971588479015b06d8814d6609a9
  2. https://github.com/pskucherov/tcsstat/commit/b28ac973a57494f5232589b4cb6b9fb13b8af759 

Муфид:

  • Чӣ тавр ба дӯстони оянда ва васлаки дар ин ҷо ба таври муфассал тавсиф карда мешавад . 
  • Рамзи дӯстӣ next+socket+investapi:

https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Барои онҳое, ки дар боло гуфта шудааст, душвор аст, пас мо дар ин марҳила мемонем ва бо рамз сарукор дорем. Агар шумо савол дошта бошед – пурсед. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2

Гирифтани ҳисоботи брокерӣ ва муомилот

Се роҳи гирифтани ҳисоботи брокерӣ ва муомилот вуҷуд дорад

  1. GetBrokerReport
  2. Гирифтани дивидендҳои хориҷӣ
  3. GetOperationsByCursor

Аз аввал донистани он муҳим аст: 

  • Ҳисоботи брокерӣ дар реҷаи Т-3 тавлид мешавад, яъне. савдо пас аз иҷрои воқеии он ҷо намоиш дода мешавад. 
  • Мувофиқи он, агар шумо ин гузоришро дар ду рӯзи охир дархост кунед, пас аз се рӯз омода мешавад. 
  • Барои ба даст овардани транзаксияҳо дар рӯзҳои охир, мо усули гирифтани транзаксияҳоро истифода мебарем, аммо дар хотир доред, ки ID ва мундариҷаи онҳо пас аз таҳияи ҳисоботи брокерӣ метавонанд тағир ёбанд.

GetBrokerReport

Барои гирифтани ҳисоботи брокерӣ, шумо бояд ID ҳисоб, санаи оғоз ва санаи анҷоми ҳисоботро гиред, аммо на бештар аз 31 рӯз. Мо дархостро барои тавлиди гузориш ба API дар тавлиди _broker_report_request мефиристем , дар посух taskId гиред. Пас аз он, бо истифода аз ин taskId, мо аз get _broker_report_response маълумот мегирем .

Дар ҳуҷҷатҳо гуфта мешавад, ки дар асл нозукиҳо мавҷуданд. Дастҳои худро нигоҳ доред:
  • Шумо бояд TaskID-ро то абад маҳз барои ин санаҳо захира кунед. 
  • Азбаски агар шумо онро гум кунед, пас барои санаҳои дархостшуда гузориш аввал дар посух ба дархости насл меояд, 
  • Ва он гоҳ он тамоман намеояд.
Биёед ба навиштани код шурӯъ кунем

Усули гирифтани сана бо назардошти тарҳ аз санаи ҷорӣ

const getDateSubDay = (subDay = 5, оғоз = ҳақиқӣ) => {     санаи const = Санаи нав ();     date.setUTCDate(date.getUTCDate() – subDay);       агар (оғоз) {         date.setUTCHours(0, 0, 0, 0);     } else {         date.setUTCHours(23, 59, 59, 999);     }       санаи бозгашт; };

Дархости тавлиди гузориш 

const brokerReport = интизор аст (sdk.operations.getBrokerReport) ({         generBrokerReportRequest: {             accountId,             аз,             ба,         }, });

Натиҷа:

  • Дар натиҷаи иҷрои якуми фармон мо taskId мегирем. 
  • Ҳисобот аз ҷониби брокер таҳия карда мешавад. Вақте ки он омода аст, номаълум аст, мо интизор мешавем ва давра ба давра taskId-ро бо интизории гузориш мекашем.
  • Чаро? Зеро агар гузориш омода набошад, хатогӣ медиҳад. Агар гузориш аз ҷониби брокер омода набошад, пас ин хато дар коди шумост. Лутфан коркард кунед: 30058|INVALID_ARGUMENT|вазифа ҳанӯз иҷро нашудааст, лутфан дертар такрор кунед

Рамзи интизорӣ ва гирифтани гузориш чунин ба назар мерасад.

const timer = time async => {     Баргардонидани ваъдаи нав (ҳал кардан => setTimeout (ҳал кардан, вақт)); }   const getBrokerResponseByTaskId = асинхрон (taskId, саҳифа = 0) => {     кӯшиш кунед {         бозгашт интизор шавед (sdk.operations.getBrokerReport) ({             getBrokerReportRequest: {                 taskId,                 саҳифа,             },         });     } catch (e) {         console.log(‘интизор шавед’, д);         Вақтсанҷи интизорӣ (10000);         бозгашт интизор шавед getBrokerResponseByTaskId(taskId, саҳифа);     } };

Он гоҳ ҳамон ҷодугарӣ рӯй медиҳад. Мо скрипти худро қатъ мекунем, онро аз нав оғоз мекунем, мо taskId надорем. Мо кодро бо дархости taskId иҷро мекунем, аммо мо дигар на taskId, балки фавран гузоришро мегирем. Ҷодугарӣ! Ва агар ҳамеша ҳамин тавр мебуд, ҳамааш хуб мешуд. Аммо пас аз як моҳ ҳеҷ маълумоте нахоҳад буд. Муфид :

  • Дар ин ҷо ва дар ин ҷо каме назария оварда шудааст .
  • Якҷоя кардани кодекс, лоиҳа чунин менамояд.

https://github.com/pskucherov/tcsstat/tree/step3.1 https://github.com/pskucherov/tcsstat/compare/step3.1

  • Агар касе бо ин рӯ ба рӯ шавад, пас ба ин масъала хуш омадед . Пас аз он ки онҳо ин ҷодуро таъмир мекунанд, он қудрати худро гум мекунад ва ба навъе дигар мешавад. Аммо дар айни замон (03/21/2023) он ҳамон тавр кор мекунад.

Гирифтани дивидендҳои хориҷӣ

Шояд касе фикр кунад, ки ин усул ба усули қаблӣ монанд аст ва шумо метавонед як усули ягонаеро истифода баред, ки дар он шумо танҳо номи амалҳоро иваз мекунед. Аммо онҳо гумон накарданд!  Номгузорӣ дар он ҷо ҳам дар усулҳо ва ҳам дар маълумоти баргардонидашуда хеле фарқ мекунад. Ва шумори саҳифаҳо аз 0 оғоз мешавад, баъд аз 1. Барои он ки дар ин ҳама ошуфта нашавед, навиштани ду усули гуногун осонтар аст. Ки аҷиб аст, зеро мантики кор хамин аст. Ман муддати дароз туф кардам, вақте ки ман кӯшиш кардам, ки як усулро созам ва код камтар буд. Дар ин ҷо ҳеҷ гуна мисолҳо вуҷуд надоранд.

GetOperationsByCursor

Дӯстдоштаи ман аз се. Ҳарчанд дақиқтарин нест, аммо мувофиқтарин. Мо дархостро аз оғози эҷоди ҳисоб то санаи ҳадди имкон (пӯшонидани ҳисоб ё ҳисоби ҷорӣ) пешниҳод мекунем. Мо ҷавоб мегирем, курсорро гирифта, то даме ки маълумот мавҷуд аст, дубора дархост мекунем.  Ва рамз нисбат ба мисолҳои дар боло овардашуда мухтасартар аст.

const timer = time async => {     Баргардонидани ваъдаи нав (ҳал кардан => setTimeout (ҳал кардан, вақт)); }   const getOperationsByCursor = асинхронӣ (sdk, accountId, аз, ба, курсор = ”) => {     кӯшиш кунед {         const reqData = {             accountId,             аз,             то,             маҳдуд: 1000,             ҳолат: sdk.OperationState.OPERATION_STATE_EXECUTED,             бидуни Комиссияҳо:             withoutTrades: false,             withoutOvernights: бардурӯғ,             курсор,         };           бозгашт интизори sdk.operations.getOperationsByCursor(reqData);     } catch (e) {         таймерро интизор шавед (60000);         бозгашт интизори getOperationsByCursor(sdk, accountId, аз, ба, курсор = ”);     } };

Лоиҳаи иҷрошаванда дар ин ҷост: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Ҳоло мо омодаем амалиёти қабулро ба аризаи мо. Агар дуруст анҷом дода шуда бошад, пас шумо бояд барои тамоми мавҷудияти ҳисоб ҳисоботи брокерӣ гиред. Ва барои маълумоти гумшуда, ҳамон T-3s, аз амалиёт дубора бор кунед. Аммо инро метавон ба мақолаи алоҳида ҷудо кард. Аз нозукиҳои асосӣ, ки шумо дучор хоҳед шуд, ин ширеш кардани амалиёт ва ҳисоботи брокерӣ мебошад.

  •  Агар шумо имрӯз ҳисоботи брокерӣ ва амалиётро барои санаҳои зарурӣ гирифта бошед, ҳамаашро дар базаи маълумот ҷойгир кунед, пас ҳеҷ мушкиле вуҷуд надорад. 
  • Вақте ки шумо қисмати навбатии маълумотро аз ҳисобот ва амалиётҳо қабул мекунед ва қарор мекунед, ки онҳоро бо пойгоҳи додаҳои мавҷуда ҳамоҳанг созед, фардо шумо мушкилот хоҳед дошт. 
  • Бисёр нозукиҳо дар бораи номувофиқӣ ё тағир додани ID пас аз коркард
  • Пас, барои бозори OTC, id тамоман мувофиқат намекунад.
  •  Инчунин нозукиҳои асбобҳои синхронизатсия, ки бо сабаби хусусиятҳои API боз ҳам мувофиқат намекунанд. Аммо ин ҳикояи дигар аст.

Биёед ба замимаи мо маълумотро дар бораи амалиёт илова кунем. Саволи асосӣ ин аст, ки маълумот дар куҷо коркард ва нигоҳ дошта мешавад.

  •  Агар шумо ин корро барои худ кунед, шумо ҳамон маълумотро аз дастгоҳҳои гуногун истеъмол мекунед. Пас шумо бояд маълумотро дар сервер коркард ва нигоҳ доред.
  • Агар шумо маълумоти зиёде дошта бошед, ки аз ҷониби корбарони гуногун истеъмол карда мешаванд, пас шумо бояд қарор кунед, ки кадомаш муҳимтар аст: суръати корбарон ё сарфаи оҳан дар паҳлӯи шумо. Ҳар кӣ метавонад миқдори беохири сахтафзорро харидорӣ кунад, ҳама чизро дар сервери худ ҳисоб мекунад ва онро барои корбарон хеле зуд месозад ва захираҳои корбарро, ба монанди батарея ва трафикро сарфа мекунад, ки дар телефонҳо хеле муҳим аст.

Дар навбати худ, ҳисоб кардан дар браузер усули беҳтарин ҳалли беҳтарин нест. Аз ин рӯ, он чизе ки қимат нест, мо онро дар сервери худ баррасӣ мекунем. Мо боқимондаро ба ихтиёри муштарӣ мегузорем. Ман дар ҳақиқат мехоҳам комиссияро дар сервер бигирам ва ҳисоб кунам. Аммо дар ин ҷо нозуки бо номи “интерактивӣ” меояд. Фарз мекунем, ки шумо ҳазорҳо амалиёт доред ва барои қабули онҳо панҷ дақиқа вақт лозим аст. Дар ин вақт корбар чӣ хоҳад дошт? Спиннер? Пешравӣ? Infa дар бораи чӣ қадар бор карда шуд? Истифодаи “интизории фаъол” беҳтарин аст, вақте ки корбар дар ин раванд аллакай чизеро дида метавонад. Ин аст натиҷа:Мо бо истифода аз Tinkoff Invest API барои автоматикунонии кор бо ҳисоботи брокерӣ ва ҳисобкунии комиссияҳо хидматрасонии хурд таҳия карда истодаем.

  • Боркунии саҳифа
  • Ҳама ҳисобнома-фактураҳо дархост карда мешаванд
  • Баъд аз ин, барои ҳамаи суратҳисобҳо ҳамаи амалиётҳо бо комиссияҳо барои амалиёти иҷрошуда талаб карда мешаванд. Вақте ки маълумот қабул карда мешавад, он дар браузер дода мешавад.

Барои он ки ҳар дафъа маълумотро дар рӯйдодҳо филтр накунед, мо барои ҳар як ҳисоб рӯйдоди шахсии худро мекашем. Монанди ин:

socket.emit(‘sdk:getOperationsCommissionResult_’ + accountId, {                 element: data?.items,                 inProgress: Boolean(nextCursor), });

Лоиҳаи оғозёбӣ дар ин ҷост: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Давом дорад. Хеле хуб аст, ки шумо ин сатрро хондаед! 

Ҳисоб кардан ва баровардани иттилооти манфиатдор

Аз он вобаста аст, ки ба кӣ ба кадом маълумот ниёз дорад. Аз ин рӯ, ман фавран ба шумо нозукиҳои асосиеро мегӯям, ки шумо бо онҳо дучор мешавед.

Кор бо нархҳо 

Ҳар касе, ки бо молия кор мекунад, медонад, ки амалиёти пулӣ бояд танҳо бо рақамҳои пурра анҷом дода шавад. Аз сабаби нодурустии арзишҳо пас аз нуқтаи даҳӣ ва хатои ҷамъшуда бо шумораи зиёди амалиётҳо. Аз ин рӯ, ҳамаи нархҳо дар формати зерини MoneyValue пешниҳод карда мешавандМо бо истифода аз Tinkoff Invest API барои автоматикунонии кор бо ҳисоботи брокерӣ ва ҳисобкунии комиссияҳо хидматрасонии хурд таҳия карда истодаем.

майдоннавъиТавсифи
асъорсатрСатри рамзи асъори ISO
воҳидҳоint64Қисми бутуни ҷамъ метавонад рақами манфӣ бошад
наноint32Қисми касри маблағ метавонад рақами манфӣ бошад

Мо онҳоро алоҳида коркард мекунем ва сипас онҳоро ба арзиши нарх меорем:

quotation.units + quotation.nano / 1e9

Арзиши шартномаҳои фьючерсӣ

Нархи фьючерсҳо бо нуқтаҳо пешниҳод карда мешаванд, вақте ки шумо ояндаи асъор доред, шумо бояд қурбро донед. Ва албатта нарх дар нуқтаҳо ва қадами нарх. Вақте, ки шумо ҳисоб фоида аз амалиёти, ин метавонад тир, зеро. агар шумо маблаги умумиро бо рохи зарб кардани нарх ба микдор хисоб кунед. Дар ин ҷо шумо бояд эҳтиёт бошед. Ҳоло мо мебинем, ки ин чӣ гуна аст. Ин ба фьючерсҳои асъор дахл дорад, дар дигар ҷойҳо бо ин ҳама чиз хуб аст.Мо бо истифода аз Tinkoff Invest API барои автоматикунонии кор бо ҳисоботи брокерӣ ва ҳисобкунии комиссияҳо хидматрасонии хурд таҳия карда истодаем.Мо бо истифода аз Tinkoff Invest API барои автоматикунонии кор бо ҳисоботи брокерӣ ва ҳисобкунии комиссияҳо хидматрасонии хурд таҳия карда истодаем.

Бозори OTC

Ин бозор хусусиятҳои зиёде дорад, бинобар ин биёед амалиёти онро дар алоҳидагӣ омӯзем.Вақте ки шумо синхронизатсияи амалиётҳоро оғоз мекунед, маълум мешавад, ки шумо бояд figi/ticker-ро ба ҳамон шакл оваред, то ки асбобро дуруст мувофиқ созед. Вақте ки шумо ҳамоҳангсозии онро бо ҳисоботи брокерӣ оғоз мекунед, маълум мешавад, ки савдои ID-и ҳамон транзаксия дар ибтидо дар муомилот ҳарфҳо дорад ва онҳо дар ҳисоботи брокерӣ нестанд. Аз ин рў, онњоро муќоиса кардан мумкин нест… ањем-ањем… бо муќоиса! Ман вақти савдо, тикер ва мувофиқат кардам, ки як савдо ID дар дигараш мавҷуд аст. Дуруст, ман намедонам. Ҳар касе, ки бо ин рӯ ба рӯ мешавад ва ба он ғамхорӣ мекунад, ба ин масъала биёед ё масъалаи навро оғоз кунед.Мо бо истифода аз Tinkoff Invest API барои автоматикунонии кор бо ҳисоботи брокерӣ ва ҳисобкунии комиссияҳо хидматрасонии хурд таҳия карда истодаем.

Амалиёти математикӣ дар асбобҳо

Бо тамоми рӯйхат амалҳои математикиро бидуни ҷустуҷӯ иҷро кардан ғайриимкон аст. Барои он ки гарм ба нарм илова нашавад, мо ҳамеша асъорро тафтиш мекунем ва танҳо агар боварӣ ҳосил кунем, ки асъор мувофиқат кунад ва нуқтаҳо ба асъори дилхоҳ табдил дода шаванд. Бо дониш дар бораи кор бо рақамҳои бонкӣ, мо комиссияи барои ҳар як суратҳисоб сарфшударо ҳисоб мекунем. Мисли ин: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4Мо бо истифода аз Tinkoff Invest API барои автоматикунонии кор бо ҳисоботи брокерӣ ва ҳисобкунии комиссияҳо хидматрасонии хурд таҳия карда истодаем.   

Microservice омода аст!

https://github.com/pskucherov/tcsstat Ҳамчун вазифаи хонагӣ, шумо метавонед тафтиш кунед, ки оё хидмат бо пайвасти суст кор мекунад, ҳангоми канда шудани пайвастҳо, ҳангоми қатъ шудани интернет, ҳангоми хатогиҳо ё маҳдудиятҳои мӯҳлати аз ҷониби брокер гузаштан. 

Хулоса ва накшахои оянда

  • Дар бораи амалиётҳои асосӣ ва кор бо Invest API омӯхтаед
  • Вақти сарфшуда ~ 10 соат
  • Сатҳи душворӣ ~ хурдсол+ / миёна паст 

Агар шумо такмилдиҳии микросервисро идома диҳед, шумо метавонед бо чунин чизе дучор шавед

https://opexbot.info

  Ин рушди ман аст, барои онҳое, ки барои фаҳмидан, давидан ва ҳисоб кардани худ танбал ҳастанд. Ман нақша дорам, ки бо дархости корбарон ба он ҷо таҳлил илова кунам. Агар мақола ба шумо маъқул шуда бошад, пас ба канали телеграмм обуна шавед . Мо бо истифода аз Tinkoff Invest API барои автоматикунонии кор бо ҳисоботи брокерӣ ва ҳисобкунии комиссияҳо хидматрасонии хурд таҳия карда истодаем.

Pavel
Rate author
Add a comment

  1. Isakiiev

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

    Reply