Nou ap devlope yon mikwosèvis lè l sèvi avèk Tinkoff Invest API pou otomatize travay ak rapò koutye ak kalkile komisyon.

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

Enspiratè ki te dèyè devlopman sèvis estatistik pou Tinkoff Investments te:

Ki sa ki pral diskite?

  • Se sèlman pati ki aplike sou devlopman.
  • Konesans reyèl ak eksperyans, ki trè enpòtan nan travay ak enstriman finansye.
  • Apèsi sou pwoblèm pou travay sou yo

Se konsa, mwen vle kalkile estatistik komès epi fè li nan yon fason pratik. 

Devlope yon sèvis estatistik etap pa etap: 

  1. Koneksyon ak Tinkoff Invest API
  2. Desen done ki soti nan Tinkoff Invest API nan yon navigatè
  3. Resevwa rapò koutye ak tranzaksyon yo
  4. Kalkil ak pwodiksyon enfòmasyon ki enterese
  5. Konklizyon ak plan pou lavni

Koneksyon ak Tinkoff Invest API

Pou konekte ak API a, ou ka pran nenpòt sdk nan dokiman https://github.com/Tinkoff/investAPI#sdk . Oswa pake npm ` tinkoff-sdk-grpc-js `. Li enpòtan pou devlopè yo mete ajou pakè a ak dènye vèsyon an. Enstale

npm mwen tinkoff-sdk-grpc-js

Tcheke

const { createSdk } = require(‘tinkoff-sdk-grpc-js’);   // Token ki ka jwenn tankou sa a  const TOKEN = ‘YOURAPI’;   // Non aplikasyon ou ka jwenn nan jounal TCS yo. const appName = ‘tcsstat’;   const sdk = createSdk (TOKEN, appName); (async () => {     console.log(wait sdk.users.getAccounts()); })();

Rezilta: yon lis kont ou yo pral parèt nan konsole a. Pou egzanp, se pou nou analize nuans yo:Nou ap devlope yon mikwosèvis lè l sèvi avèk Tinkoff Invest API pou otomatize travay ak rapò koutye ak kalkile komisyon.

  • Nan lis la nan kont gen yon “bank Envestisman”, ak ki ou pa ka travay lè l sèvi avèk API a
  • Tanpri sonje ke jaden yo vini nan camelCase, pandan y ap nan dokiman an jaden sa yo prezante nan under_score. 
  • Li pral tankou sa a toupatou, kidonk ou pa ka jis pran epi kopye yon jaden nan dokiman an.

Itil:

  • Ou ka jwenn kòd sa a nan branch pwojè a

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

Desen done ki soti nan Tinkoff Invest API nan yon navigatè

Mwen te pran next.js ak socket.io. Sa a se pa yon rekòmandasyon fò, chwazi nan diskresyon ou. 

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

Nou imedyatman ale nan etap amitye next+socket+investapi, epi gade seksyon ki itil nan etap sa a pou tout detay yo.  Mwen pral dekri detay yo: 

  • Sou bò nodejs (sèvè), gen yon fichye pages/api/investapi.js. Sa a se kote nou kreye sèvè a socket.io epi konekte ak investapi.
  • Sou bò navigatè a (kliyan), nou konekte ak sèvè a atravè yon priz epi mande done kont nan koutye a. 
  • Nou resevwa done ki soti nan koutye a sou sèvè a, Lè sa a, voye li bay kliyan an. Lè yo resevwa yo sou kliyan an, yo parèt nan navigatè a. 

Rezilta:  nan konsole navigatè a nou ka wè enfòmasyon sou kont yo. Sa vle di, nan dènye etap la, nou te wè enfòmasyon sou kont nan konsole sèvè a (nodejs), nan etap aktyèl la, nou transfere enfòmasyon sa a nan kliyan an (navigatè).

Nou ap devlope yon mikwosèvis lè l sèvi avèk Tinkoff Invest API pou otomatize travay ak rapò koutye ak kalkile komisyon.

Koulye a, ann fè li pou ke ou ka chwazi yon kont nan navigatè a, epi si pa gen okenn siy, Lè sa a, yo voye yon erè nan konsole a. Travay la senp e pa gen anyen nouvo, kidonk mwen bay sèlman lyen ki mennen nan komèt

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

Itil:

  • Ki jan yo fè zanmi pwochen ak priz yo dekri an detay isit la
  • Kòd zanmitay pwochen+priz+investi:

https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Pou moun ki pi wo a se difisil, Lè sa a, nou rete nan etap sa a epi fè fas ak kòd la. Si ou gen kesyon – mande. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2

Resevwa rapò koutye ak tranzaksyon yo

