L-ispiraturi wara l-iżvilupp tas -servizz tal-istatistika għal Tinkoff Investments kienu:
- artiklu fuq Habré “X’mhux qed jgħidu Tinkoff Investments”
- analiżi tax-xewqat tal -utenti tal-pjattaforma
- artiklu dwar il-kalkolu tal-kummissjonijiet .
- X’se jiġi diskuss?
- L-iżvilupp ta’ servizz tal-istatistika pass pass:
- Konnessjoni ma’ Tinkoff Invest API
- Tpinġija tad-dejta minn Tinkoff Invest API fi browser
- Jirċievu rapporti ta’ senserija u tranżazzjonijiet
- GetBrokerReport
- Metodu biex tinkiseb id-data, b’kont meħud tat-tnaqqis mid-data kurrenti
- Talba għall-ġenerazzjoni tar-rapport
- Riżultat:
- GetDividendsForeignIssuer
- GetOperationsByCursor
- Kalkolu u output ta’ informazzjoni ta’ interess
- Ħidma mal-prezzijiet
- L-ispiża tal-kuntratti tal-futures
- Suq OTC
- Operazzjonijiet matematiċi fuq għodda
- Il-mikroservizz huwa lest!
- Konklużjonijiet u pjanijiet għall-futur
- https://opexbot.info
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:
- Konnessjoni ma’ Tinkoff Invest API
- Tpinġija tad-dejta minn Tinkoff Invest API fi browser
- Jirċievu rapporti ta’ senserija u tranżazzjonijiet
- Kalkolu u output ta’ informazzjoni ta’ interess
- 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:
- 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).
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
- https://github.com/pskucherov/tcsstat/commit/7e1ac57061e5e971588479015b06d8814d6609a9
- 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
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.
- 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.
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:
- 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 ġej
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.
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.
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…step4
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 .
Полезная статья. Не могу представить, сколько усилий автора потребовалось, чтобы все описать. Благодарю.