Без Tinkoff Invest API ярдәмендә брокерлык отчетлары һәм комиссияләрне исәпләү өчен автоматлаштыру өчен микросервис эшлибез.

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

Tinkoff Investments өчен статистика хезмәтен үстерү өчен илһам бирүчеләр :

Нәрсә турында сөйләшәчәкләр?

  • Developmentсеш турында кулланылган өлеш.
  • Финанс кораллары белән эшләүдә бик мөһим булган чын белем һәм тәҗрибә.
  • Эшләргә тиешле сорауларга күзәтү

Шулай итеп, мин сәүдә статистикасын исәпләргә һәм аны уңайлы итеп эшләргә телим. 

Статистика хезмәтен адым саен үстерү: 

  1. Tinkoff Invest API белән тоташу
  2. Tinkoff Invest API-дан браузерда мәгълүмат алу
  3. Брокерлык отчетларын һәм операцияләрен алу
  4. Кызыклы мәгълүматны исәпләү һәм чыгару
  5. Йомгаклау һәм киләчәккә планнар

Tinkoff Invest API белән тоташу

API’ка тоташу өчен, сез https://github.com/Tinkoff/investAPI#sdk документларыннан теләсә нинди sdk ала аласыз . Яисә npm пакеты ” tinkoff-sdk-grpc-js “. Пакетның уйлап табучылар тарафыннан соңгы версиясенә яңартылуы мөһим. Урнаштыру

npm i tinkoff-sdk-grpc-js

Тикшерү

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

Нәтиҗә: сезнең хисап исемлеге консолда күрсәтеләчәк. Мәсәлән, әйдәгез нюансларны анализлыйк:Без Tinkoff Invest API ярдәмендә брокерлык отчетлары һәм комиссияләрне исәпләү өчен автоматлаштыру өчен микросервис эшлибез.

  • Хисаплар исемлегендә “Инвестиция банкы” бар, алар белән сез API кулланып эшли алмыйсыз
  • Зинһар, онытмагыз, кырлар camelCase белән килә, документларда бу кырлар under_score астында күрсәтелә. 
  • Бу бөтен җирдә дә шулай булачак, шуңа күрә сез документлардан кырны күчереп ала алмыйсыз.

Файдалы:

  • Сез бу кодны проект филиалында таба аласыз

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

Tinkoff Invest API-дан браузерда мәгълүмат алу

Next.js һәм socket.io алдым. Бу көчле тәкъдим түгел, үзегез теләгәнчә сайлагыз. 

npx ясау-киләсе-кушымта @ соңгы npm i socket.io socket.io-клиент

Без шунда ук киләсе + сокет + инвестапи белән дуслык адымына барабыз, һәм барлык детальләр өчен бу адымның  Файдалы бүлеген күрәбез. Мин детальләрне тасвирлыйм: 

  • Nodejs (сервер) ягында битләр / 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 

Файдалы:

  • Киләсе һәм сокетны ничек табарга монда җентекләп сурәтләнгән . 
  • Дуслык коды киләсе + сокет + инвестиция:

https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 aboveгарыда әйтелгәннәр авыр булса, без бу этапта калабыз һәм код белән эш итәбез. Сорауларыгыз булса – сорагыз. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2

Брокерлык отчетларын һәм операцияләрен алу

Брокерлык отчетларын һәм операцияләрен алу өчен өч ысул бар

  1. GetBrokerReport
  2. GetDividendsForeignIssuer
  3. GetOperationsByCursor

Баштан ук белергә кирәк: 

  • Брокерлык отчеты T-3 режимында барлыкка килә, ягъни. сәүдәләр анда башкарылганнан соң күрсәтелә. 
  • Шуңа күрә, соңгы ике көндә бу отчетны сорасагыз, ул өч көн эчендә әзер булачак. 
  • Соңгы көннәрдә операцияләр алу өчен, без операцияләр алу ысулын кулланабыз, ләкин онытмагыз, аларның идентификаторы һәм эчтәлеге брокерлык отчеты ясалганнан соң үзгәрергә мөмкин.