Gen twa metòd pou resevwa rapò koutye ak tranzaksyon yo

  1. GetBrokerReport
  2. GetDividendsForeignIssuer
  3. GetOperationsByCursor

Depi nan kòmansman an li enpòtan pou konnen: 

  • Rapò Brokerage a te pwodwi nan mòd T-3, i.e. echanj yo parèt la apre ekzekisyon aktyèl yo. 
  • An konsekans, si w mande rapò sa a pou de jou ki sot pase yo, l ap pare nan twa jou. 
  • Pou fè kontra pou dènye jou yo, nou itilize metòd pou resevwa operasyon yo, men sonje idantite yo ak kontni yo ka chanje apre fòmasyon rapò koutye a.

GetBrokerReport

Pou jwenn yon rapò koutye, ou bezwen pran idantite kont la, dat kòmansman ak dat fen rapò a, men pa plis pase 31 jou. Nou voye yon demann pou jenere yon rapò bay API a nan jenere _broker_report_request , jwenn yon taskId an repons. Apre sa, lè l sèvi avèk taskId sa a, nou jwenn done nan jwenn _broker_report_response.

Se konsa, dokimantasyon an di, an reyalite gen nuans. Gade men ou:
  • Ou bezwen sove TaskID la pou tout tan egzakteman pou dat sa yo. 
  • Depi si ou pèdi li, Lè sa a, pou dat yo mande rapò a ap vini an premye an repons a demann jenerasyon an, 
  • Apre sa, li p’ap vini ditou.
Ann kòmanse ekri kòd

Metòd pou jwenn dat la, pran an kont soustraksyon nan dat aktyèl la

const getDateSubDay = (subDay = 5, kòmanse = vre) => {     const dat = nouvo Dat ();     date.setUTCDate(date.getUTCDate() – subDay);       si (kòmanse) {         date.setUTCHours (0, 0, 0, 0);     } lòt bagay {         date.setUTCHours (23, 59, 59, 999);     }       dat retounen; };

Rapò demann jenerasyon 

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

Rezilta:

  • Kòm yon rezilta nan premye ekzekisyon lòd la, nou jwenn taskId la. 
  • Rapò a kòmanse pwodwi sou bò koutye a. Lè li pare se enkoni, nou tann epi detanzantan rale taskId la nan patisipe nan rapò a.
  • Poukisa? Paske si rapò a pa pare, li voye yon erè. Si rapò a pa pare sou bò koutye a, Lè sa a, sa a se yon erè nan kòd ou a. Tanpri trete: 30058|INVALID_ARGUMENT|tach la poko fini, tanpri eseye ankò pita

Kòd pou tann ak resevwa yon rapò sanble yon bagay tankou sa a.

const timer = tan async => {     retounen nouvo Pwomès (rezoud => setTimeout (rezoud, tan)); }   const getBrokerResponseByTaskId = async (taskId, paj = 0) => {     eseye {         retounen tann (sdk.operations.getBrokerReport)({             getBrokerReportRequest: {                 taskId,                 paj,             },         });     } trape (e) {         console.log(‘tann’, e);         tann revèy (10000);         retounen tann getBrokerResponseByTaskId(taskId, paj);     } };

Lè sa a, menm majik la rive. Nou sispann script nou an, kòmanse li ankò, nou pa gen yon taskId. Nou egzekite kòd la ak demann lan taskId, men nou pa jwenn taskId la ankò, men imedyatman rapò a. Majik! Ak tout bagay ta byen si li te toujou tankou sa a. Men, nan yon mwa pa pral gen okenn done nan tout. Itil :

  • Yon ti kras nan teyori dekri isit la ak isit la .
  • Mete kòd la ansanm, bouyon an pral sanble yon bagay tankou sa a.

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

  • Si yon moun vin jwenn sa a, Lè sa a, akeyi nan pwoblèm nan . Apre yo fin repare majik sa a, li pral pèdi pouvwa li epi yo pral yon jan kanmenm diferan. Men, nan moman aktyèl la (21/03/2023) li travay jis konsa.

GetDividendsForeignIssuer

Yon moun ta ka panse ke metòd la sanble ak yon sèl anvan an epi ou ka itilize yon sèl metòd kote ou sèlman chanje non an nan operasyon yo. Men, yo pa t ‘devine!  Nonmen an gen anpil diferan tou de nan metòd yo ak nan enfòmasyon yo retounen. Ak konte paj la kòmanse soti nan 0, Lè sa a, soti nan 1. Nan lòd pa jwenn konfonn nan tout bagay sa yo, li pi fasil yo ekri de metòd diferan. Ki etranj, paske lojik travay la se menm bagay la. Mwen krache pou yon tan long lè mwen te eseye fè yon sèl metòd ak te gen mwens kòd. Pa pral gen egzanp isit la.

GetOperationsByCursor

