D’Inspirateuren hannert der Entwécklung vum Statistikservice fir Tinkoff Investments waren:
- Artikel iwwer Habré “Wat Tinkoff Investitiounen net soen”
- Analyse vun de Wënsch vun de Plattform Benotzer
- en Artikel iwwer d’Berechnung vun de Kommissiounen .
- Wat wäert diskutéiert ginn?
- Entwécklung vun engem Statistik Service Schrëtt fir Schrëtt:
- Verbindung zu Tinkoff Invest API
- Zeechnen Daten aus Tinkoff Invest API an engem Browser
- Kréien Brokerage Rapporten an Transaktiounen
- GetBrokerReport
- Methode fir den Datum ze kréien, andeems Dir d’Abtraktioun vum aktuellen Datum berücksichtegt
- Rapport Generatioun Ufro
- Resultat:
- GetDividends ForeignIssuer
- GetOperationsByCursor
- Berechnung an Ausgab vun Informatioun vun Interesse
- Schafft mat Präisser
- D’Käschte vun Future Kontrakter
- OTC Maart
- Mathematesch Operatiounen op Tools
- Microservice ass prett!
- Conclusiounen a Pläng fir d’Zukunft
- https://opexbot.info
Wat wäert diskutéiert ginn?
- Nëmmen den ugewandten Deel iwwer Entwécklung.
- Real Wëssen an Erfahrung, déi ganz wichteg sinn an der Aarbecht mat finanziell Instrumenter.
- Iwwersiicht vun Themen fir ze schaffen
Also, ech wëll Handelsstatistike berechnen an et op eng bequem Manéier maachen.
Entwécklung vun engem Statistik Service Schrëtt fir Schrëtt:
- Verbindung zu Tinkoff Invest API
- Zeechnen Daten aus Tinkoff Invest API an engem Browser
- Kréien Brokerage Rapporten an Transaktiounen
- Berechnung an Ausgab vun Informatioun vun Interesse
- Conclusiounen a Pläng fir d’Zukunft
Verbindung zu Tinkoff Invest API
Fir mat der API ze verbannen, kënnt Dir all sdk aus der Dokumentatioun huelen https://github.com/Tinkoff/investAPI#sdk . Oder npm Package ` tinkoff-sdk-grpc-js `. Et ass wichteg datt de Package vun den Entwéckler op déi lescht Versioun aktualiséiert gëtt. Installéieren
npm ech tinkoff-sdk-grpc-js
Iwwerpréift
const { createSdk } = require(‘tinkoff-sdk-grpc-js’); // Token deen esou kritt ka ginn const TOKEN = ‘YOURAPI’; // Den Numm vun der Applikatioun duerch déi Dir an den TCS Logbicher fannt. const appName = ‘tcsstat’; const sdk = createSdk(TOKEN, appName); (async () => { console.log(wait sdk.users.getAccounts()); })();
Resultat: eng Lëscht vun Äre Konten gëtt an der Konsole ugewisen. Zum Beispill, loosst eis d’Nuancen analyséieren:
- An der Lëscht vun de Konten gëtt et eng “Investitiounsbank”, mat där Dir net mat der API schaffe kënnt
- Maacht weg datt d’Felder an camelCase kommen, während an der Dokumentatioun dës Felder an under_score presentéiert ginn.
- Et wäert sou iwwerall sinn, sou datt Dir net nëmmen e Feld aus der Dokumentatioun huelen a kopéieren.
Nëtzlech:
- Dir kënnt dëse Code am Projet Branche fannen
https://github.com/pskucherov/tcsstat/tree/step1 https://github.com/pskucherov/tcsstat/compare/step1
Zeechnen Daten aus Tinkoff Invest API an engem Browser
Ech hunn next.js an socket.io geholl. Dëst ass keng staark Empfehlung, wielt no Ärem Diskretioun.
npx create-next-app@läscht npm i socket.io socket.io-client
Mir ginn direkt op d’Frëndschaftsschrëtt nächste+Socket+investapi, a kuckt d’ Nëtzlech Sektioun vun dësem Schrëtt fir all Detailer. Ech wäert d’Detailer beschreiwen:
- Op der Nodejs (Server) Säit gëtt et eng Säiten/api/investapi.js Datei. Dëst ass wou mir den socket.io Server erstellen a mat investapi verbannen.
- Op der Säit vum Browser (Client) verbannen mir mam Server iwwer e Socket a froen Kontodaten vum Broker.
- Mir kréien Daten vum Broker um Server, schéckt se dann un de Client. Wann se op de Client kritt ginn, gi se am Browser ugewisen.
Resultat: an der Browserkonsole kënne mir Informatioun iwwer Konten gesinn. Dat ass, am leschte Schrëtt hu mir Informatiounen iwwer Konten an der Serverkonsole (nodejs) gesinn, am aktuelle Schrëtt hu mir dës Informatioun un de Client (Browser) transferéiert.
Loosst eis elo esou maachen datt Dir e Kont aus dem Browser auswielen kënnt, a wann et keen Token ass, da gëtt e Feeler op d’Konsole geschéckt. D’Aarbecht ass einfach an näischt Neies, also ginn ech nëmmen Linken op Verpflichtungen
- https://github.com/pskucherov/tcsstat/commit/7e1ac57061e5e971588479015b06d8814d6609a9
- https://github.com/pskucherov/tcsstat/commit/b28ac973a57494f5232589b4cb6b9fb13b8af759
Nëtzlech:
- Wéi Frënn nächste an Socket ze maachen ass am Detail hei beschriwwen .
- Frëndschaftscode nächst+Socket+investapi:
https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Fir deen dat hei uewe schwéier ass, da bleiwe mir op dëser Etapp a këmmere sech mam Code. Wann Dir Froen hutt – frot. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2
Kréien Brokerage Rapporten an Transaktiounen
Et ginn dräi Methoden fir Brokerageberichter an Transaktiounen ze kréien
Vun Ufank un ass et wichteg ze wëssen:
- De Brokeragebericht gëtt am T-3 Modus generéiert, d.h. Händler ginn do no hirer aktueller Ausféierung ugewisen.
- Deementspriechend, wann Dir dëse Bericht fir déi lescht zwee Deeg ufrot, ass en an dräi Deeg fäerdeg.
- Fir Deals fir déi lescht Deeg ze maachen, benotze mir d’Method fir Operatiounen z’empfänken, awer drun erënneren datt hir ID an Inhalt no der Bildung vum Brokeragebericht änneren.
GetBrokerReport
Fir e Brokeragebericht ze kréien, musst Dir d’Kont ID, den Startdatum an den Enndatum vum Bericht huelen, awer net méi wéi 31 Deeg. Mir schécken eng Ufro fir e Bericht un d’API ze generéieren am Generéiere _broker_report_request , kritt eng TaskId als Äntwert. Duerno, mat dëser TaskId, kréien mir Daten aus get _broker_report_response.
- Dir musst den TaskID fir ëmmer genau fir dës Datume späicheren.
- Well wann Dir et verléiert, da fir déi ugefrote Datume kënnt de Bericht als Äntwert op d’Generatiounsufro,
- An da kënnt et guer net.
[/ Spoiler] Loosst eis ufänken Code ze schreiwen
Methode fir den Datum ze kréien, andeems Dir d’Abtraktioun vum aktuellen Datum berücksichtegt
const getDateSubDay = (subDay = 5, Start = richteg) => { const date = neien Datum (); date.setUTCDate(date.getUTCDate() – subDay); wann (Start) { date.setUTCHours (0, 0, 0, 0); } anescht { date.setUTCHours(23, 59, 59, 999); } Retour Datum; };
Rapport Generatioun Ufro
const brokerReport = await (sdk.operations.getBrokerReport)({ generateBrokerReportRequest: { accountId, from, to, }, });
Resultat:
- Als Resultat vun der éischter Ausféierung vum Kommando kréie mir den taskId.
- De Bericht fänkt un op der Säit vum Broker ze generéieren. Wann et fäerdeg ass onbekannt, mir waarden a periodesch zéien d’TaskId an Erwaardung vum Bericht.
- Firwat? Well wann de Bericht net fäerdeg ass, gëtt e Feeler. Wann de Bericht net fäerdeg ass op der Säit vum Broker, dann ass dëst e Feeler an Ärem Code. Veraarbecht w.e.g.: 30058|INVALID_ARGUMENT|Aufgab nach net ofgeschloss, probéiert w.e.g. méi spéit nach eng Kéier
De Code fir ze waarden an e Bericht ze kréien gesäit sou aus.
const Timer = async Zäit => { zréckginn nei Verspriechen (léisen => setTimeout (léisen, Zäit)); } const getBrokerResponseByTaskId = async (taskId, page = 0) => { probéieren { return await (sdk.operations.getBrokerReport)({ getBrokerReportRequest: { taskId, page, }, }); } catch (e) { console.log(‘wait’, e); waarden Timer (10000); zréck waarden getBrokerResponseByTaskId (taskId, Säit); } };
Da geschitt déi selwecht Magie. Mir stoppen eise Skript, fänken et erëm un, mir hu keen TaskId. Mir féieren de Code mat der TaskId Ufro aus, awer mir kréien net méi den TaskId, awer direkt de Bericht. Magie! An alles wier gutt wann et ëmmer esou wier. Awer an engem Mount gëtt et guer keng Daten. Nëtzlech :
- E bëssen Theorie gëtt hei an hei duergestallt .
- Wann Dir de Code zesumme setzt, wäert den Entworf esou ausgesinn.
https://github.com/pskucherov/tcsstat/tree/step3.1 https://github.com/pskucherov/tcsstat/compare/step3.1
- Wann iergendeen dëst begéint, da wëllkomm op d’Thema . Nodeems se dës Magie gefléckt hunn, verléiert se seng Kraaft a wäert iergendwéi anescht sinn. Mee am Moment (21.03.2023) funktionéiert et grad esou.
GetDividends ForeignIssuer
Eppes kéint mengen datt d’Method ähnlech wéi déi virdrun ass an Dir kënnt eng eenzeg Method benotzen an där Dir nëmmen den Numm vun den Operatiounen ännert. Awer si hunn net virgestallt! Den Numm do ass ganz anescht souwuel an de Methoden wéi an der zréckginn Informatioun. An d’Zuel vun de Säiten fänkt vun 0 un, dann vun 1. Fir net an all deem duercherneen ze ginn, ass et méi einfach zwou verschidde Methoden ze schreiwen. Wat komesch ass, well d’Logik vun der Aarbecht ass déiselwecht. Ech spatzen fir eng laang Zäit wann ech probéiert eng Method ze maachen an et war manner Code. Et gëtt keng Beispiller hei.
GetOperationsByCursor
Meng Léifsten vun den dräi. Obwuel net déi genee, mä déi adäquate. Mir maachen eng Ufro vun Ufank un e Kont op de maximal méiglechen Datum ze kreéieren (e Kont zoumaachen oder den aktuellen). Mir kréien d’Äntwert, huelt de Cursor a froen nei soulaang et Daten gëtt. An de Code ass méi präzis wéi an de Beispiller hei uewen.
const Timer = async Zäit => { zréckginn nei Verspriechen (léisen => setTimeout (léisen, Zäit)); } const getOperationsByCursor = async (sdk, accountId, from, to, cursor = ”) => { probéieren { const reqData = { accountId, from, to, limit: 1000, state: sdk.OperationState.OPERATION_STATE_EXECUTED, withoutCommissions: false, ouni Handel: falsch, ouni Iwwernuechtungen: falsch, Cursor, }; zréck await sdk.operations.getOperationsByCursor(reqData); } catch (e) { wait timer(60000); zréck waart op getOperationsByCursor(sdk, accountId, from, to, cursor = ”); } };
Den Entworf fir ze lafen ass hei: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Elo si mir prett fir Empfangsoperatiounen derbäi ze ginn eis Applikatioun. Wann et richteg gemaach gëtt, da musst Dir Brokerageberichter fir d’ganz Existenz vum Kont kréien. A fir déi fehlend Donnéeën, déiselwecht T-3s, lued vun Operatiounen nei. Mä dëst kann an engem separaten Artikel getrennt ginn. Vun den Haaptnuancen, déi Dir begéint, ass d’Operatiounen an e Brokerage-Bericht ze pechen.
- Wann Dir haut e Brokeragebericht an Transaktioune fir déi erfuerderlech Datume kritt hutt, setzt se alles an der Datebank, da gëtt et keng Probleemer.
- Dir wäert muer Problemer hunn wann Dir den nächsten Deel vun Daten aus dem Bericht an Operatiounen kritt an entscheet se mat der existéierender Datebank ze synchroniséieren.
- Vill Nuancen iwwer Mëssverständis oder Änneren vun ID no der Veraarbechtung
- Dann fir den OTC Maart passen d’Iden guer net.
- Wéi och d’Nuancen vun Synchroniséierungsinstrumenter, déi erëm net zesummekommen, duerch d’Besonderheet vun der API. Awer dat ass eng aner Geschicht.
Loosst eis d’Informatioun iwwer Operatiounen op eis Applikatioun addéieren. D’Haaptfro ass wou d’Donnéeë veraarbecht a gespäichert ginn.
- Wann Dir et fir Iech selwer maacht, verbraucht Dir déiselwecht Daten vu verschiddenen Apparater. Da musst Dir Daten um Server veraarbecht a späicheren.
- Wann Dir vill verschidden Daten verbraucht vu ville verschiddene Benotzer, da musst Dir entscheeden wat méi wichteg ass: d’Geschwindegkeet vun de Benotzer oder d’Spuer vum Eisen op Ärer Säit. Wien eng onendlech Quantitéit un Hardware leeschte kann, zielt alles op sengem Server a mécht et super séier fir d’Benotzer, spuert de Benotzer Ressourcen, wéi Batterie a Traffic, wat op Telefonen ganz wichteg ass.
Am Tour, am Browser zielen ass am Prinzip net déi optimal Léisung. Dofir, wat net deier ass, betruechte mir et op eisem Server. De Rescht loossen mir dem Client iwwerloossen. Ech wëll wierklech d’Kommissioun op de Server ze huelen an auszerechnen. Awer hei kënnt d’Nuance genannt “Interaktivitéit”. Loosst eis soen datt Dir Dausende vun Operatiounen hutt an et dauert fënnef Minutten fir se ze kréien. Wat wäert de Benotzer zu dëser Zäit hunn? Spinner? Fortschrëtt? Infa iwwer wéi vill gouf eropgelueden? Et ass ideal fir “aktiv Waarden” ze benotzen wann de Benotzer am Prozess schonn eppes gesinn. Hei ass d’Resultat:
- Säit Luede
- All Rechnungen sinn gefrot
- Duerno ginn all Transaktioune mat Kommissiounen fir ausgefouert Transaktioune fir all Konte gefrot. Wéi d’Donnéeën opgeholl ginn, ginn se am Browser gemaach.
Fir d’Daten net all Kéier an den Eventer ze filteren, zéie mir eisen eegenen Event fir all Kont. Esou:
socket.emit(‘sdk:getOperationsCommissionResult_’ + accountId, { items: data?.items, inProgress: Boolean(nextCursor), });
Den Entworf fir ze lancéieren ass hei: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Fuert weider. Et ass super datt Dir dës Linn gelies hutt!
Berechnung an Ausgab vun Informatioun vun Interesse
Hänkt dovun of wien wéi eng Informatioun brauch. Dofir soen ech Iech direkt d’Haaptnuancen déi Dir wäert begéinen.
Schafft mat Präisser
Jiddereen dee mat Finanzen schafft weess datt Geldtransaktiounen nëmme mat ganzen Zuelen ausgefouert ginn. Wéinst der Ongenauegkeet vun de Wäerter nom Dezimalpunkt an de kumulative Feeler mat enger grousser Zuel vun Operatiounen. Dofir sinn all Präisser am folgende MoneyValue Format presentéiert
Feld | Typ | Beschreiwung |
---|---|---|
Währung | String | String ISO Währungscode |
Unitéiten | eng 64 | Ganzen Deel vun der Zomm, kann eng negativ Zuel ginn |
nano | eng 32 | Fraktiounsdeel vum Betrag, kann eng negativ Zuel sinn |
Mir veraarbechten se separat, bréngen se dann op de Präiswäert:
quotation.units + quotation.nano / 1e9
D’Käschte vun Future Kontrakter
De Präis vun de Futures gëtt a Punkte presentéiert, wann Dir eng WährungsZukunft hutt, musst Dir den Taux wëssen. An natierlech de Präis a Punkten an de Präis Schrëtt. Wann Dir de Gewënn vun Transaktiounen berechent, dëst kann schéissen, well. wann Dir de Gesamtbetrag berechent andeems Dir de Präis mat der Quantitéit multiplizéiert. Hei musst Dir virsiichteg sinn. Fir de Moment kucke mer wéi et geet. Dat gëllt fir Währungsfutures, op anere Plazen ass alles an der Rei.
OTC Maart
Dëse Maart huet vill Besonneschheeten, also loosst eis d’Operatiounen op et separat studéieren. Wann Dir ufänkt Operatiounen ze synchroniséieren, wäert et erausstellen datt Dir Figi / Ticker an déiselwecht Form muss bréngen fir dat Instrument richteg ze passen. Wann Dir ufänkt dëst mat dem Brokeragebericht ze synchroniséieren, wäert et erausstellen datt d’TradeID vun der selwechter Transaktioun Buschtawen am Ufank an den Transaktiounen huet a si sinn net am Brokeragebericht. Dofir kënnen se net verglach ginn … ahem-ahem … am Verglach! Ech hunn d’Handelszäit ugepasst, Ticker a passend datt een TradeId an engem aneren enthält. Richteg, ech weess et net. Ween dat begéint a wien sech doriwwer këmmert, kommt op d’Thema oder start en neit.
Mathematesch Operatiounen op Tools
Et ass onméiglech, ouni ze kucken, mathematesch Operatiounen mat der ganzer Lëscht auszeféieren. Fir net waarm ze mëll ze addéieren, kontrolléieren mir ëmmer d’Währung an d’Veraarbechtung nëmmen wa mir sécher sinn datt d’Währung entsprécht, an d’Punkte ginn an déi gewënschte Währung ëmgerechent. Bewaffnet mat Wëssen iwwer d’Aarbecht mat Banknummeren, wäerte mir d’Kommissioun berechnen, déi op jiddereng vun de Konten ausginn. Wéi dëst: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4
Microservice ass prett!
https://github.com/pskucherov/tcsstat Als Hausaufgab kënnt Dir kucken ob de Service mat enger lueser Verbindung funktionnéiert, wann d’Verbindunge gebrach sinn, wann den Internet ofgeschloss ass, wann Feeler oder ofgelaaf Limiten vum Broker sinn.
Conclusiounen a Pläng fir d’Zukunft
- Léiert iwwer Basis Operatiounen a schafft mat der Invest API
- Zäit verbraucht ~ 10 Stonnen
- Schwieregkeetsniveau ~ Junior + / niddereg Mëtt
Wann Dir weider de Mikroservice raffinéiert, kënnt Dir mat esou eppes ophalen
https://opexbot.info
Dëst ass meng Entwécklung, fir déi, déi ze faul sinn fir se selwer ze verstoen, lafen a zielen. Ech plangen Analyse do op Ufro vun de Benotzer ze addéieren. Wann Dir den Artikel gär hutt, da abonnéiert Iech op mäi Telegram Kanal .
Полезная статья. Не могу представить, сколько усилий автора потребовалось, чтобы все описать. Благодарю.