Qed niżviluppaw mikroservizz billi nużaw l-API Tinkoff Invest biex nawtomatizzaw ix-xogħol b’rapporti ta’ senserija u nikkalkulaw il-kummissjonijiet.

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

L-ispiraturi wara l-iżvilupp tas -servizz tal-istatistika għal Tinkoff Investments kienu:

X’se jiġi diskuss?

  • Biss il-parti applikata dwar l-iżvilupp.
  • Għarfien u esperjenza reali, li huma importanti ħafna fil-ħidma ma ‘strumenti finanzjarji.
  • Ħarsa ġenerali lejn kwistjonijiet li trid taħdem fuqhom

Għalhekk, irrid nikkalkula l-istatistika tal-kummerċ u nagħmilha b’mod konvenjenti. 

L-iżvilupp ta’ servizz tal-istatistika pass pass: 

  1. Konnessjoni ma’ Tinkoff Invest API
  2. Tpinġija tad-dejta minn Tinkoff Invest API fi browser
  3. Jirċievu rapporti ta’ senserija u tranżazzjonijiet
  4. Kalkolu u output ta’ informazzjoni ta’ interess
  5. Konklużjonijiet u pjanijiet għall-futur

Konnessjoni ma’ Tinkoff Invest API

Biex tikkonnettja mal-API, tista ‘tieħu kwalunkwe sdk mid-dokumentazzjoni https://github.com/Tinkoff/investAPI#sdk . Jew pakkett npm ` tinkoff-sdk-grpc-js `. Huwa importanti li l-pakkett jiġi aġġornat għall-aħħar verżjoni mill-iżviluppaturi. Installa

npm i tinkoff-sdk-grpc-js

Iċċekkjar

const { createSdk } = require(‘tinkoff-sdk-grpc-js’);   // Token li jista’ jinkiseb bħal dan  const TOKEN = ‘YOURAPI’;   // L-isem tal-applikazzjoni li biha tista’ tinstab fir-reġistri tat-TCS. const appName = ‘tcsstat’;   const sdk = createSdk(TOKEN, appName); (async () => {     console.log (stenna sdk.users.getAccounts ()); }) ();

Riżultat: lista tal-kontijiet tiegħek se tintwera fil-console. Per eżempju, ejja nanalizzaw l-sfumaturi:Qed niżviluppaw mikroservizz billi nużaw l-API Tinkoff Invest biex nawtomatizzaw ix-xogħol b'rapporti ta' senserija u nikkalkulaw il-kummissjonijiet.

  • Fil-lista ta ‘kontijiet hemm “Bank ta’ Investiment”, li miegħu ma tistax taħdem bl-użu tal-API
  • Jekk jogħġbok innota li l-fields jiġu f’camelCase, filwaqt li fid- dokumentazzjoni dawn l-oqsma huma ppreżentati f’under_score. 
  • Se jkun bħal dan kullimkien, għalhekk ma tistax sempliċement tieħu u tikkopja qasam mid-dokumentazzjoni.

Utli:

  • Tista ‘ssib dan il-kodiċi fil-fergħa tal-proġett

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

Tpinġija tad-dejta minn Tinkoff Invest API fi browser

Ħadt next.js u socket.io. Din mhix rakkomandazzjoni qawwija, agħżel fid-diskrezzjoni tiegħek. 

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

Immedjatament nipproċedu għall-pass tal-ħbiberija li jmiss+socket+investapi, u ara t- taqsima Utli ta ‘dan il-pass għad-dettalji kollha.  Jien ser niddeskrivi d-dettalji: 

  • Fuq in-naħa nodejs (server), hemm fajl pages/api/investapi.js. Dan huwa fejn noħolqu s-server socket.io u nikkonnettjaw ma ‘investipi.
  • Fuq in-naħa tal-browser (klijent), aħna nikkonnettjaw mas-server permezz ta ‘socket u nitolbu dejta tal-kont mingħand is-sensar. 
  • Nirċievu data mis-sensar fuq is-server, imbagħad nibagħtuha lill-klijent. Meta jiġu riċevuti fuq il-klijent, jintwerew fil-browser. 

Riżultat:  fil-console tal-browser nistgħu naraw informazzjoni dwar il-kontijiet. Jiġifieri, fl-aħħar pass, rajna informazzjoni dwar il-kontijiet fil-console tas-server (nodejs), fil-pass attwali, ittrasferijna din l-informazzjoni lill-klijent (browser).