Pi renmen m nan twa yo. Malgre ke pa pi egzat la, men pi bon an. Nou fè yon demann depi nan konmansman an nan kreye yon kont jiska dat maksimòm posib (fèmen yon kont oswa yon sèl aktyèl la). Nou jwenn repons lan, pran kurseur a ak re-mande osi lontan ke gen done.  Ak kòd la pi kout pase nan egzanp ki anwo yo.

const timer = tan async => {     retounen nouvo Pwomès (rezoud => setTimeout (rezoud, tan)); }   const getOperationsByCursor = async (sdk, accountId, from, to, kurseur = ”) => {     eseye {         const reqData = {             accountId,             from,             to,             limit: 1000,             state: sdk.OperationState.OPERATION_STATE_EXECUTED,             withoutCommissions: false,             sanEchanj: fo,             sanOvernights: fo,             kurseur,         };           retounen tann sdk.operations.getOperationsByCursor(reqData);     } trape (e) {         tann revèy (60000);         retounen tann getOperationsByCursor(sdk, accountId, from, to, kurseur = ”);     } };

Bouyon pou kouri la a: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Kounye a nou pare pou ajoute operasyon k ap resevwa yo nan aplikasyon nou an. Si fè kòrèkteman, Lè sa a, ou bezwen jwenn rapò Brokerage pou tout egzistans kont lan. Ak pou done ki manke yo, sa yo menm T-3s, rechaje soti nan operasyon yo. Men, sa a ka separe nan yon atik separe. Nan nuans prensipal yo ke ou pral rankontre se lakòl operasyon ak yon rapò Brokerage.

  •  Si jodi a ou te resevwa yon rapò koutye ak tranzaksyon pou dat yo mande yo, mete tout bagay nan baz done a, Lè sa a, pa gen okenn pwoblèm. 
  • Ou pral gen pwoblèm demen lè ou resevwa pòsyon nan pwochen nan done ki soti nan rapò a ak operasyon epi deside senkronize yo ak baz done ki egziste deja. 
  • Anpil nuans sou idantite ki pa matche oswa chanje apre pwosesis la
  • Lè sa a, pou mache OTC a, id yo pa matche ditou.
  •  Kòm byen ke nuans yo nan senkronize enstriman mizik, ki ankò pa kowenside, akòz sengularite yo nan API la. Men, sa se yon lòt istwa.

Ann ajoute jwenn enfòmasyon sou operasyon nan aplikasyon nou an. Kesyon prensipal la pral kote done yo pral trete ak estoke.

  •  Si ou fè li pou tèt ou, ou pral konsome menm done ki soti nan aparèy diferan. Lè sa a, ou bezwen trete ak estoke done sou sèvè a.
  • Si ou gen yon anpil nan done diferan boule pa anpil itilizatè diferan, Lè sa a, ou bezwen deside ki sa ki pi enpòtan: vitès la nan itilizatè yo oswa ekonomize nan fè sou bò ou. Nenpòt moun ki ka peye yon kantite lajan enfini nan pyès ki nan konpitè konte tout bagay sou sèvè l ‘, li fè li super vit pou itilizatè yo, ekonomize resous itilizatè yo, tankou batri ak trafik, ki trè enpòtan sou telefòn yo.

Nan vire, konte nan navigatè a se pa solisyon ki pi optimal nan prensip. Se poutèt sa, sa ki pa chè, nou konsidere li sou sèvè nou an. Nou kite rès la nan men kliyan an. Mwen reyèlman vle pran ak kalkile komisyon an sou sèvè a. Men, isit la vini nuans ki rele “entèaktif”. Ann di ou gen dè milye de operasyon epi li pran senk minit pou resevwa yo. Kisa itilizatè a pral genyen nan moman sa a? Spinner? Pwogrè? Enfa sou konbyen yo te telechaje? Li se ideyal yo sèvi ak “aktif datant” lè itilizatè a nan pwosesis la te kapab deja wè yon bagay. Men rezilta a:Nou ap devlope yon mikwosèvis lè l sèvi avèk Tinkoff Invest API pou otomatize travay ak rapò koutye ak kalkile komisyon.

  • Paj chaje
  • Tout fakti yo mande
  • Apre sa, tout tranzaksyon ak komisyon pou tranzaksyon egzekite yo mande pou tout kont yo. Kòm done yo resevwa, li rann nan navigatè a.

Nan lòd pa filtre done yo nan evènman yo chak fwa, nou rale pwòp evènman nou an pou chak kont. Tankou sa a:

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

Bouyon pou lanse a se isit la: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Moving on. Li bon ke ou te li liy sa a! 

Kalkil ak pwodiksyon enfòmasyon ki enterese

