Tunatengeneza huduma ndogo kwa kutumia API ya Tinkoff Invest ili kufanya kazi kiotomatiki na ripoti za udalali na tume za kukokotoa.

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

Vichochezi vya maendeleo ya huduma ya takwimu kwa Uwekezaji wa Tinkoff vilikuwa:

Nini kitajadiliwa?

  • Sehemu inayotumika tu kuhusu maendeleo.
  • Maarifa halisi na uzoefu, ambayo ni muhimu sana katika kufanya kazi na vyombo vya kifedha.
  • Muhtasari wa masuala ya kufanyia kazi

Kwa hivyo, nataka kuhesabu takwimu za biashara na kuifanya kwa njia rahisi. 

Kuendeleza huduma ya takwimu hatua kwa hatua: 

  1. Muunganisho kwa API ya Tinkoff Invest
  2. Kuchora data kutoka kwa API ya Tinkoff Invest kwenye kivinjari
  3. Kupokea ripoti za udalali na miamala
  4. Hesabu na matokeo ya habari ya riba
  5. Hitimisho na mipango ya siku zijazo

Muunganisho kwa API ya Tinkoff Invest

Ili kuunganisha kwa API, unaweza kuchukua sdk yoyote kutoka kwa hati https://github.com/Tinkoff/investAPI#sdk . Au npm kifurushi ` tinkoff-sdk-grpc-js `. Ni muhimu kwamba kifurushi kisasishwe kwa toleo la hivi karibuni na watengenezaji. Sakinisha

npm na tinkoff-sdk-grpc-js

Kuangalia

const { createSdk } = require(‘tinkoff-sdk-grpc-js’);   // Ishara ambayo inaweza kupatikana kama hii  const TOKEN = ‘YOURAPI’;   // Jina la programu ambayo unaweza kupatikana kwenye kumbukumbu za TCS. const appName = ‘tcsstat’;   const sdk = createSdk(TOKEN, appName); (async () => {     console.log(await sdk.users.getAccounts()); })();

Matokeo: orodha ya akaunti zako itaonyeshwa kwenye koni. Kwa mfano, hebu tuchambue nuances:Tunatengeneza huduma ndogo kwa kutumia API ya Tinkoff Invest ili kufanya kazi kiotomatiki na ripoti za udalali na tume za kukokotoa.

  • Katika orodha ya akaunti kuna “benki ya Uwekezaji”, ambayo huwezi kufanya kazi kwa kutumia API
  • Tafadhali kumbuka kuwa sehemu zinakuja kwa camelCase, wakati katika hati sehemu hizi zimewasilishwa kwa under_score. 
  • Itakuwa hivi kila mahali, kwa hivyo huwezi kuchukua na kunakili sehemu kutoka kwa hati.

Muhimu:

  • Unaweza kupata msimbo huu katika tawi la mradi

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

Kuchora data kutoka kwa API ya Tinkoff Invest kwenye kivinjari

Nilichukua next.js na socket.io. Hili sio pendekezo kali, chagua kwa hiari yako. 

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

Mara moja tunaendelea kwa hatua ya urafiki inayofuata+soketi+investapi, na kuona Sehemu ya Muhimu ya hatua hii kwa maelezo yote.  Nitaelezea maelezo: 

  • Kwa upande wa nodejs (seva), kuna kurasa/api/investapi.js faili. Hapa ndipo tunatengeneza seva ya socket.io na kuunganisha kwenye investapi.
  • Kwa upande wa kivinjari (mteja), tunaunganisha kwenye seva kupitia tundu na kuomba data ya akaunti kutoka kwa wakala. 
  • Tunapokea data kutoka kwa wakala kwenye seva, kisha kuituma kwa mteja. Wakati zinapokelewa kwa mteja, zinaonyeshwa kwenye kivinjari. 

Matokeo:  katika koni ya kivinjari tunaweza kuona habari kuhusu akaunti. Hiyo ni, katika hatua ya mwisho, tuliona habari kuhusu akaunti katika console ya seva (nodejs), katika hatua ya sasa, tulihamisha habari hii kwa mteja (kivinjari).