Qed niżviluppaw mikroservizz billi nużaw l-API Tinkoff Invest biex nawtomatizzaw ix-xogħol b'rapporti ta' senserija u nikkalkulaw il-kummissjonijiet.

Issa ejja nagħmluha sabiex inti tista ‘tagħżel kont mill-browser, u jekk ma jkunx hemm token, allura żball jintbagħat lill-console. Ix-xogħol huwa sempliċi u xejn ġdid, għalhekk nagħti biss links għal commits

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

Utli:

  • Kif tagħmel ħbieb li jmiss u socket huwa deskritt fid-dettall hawn
  • Kodiċi tal-ħbiberija li jmiss+socket+investapi:

https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Għal min dak ta ‘hawn fuq huwa diffiċli, allura nibqgħu f’dan l-istadju u nittrattaw il-kodiċi. Jekk għandek mistoqsijiet – staqsi. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2

Jirċievu rapporti ta’ senserija u tranżazzjonijiet

Hemm tliet metodi biex tirċievi rapporti ta ‘senserija u tranżazzjonijiet

  1. GetBrokerReport
  2. GetDividendsForeignIssuer
  3. GetOperationsByCursor

Mill-bidu nett huwa importanti li tkun taf: 

  • Ir-rapport tas-senserija huwa ġġenerat fil-mod T-3, i.e. snajja huma murija hemm wara l-eżekuzzjoni attwali tagħhom. 
  • Għaldaqstant, jekk titlob dan ir-rapport għall-aħħar jumejn, ikun lest fi tlett ijiem. 
  • Biex nagħmlu ftehimiet għall-aħħar jiem, nużaw il-metodu biex nirċievu operazzjonijiet, iżda ftakar li l-id u l-kontenut tagħhom jistgħu jinbidlu wara l-formazzjoni tar-rapport tas-senserija.

GetBrokerReport

Biex tikseb rapport ta ‘senserija, trid tieħu l-id tal-kont, id-data tal-bidu u d-data tat-tmiem tar-rapport, iżda mhux aktar minn 31 jum. Aħna nibagħtu talba biex niġġeneraw rapport lill-API f’ġenera _broker_report_request , nikseb taskId bħala tweġiba. Wara dan, bl-użu ta’ dan it-taskId, inġibu dejta minn get _broker_report_response.

Allura d-dokumentazzjoni tgħid, fir-realtà hemm sfumaturi. Oqgħod idejk:

  • Trid issalva t-TaskID għal dejjem eżattament għal dawn id-dati. 
  • Peress li jekk titlifha, allura għad-dati mitluba r-rapport l-ewwel jiġi bi tweġiba għat-talba tal-ġenerazzjoni, 
  • U allura ma tiġi xejn.

Ejja nibdew niktbu l-kodiċi

Metodu biex tinkiseb id-data, b’kont meħud tat-tnaqqis mid-data kurrenti

const getDateSubDay = (subDay = 5, start = true) => {     const data = data ġdida ();     data.setUTCDate(date.getUTCDate() – subDay);       if (bidu) {         date.setUTCHours (0, 0, 0, 0);     } inkella {         date.setUTCHours (23, 59, 59, 999);     }       data tar-ritorn; };

Talba għall-ġenerazzjoni tar-rapport 

const brokerReport = await (sdk.operations.getBrokerReport) ({         generateBrokerReportRequest: {             accountId,             from,             to,         }, });

Riżultat:

  • Bħala riżultat tal-ewwel eżekuzzjoni tal-kmand, irridu nġibu l-taskId. 
  • Ir-rapport jibda jiġi ġġenerat min-naħa tas-sensar. Meta tkun lesta mhix magħrufa, nistennew u perjodikament iġbed it-taskId b’antiċipazzjoni tar-rapport.
  • Għaliex? Għax jekk ir-rapport ma jkunx lest, jitfa’ żball. Jekk ir-rapport mhuwiex lest min-naħa tas-sensar, allura dan huwa żball fil-kodiċi tiegħek. Jekk jogħġbok ipproċessa: 30058|INVALID_ARGUMENT|kompitu għadu mhux lest, jekk jogħġbok erġa’ pprova aktar tard

Il-kodiċi biex wieħed jistenna u jirċievi rapport jidher xi ħaġa bħal din.