GetBrokerReport

Брокерлык отчеты алу өчен, сез счетның идентификаторын, отчетның башланган көнен һәм тәмамлану көнен алырга тиеш, ләкин 31 көннән артмаска тиеш. Без API’ка _broker_report_request ясау өчен отчет ясау соравын җибәрәбез , җавап итеп биремId алыгыз. Аннан соң, бу taskId кулланып, без _broker_report_response алудан мәгълүмат алабыз .

Димәк, документлар әйтә, чынлыкта нюанслар бар. Кулларыгызны карагыз:

  • TaskIDны бу даталар өчен мәңге сакларга кирәк. 
  • Әгәр дә сез аны югалтсагыз, соралган даталар өчен отчет буын соравына җавап итеп киләчәк, 
  • Аннары ул бөтенләй килмәячәк.

[/ spoiler] Әйдәгез код яза башлыйк

Хәзерге датадан алуны исәпкә алып, датаны алу ысулы

const getDateSubDay = (subDay = 5, start = true) => {     const дата = яңа Дата ();     date.setUTCDate (date.getUTCDate () – subDay);       if (start) {         date.setUTCHours (0, 0, 0, 0);     } else {         date.setUTCHours (23, 59, 59, 999);     }       кайту датасы; };

Буын соравы турында хәбәр итү 

const brokerReport = көтегез (sdk.operations.getBrokerReport) ({         generateBrokerReportRequest: {             accountId,             from,             to,         }, });

Нәтиҗә:

  • Команданың беренче үтәлеше нәтиҗәсендә без taskId алабыз. 
  • Доклад брокер ягында ясала башлый. Ул әзер булганда билгесез, без отчетны көтеп, вакыт-вакыт биреп торабыз.
  • Нигә? Чөнки отчет әзер булмаса, ул хата җибәрә. Әгәр дә доклад брокер ягында булмаса, бу сезнең кодта хата. Зинһар, эшкәртегез: 30058 | INVALID_ARGUMENT | бирем әле тәмамланмаган, зинһар, соңрак кабатлап карагыз

Докладны көтү һәм алу коды моңа охшаган.

const timer = async time =>     new яңа вәгъдә кайтару (чишү => setTimeout (чишү, вакыт)); get   const getBrokerResponseByTaskId = async (taskId, page = 0) => {     сынап карау {         кайтуны көтү (sdk.operations.getBrokerReport) ({             getBrokerReportRequest: {                 taskId,                 бит,             },         });     } тоту (д) {         console.log (‘көтү’, д);         таймерны көтегез (10000);         кайтуны көтегез getBrokerResponseByTaskId (taskId, бит);     } };

Аннары шул ук тылсым була. Без сценарийны туктатабыз, яңадан башлыйбыз, бездә TasId юк. Без кодны taskId соравы белән башкарабыз, ләкин без инде taskId алмыйбыз, ләкин шунда ук отчет. Тылсым! Alwaysәрвакыт шулай булса, барысы да яхшы булыр иде. Ләкин бер айдан бөтенләй мәгълүмат булмаячак. Файдалы :

  • Бераз теория монда һәм монда күрсәтелгән .
  • Кодны бергә туплап, проект шундый булыр.

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

  • Әгәр дә кемдер моны очратса, бу сорауга рәхим итегез . Бу тылсымны төзәткәннән соң, ул көчен югалтачак һәм ничектер башкача булачак. Ләкин хәзерге вакытта (03/21/2023) ул шулай эшли.

GetDividendsForeignIssuer

Кемдер бу ысул элеккесенә охшаган дип уйларга мөмкин, һәм сез бер ысул куллана аласыз, анда сез операция исемен үзгәртәсез. Ләкин алар уйламаганнар!  Анда исем бирү ысулларда да, кайтарылган мәгълүматта да бик төрле. Theәм бит санау 0 дан, аннары 1дән башлана. Боларның барысында буталмас өчен, ике төрле ысул язу җиңелрәк. Бу сәер, чөнки эш логикасы бер үк. Мин бер ысул ясарга тырышканда озак төкердем, код аз иде. Монда мисаллар булмаячак.