Tunatengeneza huduma ndogo kwa kutumia API ya Tinkoff Invest ili kufanya kazi kiotomatiki na ripoti za udalali na tume za kukokotoa.

Sasa hebu tuifanye ili uweze kuchagua akaunti kutoka kwa kivinjari, na ikiwa hakuna ishara, basi kosa linatumwa kwa console. Kazi ni rahisi na hakuna jipya, kwa hivyo mimi hutoa viungo vya kufanya tu

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

Muhimu:

  • Jinsi ya kufanya marafiki ijayo na tundu ni ilivyoelezwa kwa undani hapa
  • Nambari ya urafiki inayofuata+soketi+investapi:

https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Ambao yaliyo hapo juu ni magumu kwao, basi tunasalia katika hatua hii na kushughulikia msimbo. Ikiwa una maswali – uliza. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2

Kupokea ripoti za udalali na miamala

Kuna njia tatu za kupokea ripoti za udalali na miamala

  1. GetBrokerReport
  2. GetDividendsForeignIssuer
  3. GetOperationsByCursor

Kuanzia mwanzo ni muhimu kujua: 

  • Ripoti ya udalali inazalishwa katika hali ya T-3, i.e. biashara huonyeshwa hapo baada ya utekelezaji wao halisi. 
  • Ipasavyo, ukiomba ripoti hii kwa siku mbili zilizopita, itakuwa tayari baada ya siku tatu. 
  • Ili kupata miamala ya siku za mwisho, tunatumia mbinu ya kupokea miamala, lakini kumbuka kwamba kitambulisho chao na maudhui yanaweza kubadilika baada ya ripoti ya udalali kuzalishwa.

GetBrokerReport

Ili kupata ripoti ya udalali, unahitaji kuchukua kitambulisho cha akaunti, tarehe ya kuanza na tarehe ya mwisho ya ripoti, lakini si zaidi ya siku 31. Tunatuma ombi la kutoa ripoti kwa API katika generate _broker_report_request , pata taskId kujibu. Baada ya hapo, kwa kutumia taskId hii, tunapata data kutoka kupata _broker_report_response.

Kwa hivyo hati inasema, kwa kweli kuna nuances. Tazama mikono yako:

  • Unahitaji kuhifadhi TaskID milele haswa kwa tarehe hizi. 
  • Kwa kuwa ukiipoteza, basi kwa tarehe zilizoombwa ripoti itakuja kwanza kujibu ombi la kizazi, 
  • Na kisha haitakuja kabisa.

Wacha tuanze kuandika nambari

Njia ya kupata tarehe, kwa kuzingatia utoaji kutoka tarehe ya sasa

const getDateSubDay = (subDay = 5, start = true) => {     const date = new Date();     date.setUTCDate(date.getUTCDate() – subDay);       ikiwa (anza) {         date.setUTCHours(0, 0, 0, 0);     } mwingine {         date.setUTCHours(23, 59, 59, 999);     }       tarehe ya kurudi; };

Ripoti ombi la kuunda 

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

Matokeo:

  • Kama matokeo ya utekelezaji wa kwanza wa amri, tunapata taskId. 
  • Ripoti inaanza kuzalishwa kwa upande wa wakala. Ikiwa tayari haijulikani, tunasubiri na kuvuta kitambulisho mara kwa mara kwa kutarajia ripoti.
  • Kwa nini? Kwa sababu ikiwa ripoti haiko tayari, inatupa makosa. Ikiwa ripoti haiko tayari kwa upande wa wakala, basi hii ni hitilafu katika msimbo wako. Tafadhali chakata: 30058|INVALID_ARGUMENT|kazi bado haijakamilika, tafadhali jaribu tena baadaye.

Kanuni ya kusubiri na kupokea ripoti inaonekana kama hii.