const timer = async time => {     ritorn Wegħda ġdida (isolvu => setTimeout (issolvi, ħin)); }   const getBrokerResponseByTaskId = async (taskId, paġna = 0) => {     ipprova {         return await (sdk.operations.getBrokerReport) ({             getBrokerReportRequest: {                 taskId,                 paġna,             },         });     } qabda (e) {         console.log(‘stenna’, e);         tistenna timer(10000);         ritorn stenna getBrokerResponseByTaskId (taskId, paġna);     } };

Imbagħad isseħħ l-istess maġija. Nwaqqfu l-iskript tagħna, nibdew mill-ġdid, m’għandniex taskId. Aħna tesegwixxi l-kodiċi bit-talba taskId, iżda ma nibqgħux niksbu l-taskId, iżda immedjatament ir-rapport. Magic! U kollox ikun tajjeb kieku dejjem kien hekk. Iżda fi żmien xahar mhux se jkun hemm data. Utli :

  • Ftit ta ‘teorija hija deskritta hawn u hawn .
  • Meta tpoġġi l-kodiċi flimkien, l-abbozz se jidher xi ħaġa bħal din.

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

  • Jekk xi ħadd jiltaqa ‘ma’ dan, allura merħba għall -kwistjoni . Wara li jsewwu din il-maġija, titlef il-qawwa tagħha u tkun b’xi mod differenti. Iżda fil-mument attwali (03/21/2023) taħdem eżatt hekk.

GetDividendsForeignIssuer

Xi ħadd jista ‘jaħseb li l-metodu huwa simili għal dak preċedenti u tista’ tuża metodu wieħed li fih tibdel biss l-isem tal-operazzjonijiet. Iżda huma ma raden!  L-ismijiet hemm differenti ħafna kemm fil-metodi kif ukoll fl-informazzjoni mibgħuta lura. U l-għadd tal-paġna jibda minn 0, imbagħad minn 1. Sabiex ma titħawwadx f’dan kollu, huwa aktar faċli li tikteb żewġ metodi differenti. Li hija stramba, għaliex il-loġika tax-xogħol hija l-istess. Bżież għal żmien twil meta ppruvajt nagħmel metodu wieħed u kien hemm inqas kodiċi. Mhux se jkun hemm eżempji hawn.

GetOperationsByCursor

Il-favorit tiegħi mit-tlieta. Għalkemm mhux l-aktar preċiż, iżda l-aktar adegwat. Aħna nagħmlu talba mill-bidu tal-ħolqien ta ‘kont sad-data massima possibbli (l-għeluq ta’ kont jew dak attwali). Nirċievu t-tweġiba, nieħdu l-cursor u nitolbu mill-ġdid sakemm ikun hemm data.  U l-kodiċi huwa aktar konċiż milli fl-eżempji ta ‘hawn fuq.

const timer = async time => {     ritorn Wegħda ġdida (isolvu => setTimeout (issolvi, ħin)); }   const getOperationsByCursor = async (sdk, accountId, from, to, cursor = ”) => {     ipprova {         const reqData = {             accountId,             from,             to,             limit: 1000,             state: sdk.OperationState.OPERATION_STATE_EXECUTED,             withoutCommissions: false,             mingħajrTrades: falza,             mingħajrOvernights: falza,             cursor,         };           ritorn stenna sdk.operations.getOperationsByCursor(reqData);     } qabda (e) {         await timer (60000);         return await getOperationsByCursor (sdk, accountId, from, to, cursor = ”);     } };

L-abbozz li jrid imexxi jinsab hawn: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Issa aħna lesti li nżidu l-operazzjonijiet ta’ riċeviment ma’ l-applikazzjoni tagħna. Jekk isir b’mod korrett, allura għandek bżonn tikseb rapporti ta ‘senserija għall-eżistenza kollha tal-kont. U għad-dejta nieqsa, dawk l-istess T-3s, jerġgħu jitgħabbew mill-operazzjonijiet. Iżda dan jista ‘jiġi separat f’artikolu separat. Ta ‘l-sfumaturi ewlenin li se tiltaqa’ magħhom huwa li twaħħal operazzjonijiet u rapport ta ‘senserija.

  •  Jekk illum irċevejt rapport ta ‘senserija u tranżazzjonijiet għad-dati meħtieġa, poġġih kollu fid-database, allura ma jkunx hemm problemi. 
  • Int ser ikollok problemi għada meta tirċievi l-porzjon ta ‘data li jmiss mir-rapport u l-operazzjonijiet u tiddeċiedi li tissinkronizzahom mad-database eżistenti. 
  • Ħafna sfumaturi dwar id mhux imqabbla jew li tinbidel wara l-ipproċessar
  • Imbagħad għas-suq OTC, l-id ma jaqblu xejn.
  •  Kif ukoll l-sfumaturi ta ‘l-istrumenti ta’ sinkronizzazzjoni, li għal darb’oħra ma jikkoinċidux, minħabba l-partikolaritajiet ta ‘l-API. Imma dik hija storja oħra.