GetOperationsByCursor

Минем өчен иң яратканнары. Иң төгәл булмаса да, иң адекват. Хисап язмасы башланганнан алып мөмкин булган максималь көнгә кадәр сорыйбыз (счетны яисә хәзергесен ябу). Без җавап алабыз, курсорны алабыз һәм мәгълүмат булганда кабат сорыйбыз.  Код югарыдагы мисалларга караганда кыскарак.

const timer = async time =>     new яңа вәгъдә кайтару (чишү => setTimeout (чишү, вакыт)); get   const getOperationsByCursor = async (sdk, accountId, from, to, курсор = ”) => {     try {         const reqData = {             accountId,             from,             to,             limit: 1000,             state: sdk.OperationState.OPERATION_STATE_EXECUTED,             Комиссияләрсез: ялган,             сәүдәсез: ялган,             төннәрсез: ялган,             курсор,         };           sdk.operations.getOperationsByCursor көтегез (reqData);     } тоту (д) tim         таймерны көтү (60000);         кайту getOperationsByCursor көтегез (sdk, accountId, дән, курсор = ”);     } };

Эшләү проекты монда: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Хәзер без кабул итү операцияләрен өстәргә әзер. безнең кушымта. Дөрес эшләнсә, счетның барлыгы өчен брокерлык отчетларын алырга кирәк. Theгалган мәгълүматлар өчен, шул ук Т-3ләр, операцияләрдән яңадан йөкләнәләр. Ләкин моны аерым мәкаләгә бүлеп була. Сез очратачак төп нюанслардан клей операцияләрен һәм брокер отчетын ябыштыру.

  •  Бүген сез брокерлык отчеты һәм кирәкле даталар өчен операцияләр алган булсагыз, барысын да мәгълүмат базасына урнаштырыгыз, димәк, проблемалар юк. 
  • Иртәгә сез отчеттан һәм операцияләрдән мәгълүматның чираттагы өлешен алгач һәм аларны булган мәгълүмат базасы белән синхронлаштырырга карар иткәндә проблемалар туачак. 
  • Эшкәртелгәннән соң идентификациянең туры килмәве яки үзгәрүе турында күп нюанслар
  • Аннары OTC базары өчен идентификация бөтенләй туры килми.
  •  Шулай ук ​​синхронизацияләү коралларының нюанслары, кабат туры килми, API үзенчәлекләре аркасында. Ләкин бу тагын бер хикәя.

Әйдәгез, кушымтабызга операцияләр турында мәгълүмат өстик. Төп сорау мәгълүмат кайда эшкәртеләчәк һәм сакланачак.

  •  Әгәр дә сез моны үзегез эшлисез икән, сез төрле җайланмалардан бер үк мәгълүматны кулланырсыз. Аннары сезгә серверда мәгълүмат эшкәртергә һәм сакларга кирәк.
  • Әгәр дә сездә күп төрле кулланучылар кулланган күп төрле мәгълүматлар бар икән, димәк сез мөһимрәк нәрсәне сайларга тиеш: кулланучыларның тизлеге яки сезнең ягыгызда тимерне саклау. Чиксез күләмдә җиһаз ала алган кеше үз серверындагы бар нәрсәне саный һәм аны кулланучылар өчен супер тиз итә, телефоннарда бик мөһим булган батарея һәм трафик кебек кулланучы ресурсларын саклый.