const timer = async time => {     rudisha Ahadi mpya(suluhisha => setTimeout(suluhisha, wakati)); }   const getBrokerResponseByTaskId = async (taskId, page = 0) => {     jaribu {         return wait (sdk.operations.getBrokerReport)({             getBrokerReportRequest: {                 taskId,                 page,             },         });     } kamata (e) {         console.log(‘subiri’, e);         kusubiri kipima muda (10000);         rudisha subiri getBrokerResponseByTaskId(taskId, page);     } };

Kisha uchawi huo hutokea. Tunasimamisha hati yetu, ianze tena, hatuna kaziId. Tunatekeleza msimbo na ombi la Kitambulisho cha kazi, lakini hatupati tena Kitambulisho cha kazi, lakini ripoti mara moja. Uchawi! Na kila kitu kingekuwa sawa ikiwa ingekuwa hivi kila wakati. Lakini kwa mwezi hakutakuwa na data kabisa. Muhimu :

  • Nadharia kidogo imeainishwa hapa na hapa .
  • Kuweka msimbo pamoja, rasimu itaonekana kama hii.

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

  • Ikiwa mtu atakutana na hii, basi karibu kwa suala hili . Baada ya kutengeneza uchawi huu, itapoteza nguvu zake na itakuwa tofauti kwa namna fulani. Lakini kwa sasa (03/21/2023) inafanya kazi kama hivyo.

GetDividendsForeignIssuer

Mtu anaweza kufikiria kuwa njia hiyo ni sawa na ile iliyopita na unaweza kutumia njia moja ambayo unabadilisha tu jina la shughuli. Lakini hawakudhani!  Kutaja huko ni tofauti sana katika njia na katika habari iliyorejeshwa. Na hesabu ya ukurasa huanza kutoka 0, kisha kutoka 1. Ili usichanganyike katika haya yote, ni rahisi kuandika njia mbili tofauti. Ambayo ni ya kushangaza, kwa sababu mantiki ya kazi ni sawa. Nilitema mate kwa muda mrefu nilipojaribu kutengeneza njia moja na kulikuwa na nambari ndogo. Hapatakuwa na mifano.

GetOperationsByCursor

Ninachopenda kati ya hizo tatu. Ingawa sio sahihi zaidi, lakini ya kutosha zaidi. Tunafanya ombi tangu mwanzo wa kuunda akaunti hadi tarehe ya juu iwezekanavyo (kufunga akaunti au ya sasa). Tunapata jibu, kuchukua kishale na kuomba upya mradi tu kuna data.  Na kanuni ni mafupi zaidi kuliko katika mifano hapo juu.

const timer = async time => {     rudisha Ahadi mpya(suluhisha => setTimeout(suluhisha, wakati)); }   const getOperationsByCursor = async (sdk, accountId, kutoka, hadi, cursor = ”) => {     jaribu {         const reqData = {             accountId,             kutoka,             hadi,             kikomo: 1000,             jimbo: sdk.OperationState.OPERATION_STATE_EXECUTED,             withoutCommissions: false,             withoutTrades: uongo,             bilaOvernights: uongo,             mshale,         };           return wait sdk.operations.getOperationsByCursor(reqData);     } kamata (e) {         wait timer(60000);         return await getOperationsByCursor(sdk, accountId, from, to, cursor = ”);     } };

Rasimu ya kuendeshwa iko hapa: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Sasa tuko tayari kuongeza shughuli za kupokea kwenye maombi yetu. Ikiwa imefanywa kwa usahihi, basi unahitaji kupata ripoti za udalali kwa kuwepo kwa akaunti nzima. Na kwa data inayokosekana, T-3 hizo hizo, pakia upya kutoka kwa shughuli. Lakini hii inaweza kugawanywa katika makala tofauti. Ya nuances kuu ambayo utakutana nayo ni gundi shughuli na ripoti ya udalali.

  •  Ikiwa leo ulipokea ripoti ya udalali na shughuli kwa tarehe zinazohitajika, weka yote kwenye hifadhidata, basi hakuna matatizo. 
  • Utakuwa na matatizo kesho utakapopokea sehemu inayofuata ya data kutoka kwa ripoti na uendeshaji na kuamua kusawazisha na hifadhidata iliyopo. 
  • Nuances nyingi kuhusu kutolingana au kubadilisha kitambulisho baada ya kuchakatwa
  • Halafu kwa soko la OTC, vitambulisho havilingani hata kidogo.
  •  Pamoja na nuances ya vyombo vya kusawazisha, ambavyo havifanani tena, kwa sababu ya upekee wa API. Lakini hiyo ni hadithi nyingine.