Ejja nżidu jkollna informazzjoni dwar operazzjonijiet mal-applikazzjoni tagħna. Il-mistoqsija ewlenija se tkun fejn id-dejta se tiġi pproċessata u maħżuna.

  •  Jekk tagħmel dan għalik innifsek, tikkonsma l-istess data minn apparati differenti. Imbagħad għandek bżonn tipproċessa u taħżen data fuq is-server.
  • Jekk għandek ħafna dejta differenti kkunsmata minn ħafna utenti differenti, allura trid tiddeċiedi x’inhu aktar importanti: il-veloċità tal-utenti jew l-iffrankar tal-ħadid fuq in-naħa tiegħek. Min jista’ jaffordja ammont infinit ta’ ħardwer jgħodd kollox fuq is-server tiegħu u jagħmilha super veloċi għall-utenti, billi jiffranka r-riżorsi tal-utent, bħall-batterija u t-traffiku, li huwa importanti ħafna fuq it-telefowns.

Min-naħa tiegħu, l-għadd fil-browser mhuwiex l-aħjar soluzzjoni fil-prinċipju. Għalhekk, dak li mhux għali, inqisuh fuq is-server tagħna. Inħallu l-bqija f’idejn il-klijent. Irrid verament nieħu u nikkalkula l-kummissjoni fuq is-server. Imma hawnhekk tidħol l-isfumatura msejħa “interattività”. Ejja ngħidu li għandek eluf ta’ operazzjonijiet u tieħu ħames minuti biex tirċevihom. X’se jkollu l-utent f’dan il-ħin? Spinner? Progress? Infa dwar kemm ttella? Huwa ideali li tuża “stennija attiva” meta l-utent fil-proċess diġà jista ‘jara xi ħaġa. Hawn hu r-Riżultat:Qed niżviluppaw mikroservizz billi nużaw l-API Tinkoff Invest biex nawtomatizzaw ix-xogħol b'rapporti ta' senserija u nikkalkulaw il-kummissjonijiet.

  • Tagħbija tal-paġna
  • Il-fatturi kollha huma mitluba
  • Wara dan, it-tranżazzjonijiet kollha b’kummissjonijiet għal tranżazzjonijiet esegwiti huma mitluba għall-kontijiet kollha. Hekk kif id-data tiġi riċevuta, hija mogħtija fil-browser.

Sabiex ma niffiltrawx id-dejta fl-avvenimenti kull darba, aħna niġbdu l-avveniment tagħna stess għal kull kont. Bħal dan:

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

L-abbozz għat-tnedija jinsab hawn: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Nimxu ‘l quddiem. Huwa kbir li qrajt din il-linja! 

Kalkolu u output ta’ informazzjoni ta’ interess

Jiddependi fuq min jeħtieġ liema informazzjoni. Għalhekk, immedjatament ngħidlek l-sfumaturi ewlenin li se tiltaqa ‘ma’.

Ħidma mal-prezzijiet 

Kull min jaħdem mal-finanzi jaf li t-tranżazzjonijiet tal-flus għandhom isiru biss b’numri sħaħ. Minħabba l-ineżattezza tal-valuri wara l-punt deċimali u l-iżball kumulattiv b’numru kbir ta ‘operazzjonijiet. Huwa għalhekk li l-prezzijiet kollha huma ppreżentati fil- format MoneyValue li ġejQed niżviluppaw mikroservizz billi nużaw l-API Tinkoff Invest biex nawtomatizzaw ix-xogħol b'rapporti ta' senserija u nikkalkulaw il-kummissjonijiet.

qasam tip Deskrizzjoni
munita spag String kodiċi tal-munita ISO
unitajiet int64 Parti sħiħa tas-somma, tista ‘tkun numru negattiv
nano int32 Parti frazzjonali tal-ammont, jista ‘jkun numru negattiv

Aħna nipproċessawhom separatament, imbagħad inġibuhom għall-valur tal-prezz:

quotation.units + quotation.nano / 1e9

L-ispiża tal-kuntratti tal-futures