Turnз чиратында, браузерда санау иң оптималь чишелеш түгел. Шуңа күрә кыйммәт булмаган нәрсә, без аны үз серверыбызда саныйбыз. Калганнарын клиентка калдырабыз. Мин чыннан да сервердагы комиссияне алырга һәм исәпләргә телим. Ләкин монда “интерактивлык” дип аталган нюанс килә. Әйтик, сезнең меңләгән операцияләрегез бар һәм аларны кабул итү өчен биш минут вакыт кирәк. Бу вакытта кулланучыда нәрсә булыр? Спиннер? Алга китеш? Инфа күпме йөкләнде? “Актив көтү” куллану идеаль, бу процесста кулланучы берәр нәрсәне күрә алса. Менә Нәтиҗә:Без Tinkoff Invest API ярдәмендә брокерлык отчетлары һәм комиссияләрне исәпләү өчен автоматлаштыру өчен микросервис эшлибез.

  • Битне йөкләү
  • Барлык счет-фактуралар сорала
  • Аннан соң, башкарылган операцияләр өчен комиссияләр белән барлык операцияләр барлык счетлар өчен сорала. Мәгълүматлар кабул ителгәндә, ул браузерда күрсәтелә.

Вакыйгалардагы мәгълүматны фильтрламас өчен, без һәрбер вакыйга өчен үзебезнең вакыйганы тартабыз. Моның кебек:

socket.emit (‘sdk: getOperationsCommissionResult_’ + accountId, {                 әйберләр: мәгълүматлар? .итемнар,                 алга китеш: Булан (киләсе курсор), });

Эшләтеп җибәрү проекты монда: 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 базары

Бу базарның үзенчәлекләре бик күп, шуңа күрә әйдәгез аның өстендә операцияләрне өйрәник. Синхронизация операцияләрен башлагач, инструментка дөрес туры килер өчен, сез бер үк формага фиги / тикер китерергә тиешсез. Сез моны брокерлык отчеты белән синхронлаштыра башлагач, килеп чыгачак, шул ук транзакциянең сәүдә башында операция башында хәрефләр бар һәм алар брокерлык отчетында юк. Шуңа күрә аларны чагыштырып булмый … ахем-ахем … чагыштыру белән! Мин сәүдә вакытына туры килдем, тикер һәм бер tradeId икенчесендә булганга туры килә. Дөрес, белмим. Кем моны очратса һәм кем аның турында кайгыртса, проблемага килегез яки яңасын башлап җибәрегез.Без Tinkoff Invest API ярдәмендә брокерлык отчетлары һәм комиссияләрне исәпләү өчен автоматлаштыру өчен микросервис эшлибез.

Коралларда математик операцияләр

Карамыйча, бөтен исемлек белән математик операцияләр башкару мөмкин түгел. Йомшакка җылылык кертмәс өчен, без һәрвакыт валютаны тикшерәбез һәм эшкәртәбез, валюта туры килүенә ышансак, һәм пунктлар кирәкле валютага әверелә. Банк номерлары белән эшләү турында белемнәр белән коралланган, без һәрбер счетка тотылган комиссияне исәпләячәкбез. Мондый: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4Без Tinkoff Invest API ярдәмендә брокерлык отчетлары һәм комиссияләрне исәпләү өчен автоматлаштыру өчен микросервис эшлибез.    

Микросервис әзер!

https://github.com/pskucherov/tcsstat Өй эше буларак, сез хезмәтнең әкрен тоташу белән эшләвен, тоташу өзелгәндә, Интернет өзелгәндә, брокерның хаталары яки вакыты чикләнгән вакытны тикшерә аласыз. 

Йомгаклау һәм киләчәккә планнар

  • Төп операцияләр һәм Invest API белән эшләү турында белде
  • Вакыт ~ 10 сәгать үткәрде
  • Авырлык дәрәҗәсе ~ кече + / түбән урта 

Әгәр дә сез микросервисны чистартуны дәвам итсәгез, сез мондый әйбер белән тәмамланырга мөмкин

https://opexbot.info

  Бу минем үсешем, аңларга, йөгерергә һәм үзләренә ышанырга бик ялкау кешеләр өчен. Анда кулланучылар соравы буенча аналитика өстәргә уйлыйм. Сезгә мәкалә ошаса, минем телеграмма каналына язылу . Без Tinkoff Invest API ярдәмендә брокерлык отчетлары һәм комиссияләрне исәпләү өчен автоматлаштыру өчен микросервис эшлибез.

Pavel
Rate author
Add a comment

  1. Isakiiev

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

    Reply