Hebu tuongeze kupata taarifa kuhusu utendakazi kwenye programu yetu. Swali kuu litakuwa wapi data itachakatwa na kuhifadhiwa.

  •  Ikiwa utajifanyia mwenyewe, utatumia data sawa kutoka kwa vifaa tofauti. Kisha unahitaji kusindika na kuhifadhi data kwenye seva.
  • Ikiwa una data nyingi tofauti zinazotumiwa na watumiaji wengi tofauti, basi unahitaji kuamua ni nini muhimu zaidi: kasi ya watumiaji au uokoaji wa chuma upande wako. Yeyote anayeweza kumudu kiasi kisicho na kikomo cha maunzi huhesabu kila kitu kwenye seva yake na kuifanya iwe haraka sana kwa watumiaji, akiokoa rasilimali za watumiaji, kama vile betri na trafiki, ambayo ni muhimu sana kwenye simu.

Kwa upande wake, kuhesabu katika kivinjari sio suluhisho bora zaidi kwa kanuni. Kwa hivyo, ni nini sio ghali, tunazingatia kwenye seva yetu. Wengine tunamwachia mteja. Ninataka sana kuchukua na kuhesabu tume kwenye seva. Lakini hapa inakuja nuance inayoitwa “interactivity”. Wacha tuseme una maelfu ya operesheni na inachukua dakika tano kuzipokea. Je, mtumiaji atakuwa na nini wakati huu? Spinner? Maendeleo? Infa kuhusu kiasi gani kilipakiwa? Ni vyema kutumia “kusubiri kwa bidii” wakati mtumiaji katika mchakato tayari anaweza kuona kitu. Haya ndiyo Matokeo:Tunatengeneza huduma ndogo kwa kutumia API ya Tinkoff Invest ili kufanya kazi kiotomatiki na ripoti za udalali na tume za kukokotoa.

  • Upakiaji wa ukurasa
  • Ankara zote zinaombwa
  • Baada ya hayo, shughuli zote zilizo na tume za shughuli zilizotekelezwa zinaombwa kwa akaunti zote. Data inapopokelewa, inatolewa kwenye kivinjari.

Ili tusichuje data katika matukio kila wakati, tunavuta tukio letu kwa kila akaunti. Kama hii:

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

Rasimu ya kuzindua iko hapa: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Moving on. Ni vizuri kwamba umesoma mstari huu! 

Hesabu na matokeo ya habari ya riba

Inategemea nani anahitaji habari gani. Kwa hiyo, mara moja ninakuambia nuances kuu ambayo utakutana nayo.

Kufanya kazi na bei 

Kila mtu anayefanya kazi na fedha anajua kwamba shughuli za pesa zinapaswa kufanywa tu kwa nambari nzima. Kwa sababu ya usahihi wa maadili baada ya nukta ya desimali na hitilafu ya limbikizo na idadi kubwa ya shughuli. Ndiyo maana bei zote zinawasilishwa katika umbizo la MoneyValue lifuataloTunatengeneza huduma ndogo kwa kutumia API ya Tinkoff Invest ili kufanya kazi kiotomatiki na ripoti za udalali na tume za kukokotoa.

shamba aina Maelezo
sarafu kamba Msimbo wa sarafu wa ISO
vitengo int64 Sehemu kamili ya jumla, inaweza kuwa nambari hasi
nano int32 Sehemu ya sehemu ya kiasi, inaweza kuwa nambari hasi

Tunazichakata kando, kisha kuzileta kwa bei ya bei:

nukuu.vitengo + quotation.nano / 1e9

Gharama ya mikataba ya siku zijazo