Sa depann de ki moun ki bezwen enfòmasyon. Se poutèt sa, mwen imedyatman di ou nuans prensipal yo ke ou pral rankontre.

Travay ak pri 

Tout moun ki travay ak finans konnen ke tranzaksyon lajan yo ta dwe fèt sèlman ak nimewo antye. Akòz erè a nan valè apre pwen desimal la ak erè kimilatif ak yon gwo kantite operasyon. Se poutèt sa tout pri yo prezante nan fòma MoneyValue sa aNou ap devlope yon mikwosèvis lè l sèvi avèk Tinkoff Invest API pou otomatize travay ak rapò koutye ak kalkile komisyon.

jadenkaliteDeskripsyon
lajanfisèlChaîne ISO kòd lajan
inite yoint64Pati nonb antye relatif nan sòm total la, kapab yon nimewo negatif
nanoint32Pati fraksyon nan kantite lajan an, kapab yon nimewo negatif

Nou trete yo separeman, Lè sa a, pote yo nan valè a pri:

quote.units + quote.nano / 1e9

Pri a nan kontra avni yo

Se pri a nan avni prezante nan pwen, lè ou gen yon avni lajan, ou bezwen konnen pousantaj la. Ak nan kou pri a nan pwen ak etap la pri. Lè ou kalkile pwofi a nan tranzaksyon yo, sa a ka tire, paske. si ou kalkile kantite total la lè w miltipliye pri a pa kantite a. Isit la ou bezwen fè atansyon. Pou kounye a, nou pral wè ki jan li ale. Sa a aplike a avni lajan, nan lòt kote tout bagay se ok ak sa a.Nou ap devlope yon mikwosèvis lè l sèvi avèk Tinkoff Invest API pou otomatize travay ak rapò koutye ak kalkile komisyon.Nou ap devlope yon mikwosèvis lè l sèvi avèk Tinkoff Invest API pou otomatize travay ak rapò koutye ak kalkile komisyon.

OTC mache

Mache sa a gen yon anpil nan sengularite, kidonk ann etidye operasyon sou li separeman.Lè ou kòmanse senkronize operasyon yo, li pral parèt ke ou bezwen pote figi / ticker nan menm fòm nan yo nan lòd yo kòrèkteman matche ak enstriman an. Lè ou kòmanse senkronize sa a ak rapò a Brokerage, li pral vire soti ke tradeID nan menm tranzaksyon an gen lèt nan kòmansman an nan tranzaksyon yo epi yo pa nan rapò a Brokerage. Se poutèt sa, yo pa ka konpare … ahem-ahem … pa konparezon! Mwen matche tan komès la, ticker ak matche ke yon tradeId genyen nan yon lòt. Dwa, mwen pa konnen. Nenpòt moun ki rankontre sa a ak ki moun ki gen sousi pou li, vini nan pwoblèm nan oswa kòmanse yon nouvo.Nou ap devlope yon mikwosèvis lè l sèvi avèk Tinkoff Invest API pou otomatize travay ak rapò koutye ak kalkile komisyon.

Operasyon matematik sou zouti

Li enposib, san gade, fè operasyon matematik ak tout lis la. Nan lòd pa ajoute cho nan mou, nou toujou tcheke lajan an ak pwosesis sèlman si nou asire w ke lajan an matche, ak pwen yo konvèti nan lajan an vle. Ame ak konesans sou travay ak nimewo labank, nou pral kalkile komisyon an te pase sou chak nan kont yo. Tankou sa a: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4Nou ap devlope yon mikwosèvis lè l sèvi avèk Tinkoff Invest API pou otomatize travay ak rapò koutye ak kalkile komisyon.   

Microservice pare!

https://github.com/pskucherov/tcsstat Kòm yon devwa, ou ka tcheke si sèvis la ap travay ak yon koneksyon dousman, lè koneksyon yo kase, lè entènèt la dekonekte, lè erè oswa limit ekspire sou pati nan koutye a. 

Konklizyon ak plan pou lavni

  • Aprann sou operasyon debaz yo ak travay ak Invest API
  • Tan pase ~ 10 èdtan
  • Nivo difikilte ~ jinyò + / ba mwayen 

Si ou kontinye rafine mikwosèvis la, ou ka fini ak yon bagay tankou sa a

https://opexbot.info

  Sa a se devlopman mwen an, pou moun ki twò parese yo konprann, kouri ak konte sou pwòp yo. Mwen planifye ajoute analytics la a demann itilizatè yo. Si ou te renmen atik la, abònman ak chanèl telegram mwen an . Nou ap devlope yon mikwosèvis lè l sèvi avèk Tinkoff Invest API pou otomatize travay ak rapò koutye ak kalkile komisyon.

Pavel
Rate author
Add a comment

  1. Isakiiev

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

    Reply