Tinkoff Investments-en estatistika-zerbitzuaren garapenaren bultzatzaileak hauek izan ziren:
- Habréri buruzko artikulua “Tinkoff Investments-ek esaten ez duena”
- plataformako erabiltzaileen nahiak aztertzea
- komisioen kalkuluari buruzko artikulua .
- Zer eztabaidatuko da?
- Estatistika-zerbitzua urratsez urrats garatzea:
- Tinkoff Invest APIrako konexioa
- Tinkoff Invest APIko datuak arakatzaile batean marraztea
- Bitartekaritza-txostenak eta transakzioak jasotzea
- EskuratuBrokerReport
- Data lortzeko metodoa, uneko datatik kenketa kontuan hartuta
- Txostena sortzeko eskaera
- Emaitza:
- GetDividendsForeignIssuer
- GetOperationsByCursor
- Intereseko informazioa kalkulatzea eta ateratzea
- Prezioekin lan egitea
- Etorkizuneko kontratuen kostua
- OTC merkatua
- Tresnei buruzko eragiketa matematikoak
- Mikrozerbitzua prest dago!
- Ondorioak eta etorkizunerako planak
- https://opexbot.info
Zer eztabaidatuko da?
- Garapenari buruzko atala soilik.
- Benetako ezagutza eta esperientzia, finantza-tresnekin lan egiteko oso garrantzitsuak direnak.
- Landu beharreko gaien ikuspegi orokorra
Beraz, merkataritza-estatistikak kalkulatu eta modu erosoan egin nahi ditut.
Estatistika-zerbitzua urratsez urrats garatzea:
- Tinkoff Invest APIrako konexioa
- Tinkoff Invest APIko datuak arakatzaile batean marraztea
- Bitartekaritza-txostenak eta transakzioak jasotzea
- Intereseko informazioa kalkulatzea eta ateratzea
- Ondorioak eta etorkizunerako planak
Tinkoff Invest APIrako konexioa
APIra konektatzeko, https://github.com/Tinkoff/investAPI#sdk dokumentaziotik edozein sdk har dezakezu . Edo npm paketea ` tinkoff-sdk-grpc-js `. Garrantzitsua da paketea garatzaileek azken bertsiora eguneratzea. Instalatu
npm eta tinkoff-sdk-grpc-js
Egiaztatzea
const { createSdk } = require(‘tinkoff-sdk-grpc-js’); // Honela lor daitekeen tokena const TOKEN = ‘YOURAPI’; // TCS erregistroetan aurki dezakezun aplikazioaren izena. const appName = ‘tcsstat’; const sdk = createSdk(TOKEN, appName); (async () => { console.log(itxaron sdk.users.getAccounts()); })();
Emaitza: zure kontuen zerrenda bistaratuko da kontsolan. Adibidez, azter ditzagun ñabardurak:
- Kontuen zerrendan “Inbertsio bankua” dago, eta horrekin ezin duzu lan egin APIa erabiliz
- Kontuan izan eremuak camelCase-n datozela, dokumentazioan, berriz, eremu horiek under_score-an agertzen direla.
- Horrela izango da nonahi, beraz, ezin duzu dokumentazioko eremu bat hartu eta kopiatu.
Erabilgarria:
- Kode hau proiektuaren adarrean aurki dezakezu
https://github.com/pskucherov/tcsstat/tree/step1 https://github.com/pskucherov/tcsstat/compare/step1
Tinkoff Invest APIko datuak arakatzaile batean marraztea
Next.js eta socket.io hartu nituen. Hau ez da gomendio sendoa, aukeratu zure diskrezioan.
npx create-next-app@latest npm i socket.io socket.io-client
Berehala jarraitzen dugu adiskidetasun urratsera hurrengo+socket+investapi, eta ikusi urrats honen Erabilgarria atala xehetasun guztietarako. Xehetasunak deskribatuko ditut:
- Nodejs (zerbitzaria) aldean, pages/api/investapi.js fitxategi bat dago. Hemen socket.io zerbitzaria sortzen dugu eta investapi-ra konektatzen gara.
- Arakatzailearen (bezeroaren) aldean, socket baten bidez zerbitzariarekin konektatzen gara eta brokerari kontuaren datuak eskatzen dizkiogu.
- Agentearen datuak zerbitzarian jasotzen ditugu, gero bezeroari bidaltzen dizkiogu. Bezeroan jasotzen direnean, arakatzailean bistaratzen dira.
Emaitza: arakatzailearen kontsolan kontuei buruzko informazioa ikus dezakegu. Hau da, azken urratsean zerbitzariaren kontsolan (nodejs) kontuei buruzko informazioa ikusi genuen, oraingo urratsean informazio hori bezeroari (nabigatzaileari) transferitu genion.
Orain egin dezagun arakatzailetik kontu bat hauta dezazun, eta tokenrik ez badago, errore bat bidaliko da kontsolara. Lana sinplea da eta ez da berria, beraz estekak soilik ematen ditut konpromezuetarako
- https://github.com/pskucherov/tcsstat/commit/7e1ac57061e5e971588479015b06d8814d6609a9
- https://github.com/pskucherov/tcsstat/commit/b28ac973a57494f5232589b4cb6b9fb13b8af759
Erabilgarria:
- Nola egin lagunak hurrengo eta entxufea xehetasunez deskribatzen da hemen .
- Adiskidetasun kodea hurrengo+socket+investapi:
https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Goiko hori zaila denarentzat, fase honetan geratzen gara eta kodeari aurre egiten diogu. Galderarik baduzu – galdetu. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2
Bitartekaritza-txostenak eta transakzioak jasotzea
Bitartekaritza-txostenak eta transakzioak jasotzeko hiru metodo daude
Hasiera-hasieratik garrantzitsua da jakitea:
- Bitartekaritza txostena T-3 moduan sortzen da, hau da. merkataritzak bertan bistaratzen dira benetako exekuzioaren ondoren.
- Horrenbestez, txosten hori azken bi egunetarako eskatuz gero, hiru egunetan prest egongo da.
- Azken egunetako eskaintzak egiteko, eragiketak jasotzeko metodoa erabiltzen dugu, baina gogoratu haien IDa eta edukia alda daitezkeela bitartekaritza txostena eratu ondoren.
EskuratuBrokerReport
Bitartekaritza-txostena lortzeko, kontuaren IDa, hasiera-data eta txostenaren amaiera-data hartu behar dituzu, baina gehienez 31 egun. Txosten bat sortzeko eskaera bat bidaltzen dugu APIra generate _broker_report_request , erantzun gisa taskId bat. Horren ostean, taskId hau erabiliz, get _broker_report_response-tik datuak lortzen ditugu.
- TaskID gorde behar duzu betirako data hauetarako.
- Galtzen baduzu, eskatutako datetarako txostena lehenik belaunaldi eskaerari erantzunez etorriko da,
- Eta orduan ez da batere etorriko.
Data lortzeko metodoa, uneko datatik kenketa kontuan hartuta
const getDateSubDay = (azpiEguna = 5, hasiera = egia) => { const data = data berria (); date.setUTCDate(date.getUTCDate() – azpiEguna); if (hasiera) { date.setUTCHours (0, 0, 0, 0); } else { date.setUTCHours (23, 59, 59, 999); } itzulera data; };
Txostena sortzeko eskaera
const brokerReport = itxaron (sdk.operations.getBrokerReport) ({ generateBrokerReportRequest: { accountId, from, to, }, });
Emaitza:
- Komandoaren lehen exekuzioaren ondorioz, taskId-a lortuko dugu.
- Txostena brokerren aldetik sortzen hasten da. Prest dagoenean ezezaguna denez, itxaron egiten dugu eta aldian-aldian taskId-a aterako dugu txostenaren aurrean.
- Zergatik? Txostena prest ez badago errore bat botatzen duelako. Txostena bitartekariaren aldetik prest ez badago, zure kodean errore bat da. Mesedez, prozesatu: 30058|INVALID_ARGUMENT|zereginak oraindik ez dira amaitu, saiatu berriro geroago
Txosten bat itxaron eta jasotzeko kodeak honelako itxura du.
const timer = denbora asinkronikoa => { itzuli promesa berria (ebatzi => ezarriTimeout (ebatzi, denbora)); } const getBrokerResponseByTaskId = async (taskId, page = 0) => { saiatu { return await (sdk.operations.getBrokerReport)({ getBrokerReportRequest: { taskId, page, }, }); } catch (e) { console.log(‘itxaron’, e); itxaron tenporizadorea (10000); return await getBrokerResponseByTaskId(taskId, orria); } };
Orduan magia bera gertatzen da. Gure gidoia gelditzen dugu, berriro hasten dugu, ez dugu taskId bat. taskId eskaerarekin kodea exekutatzen dugu, baina jada ez dugu taskId-a lortzen, berehala txostena baizik. Magia! Eta dena ondo legoke beti horrela izango balitz. Baina hilabete barru ez da batere daturik egongo. Erabilgarria :
- Teoria pixka bat azaltzen da hemen eta hemen .
- Kodea elkartuta, zirriborroak horrelako itxura izango du.
https://github.com/pskucherov/tcsstat/tree/step3.1 https://github.com/pskucherov/tcsstat/compare/step3.1
- Norbaitek hau topatzen badu, ongi etorri gaira . Magia hau konpondu ondoren, boterea galduko du eta nolabait ezberdina izango da. Baina une honetan (2023/03/21) horrela funtzionatzen du.
GetDividendsForeignIssuer
Norbaitek pentsa lezake metodoa aurrekoaren antzekoa dela eta eragiketen izena bakarrik alda dezakezun metodo bakarra erabil dezakezu. Baina ez zuten asmatu! Han izendapena oso ezberdina da bai metodoetan eta baita itzulitako informazioan ere. Eta orrialdeen zenbaketa 0tik hasten da, gero 1etik. Honetan guztian ez nahasteko, errazagoa da bi metodo ezberdin idaztea. Arraroa dena, zeren lanaren logika berdina da. Denbora luzez tu egin nuen metodo bat egiten saiatzen nintzenean eta kode gutxiago zegoen. Hemen ez da adibiderik egongo.
GetOperationsByCursor
Nire hiruretatik gogokoena. Zehatzenak ez diren arren, egokienak baizik. Eskaera bat egiten dugu kontu bat sortzen hasten denetik ahalik eta data gehienera arte (kontu bat ixtea edo oraingoa). Erantzuna lortzen dugu, kurtsorea hartu eta berriro eskatuko dugu datuak dauden bitartean. Eta kodea goiko adibideetan baino zehatzagoa da.
const timer = denbora asinkronikoa => { itzuli promesa berria (ebatzi => ezarriTimeout (ebatzi, denbora)); } const getOperationsByCursor = async (sdk, accountId, from, to, cursor = ”) => { saiatu { const reqData = { accountId, from, to, limit: 1000, state: sdk.OperationState.OPERATION_STATE_EXECUTED, withoutCommissions: false, gabeTrades: false, withoutOvernights: false, kurtsorea, }; return await sdk.operations.getOperationsByCursor(reqData); } catch (e) { await timer (60000); return await getOperationsByCursor (sdk, accountId, from, to, kurtsorea = ”); } };
Exekutatu beharreko zirriborroa hemen dago: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Orain prest gaude jasotzeko eragiketak gehitzeko. gure aplikazioa. Ondo egiten bada, kontuaren existentzia osorako bitartekaritza-txostenak lortu behar dituzu. Eta falta diren datuetarako, T-3 horiek bera, eragiketetatik birkargatu. Baina hau artikulu bereizi batean bereiz daiteke. Topatuko dituzun ñabardura nagusien artean, eragiketak eta bitartekaritza txostena itsastea da.
- Gaur bitartekaritza txostena eta eskatutako datetarako transakzioak jaso badituzu, jarri datu-basean, orduan ez dago arazorik.
- Arazoak izango dituzu bihar txostenaren eta eragiketen hurrengo datuen zatia jaso eta lehendik dagoen datu-basearekin sinkronizatzea erabakitzen duzunean.
- Ñabardura asko prozesatu ondoren id bat ez datorrela edo aldatzeari buruz
- Ondoren, OTC merkaturako, id-ak ez datoz batere bat.
- Baita tresna sinkronizatzaileen ñabardurak ere, berriro ere bat ez datozenak, APIaren berezitasunak direla eta. Baina hori beste istorio bat da.
Gehi diezaiogun eragiketei buruzko informazioa eskuratzea gure aplikazioan. Galdera nagusia datuak non prozesatu eta gordeko diren izango da.
- Zuk zeuk egiten baduzu, gailu ezberdinetako datu berdinak kontsumituko dituzu. Ondoren, datuak prozesatu eta gorde behar dituzu zerbitzarian.
- Erabiltzaile ezberdin askok kontsumitutako datu asko badituzu, orduan erabaki behar duzu zer den garrantzitsuena: erabiltzaileen abiadura edo zure alboko burdina aurreztea. Hardware kopuru infinitua ordaindu dezakeenek bere zerbitzarian dagoen guztia zenbatzen du eta oso azkar egiten du erabiltzaileentzat, erabiltzailearen baliabideak aurrezten ditu, hala nola bateria eta trafikoa, telefonoetan oso garrantzitsua dena.
Bestalde, arakatzailean kontatzea ez da irtenbiderik egokiena printzipioz. Horregatik, garestia ez dena, gure zerbitzarian kontuan hartzen dugu. Gainerakoa bezeroaren esku uzten dugu. Benetan nahi dut zerbitzarian komisioa hartu eta kalkulatu. Baina hemen dator “interaktibitatea” izeneko ñabardura. Demagun milaka operazio egiten dituzula eta horiek jasotzeko bost minutu behar dituzula. Zer izango du erabiltzaileak momentu honetan? Spinner? Aurrerapena? Infa zenbat igo zen? “Itxaron aktiboa” erabiltzea aproposa da prozesuan dagoen erabiltzaileak zerbait ikusi dezakeenean. Hona hemen Emaitza:
- Orria kargatzen
- Faktura guztiak eskatzen dira
- Horren ondoren, gauzatutako transakzioetarako komisioak dituzten transakzio guztiak eskatzen dira kontu guztietarako. Datuak jasotzen diren heinean, nabigatzailean errendatzen dira.
Gertaeren datuak aldi bakoitzean ez iragazteko, gure gertaera propioa ateratzen dugu kontu bakoitzeko. Horrela:
socket.emit(‘sdk:getOperationsCommissionResult_’ + accountId, { items: data?.items, inProgress: Boolean(nextCursor), });
Abian jartzeko zirriborroa hemen dago: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Aurrera. Oso ona da lerro hau irakurri izana!
Intereseko informazioa kalkulatzea eta ateratzea
Zein informazio behar duenaren araberakoa da. Horregatik, berehala kontatzen dizkizut topatuko dituzun ñabardura nagusiak.
Prezioekin lan egitea
Finantzarekin lan egiten duten guztiek badakite diru-transakzioak zenbaki osoekin soilik egin behar direla. Zenbaki hamartarraren ondoko balioen zehaztasunik eza eta eragiketa ugarirekin metatutako errorea dela eta. Horregatik prezio guztiak hurrengo MoneyValue formatuan aurkezten dira
eremua | mota | Deskribapena |
---|---|---|
moneta | katea | String ISO moneta kodea |
unitateak | int64 | Baturaren zati osoa, zenbaki negatiboa izan daiteke |
nano | int32 | Zenbateko zati zatikoa, zenbaki negatiboa izan daiteke |
Bereiz prozesatzen ditugu, gero prezioaren baliora eramaten ditugu:
aurrekontua.unitateak + kotizazioa.nano / 1e9
Etorkizuneko kontratuen kostua
Etorkizunen prezioa puntutan aurkezten da, moneta etorkizuna duzunean, tasa jakin behar duzu. Eta noski prezioa puntutan eta prezioaren urratsa. Transakzioen irabazia kalkulatzen duzunean, hau tiro egin daiteke, zeren. zenbateko osoa prezioa kantitateaz biderkatuz kalkulatzen baduzu. Hemen kontuz ibili behar duzu. Oraingoz, ikusiko dugu nola doan. Hau moneta-etorkizunei aplikatzen zaie, beste leku batzuetan dena ondo dago honekin.
OTC merkatua
Merkatu honek berezitasun asko ditu, beraz, azter ditzagun bere eragiketak bereizita.Eragiketak sinkronizatzen hasten zarenean, figura / ticker forma berera eraman behar duzula ikusiko da, tresnarekin behar bezala lotzeko. Bitartekaritza-txostenarekin sinkronizatzen hasten zarenean, transakzio bereko ID-ak letrak dituela transakzioetan hasieran eta ez daude bitartekaritza-txostenean. Beraz, ezin dira alderatu… ejem-jem… konparazioz! TradeId bat beste batean dagoen merkataritza-denbora, ticker-a eta bat etortzea bat egin nuen. Ondo, ez dakit. Honekin topo egiten duenak eta axola zaionak, etorri gaira edo hasi berri bat.
Tresnei buruzko eragiketa matematikoak
Ezinezkoa da, begiratu gabe, zerrenda osoarekin eragiketa matematikoak egitea. Epelak bigunak ez gehitzeko, moneta egiaztatzen dugu beti eta prozesatzen dugu moneta bat datorrela ziur baldin bagara eta puntuak nahi duzun moneta bihurtzen badira. Banku-zenbakiekin lan egiteko ezagutzaz hornituta, kontu bakoitzean gastatutako komisioa kalkulatuko dugu. Honela: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4
Mikrozerbitzua prest dago!
https://github.com/pskucherov/tcsstat Etxeko lan gisa, zerbitzuak konexio motelarekin funtzionatzen duen egiaztatu dezakezu, konexioak eten direnean, Internet deskonektatuta dagoenean, akatsak edo artekariaren mugak iraungi direnean.
Ondorioak eta etorkizunerako planak
- Oinarrizko eragiketak eta Invest APIarekin lan egiten ikasi
- Iraupena ~ 10 ordu
- Zailtasun maila ~ junior+ / ertain baxua
Mikrozerbitzua hobetzen jarraitzen baduzu, baliteke horrelako zerbait izatea
https://opexbot.info
Hau da nire garapena, beren kabuz ulertzeko, korrika egiteko eta kontatzeko nagiegiak direnentzat. Bertan analitikoak gehitzeko asmoa dut erabiltzaileek hala eskatuta. Artikulua gustatu bazaizu, harpidetu nire telegram kanalera .
Полезная статья. Не могу представить, сколько усилий автора потребовалось, чтобы все описать. Благодарю.