Bei ya siku zijazo inawasilishwa kwa pointi, wakati una sarafu ya baadaye, unahitaji kujua kiwango. Na bila shaka bei katika pointi na hatua ya bei. Unapohesabu faida kutoka kwa shughuli, hii inaweza kupiga risasi, kwa sababu. ukihesabu jumla ya kiasi kwa kuzidisha bei kwa wingi. Hapa unahitaji kuwa makini. Kwa sasa, tutaona jinsi inavyoendelea. Hii inatumika kwa hatima za sarafu, katika maeneo mengine kila kitu ni sawa na hii.Tunatengeneza huduma ndogo kwa kutumia API ya Tinkoff Invest ili kufanya kazi kiotomatiki na ripoti za udalali na tume za kukokotoa. Tunatengeneza huduma ndogo kwa kutumia API ya Tinkoff Invest ili kufanya kazi kiotomatiki na ripoti za udalali na tume za kukokotoa.

soko la OTC

Soko hili lina upekee mwingi, kwa hivyo wacha tusome shughuli juu yake kando. Unapoanza shughuli za kusawazisha, itageuka kuwa unahitaji kuleta figi / ticker kwa fomu sawa ili kufanana na chombo kwa usahihi. Unapoanza kusawazisha hii na ripoti ya udalali, itabainika kuwa kitambulisho cha biashara cha shughuli hiyo hiyo kina barua mwanzoni katika shughuli na haziko kwenye ripoti ya udalali. Kwa hiyo, hawawezi kulinganishwa … ahem-ahem … kwa kulinganisha! Nililinganisha wakati wa biashara, ticker na kulinganisha kwamba tradeId moja iko kwenye nyingine. Kweli, sijui. Yeyote anayekutana na hii na anayejali kuhusu hilo, njoo kwenye suala au anza mpya.Tunatengeneza huduma ndogo kwa kutumia API ya Tinkoff Invest ili kufanya kazi kiotomatiki na ripoti za udalali na tume za kukokotoa.

Shughuli za hisabati kwenye zana

Haiwezekani, bila kuangalia, kufanya shughuli za hisabati na orodha nzima. Ili si kuongeza joto kwa laini, sisi daima kuangalia sarafu na mchakato tu kama tuna uhakika kwamba sarafu mechi, na pointi ni kubadilishwa kwa fedha taka. Silaha na maarifa juu ya kufanya kazi na nambari za benki, tutahesabu tume iliyotumiwa kwenye kila akaunti. Kama hii: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4Tunatengeneza huduma ndogo kwa kutumia API ya Tinkoff Invest ili kufanya kazi kiotomatiki na ripoti za udalali na tume za kukokotoa.    

Microservice iko tayari!

https://github.com/pskucherov/tcsstat Kama kazi ya nyumbani, unaweza kuangalia ikiwa huduma inafanya kazi na muunganisho wa polepole, wakati miunganisho imekatika, wakati Mtandao umekatika, wakati hitilafu au mipaka ya muda wa matumizi kwa wakala. 

Hitimisho na mipango ya siku zijazo

  • Nilijifunza kuhusu shughuli za kimsingi na kufanya kazi na API ya Wekeza
  • Muda uliotumika ~ masaa 10
  • Kiwango cha ugumu ~ junior+ / chini katikati 

Ikiwa utaendelea kuboresha huduma ndogo, unaweza kuishia na kitu kama hiki

https://opexbot.info

  Haya ni maendeleo yangu, kwa wale ambao ni wavivu sana kuelewa, kukimbia na kuhesabu wao wenyewe. Ninapanga kuongeza uchanganuzi hapo kwa ombi la watumiaji. Ikiwa ulipenda nakala hiyo, basi jiandikishe kwa kituo changu cha telegraph . Tunatengeneza huduma ndogo kwa kutumia API ya Tinkoff Invest ili kufanya kazi kiotomatiki na ripoti za udalali na tume za kukokotoa.

Pavel
Rate author
Add a comment

  1. Isakiiev

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

    Reply