Il-prezz tal-futures huwa ppreżentat f’punti, meta jkollok futur tal-munita, trid tkun taf ir-rata. U ovvjament il-prezz f’punti u l-pass tal-prezz. Meta tikkalkula l-profitt mit-tranżazzjonijiet, dan jista ‘rimja, għaliex. jekk tikkalkula l-ammont totali billi timmultiplika l-prezz bil-kwantità. Hawnhekk trid toqgħod attent. Għalissa, naraw kif sejjer. Dan japplika għall-futures tal-munita, f’postijiet oħra kollox huwa ok ma ‘dan.Qed niżviluppaw mikroservizz billi nużaw l-API Tinkoff Invest biex nawtomatizzaw ix-xogħol b'rapporti ta' senserija u nikkalkulaw il-kummissjonijiet. Qed niżviluppaw mikroservizz billi nużaw l-API Tinkoff Invest biex nawtomatizzaw ix-xogħol b'rapporti ta' senserija u nikkalkulaw il-kummissjonijiet.

Suq OTC

Dan is-suq għandu ħafna pekuljaretajiet, allura ejja nistudjaw l-operazzjonijiet fuqu separatament.Meta tibda tissinkronizza l-operazzjonijiet, jirriżulta li għandek bżonn iġġib figi / ticker għall-istess forma sabiex tqabbel b’mod korrett l-istrument. Meta tibda tissinkronizza dan mar-rapport tas-senserija, jirriżulta li t-tradeID tal-istess tranżazzjoni għandu ittri fil-bidu fit-tranżazzjonijiet u mhumiex fir-rapport tas-senserija. Għalhekk, ma jistgħux jitqabblu … ahem-ahem … b’paragun! Qabbilt il-ħin tal-kummerċ, ticker u tqabbil li tradeId wieħed jinsab f’ieħor. Dritt, ma nafx. Min jiltaqa’ ma’ dan u min jimpurtah minnha, jasal għall -kwistjoni jew jibda waħda ġdida.Qed niżviluppaw mikroservizz billi nużaw l-API Tinkoff Invest biex nawtomatizzaw ix-xogħol b'rapporti ta' senserija u nikkalkulaw il-kummissjonijiet.

Operazzjonijiet matematiċi fuq għodda

Huwa impossibbli, mingħajr ma tħares, li jitwettqu operazzjonijiet matematiċi mal-lista kollha. Sabiex ma nżidux sħun għal artab, aħna dejjem niċċekkjaw il-munita u nipproċessaw biss jekk inkunu ċerti li l-munita taqbel, u l-punti jiġu kkonvertiti għall-munita mixtieqa. Armati b’għarfien dwar ix-xogħol man-numri tal-bank, aħna se nikkalkulaw il-kummissjoni minfuqa fuq kull wieħed mill-kontijiet. Bħal dan: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4Qed niżviluppaw mikroservizz billi nużaw l-API Tinkoff Invest biex nawtomatizzaw ix-xogħol b'rapporti ta' senserija u nikkalkulaw il-kummissjonijiet.    

Il-mikroservizz huwa lest!

https://github.com/pskucherov/tcsstat Bħala homework, tista ‘tiċċekkja jekk is-servizz jaħdemx b’konnessjoni bil-mod, meta l-konnessjonijiet jitkissru, meta l-Internet jiġi skonnettjat, meta żbalji jew limiti skaduti min-naħa tas-sensar. 

Konklużjonijiet u pjanijiet għall-futur

  • Tgħallimt dwar operazzjonijiet bażiċi u ħidma mal-Invest API
  • Ħin mgħoddi ~ 10 sigħat
  • Livell ta’ diffikultà ~ junior+ / medju baxx 

Jekk tkompli tirfina l-mikroservizz, tista’ tispiċċa b’xi ħaġa bħal din

https://opexbot.info

  Dan huwa l-iżvilupp tiegħi, għal dawk li huma għażżien wisq biex jifhmu, imexxu u jgħoddu waħedhom. Nippjana li nżid analytics hemm fuq talba tal-utenti. Jekk għoġbok l-artiklu, imbagħad abbona għall -kanal tat-telegramma tiegħi . Qed niżviluppaw mikroservizz billi nużaw l-API Tinkoff Invest biex nawtomatizzaw ix-xogħol b'rapporti ta' senserija u nikkalkulaw il-kummissjonijiet.

Pavel
Rate author
Add a comment

  1. Isakiiev

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

    Reply