Inspirator tukangeun pamekaran jasa statistik pikeun Tinkoff Investments nyaéta:
- artikel ngeunaan Habré “Naon Tinkoff Investments teu nyebutkeun”
- analisis kahayang pamaké platform
- artikel ngeunaan itungan komisi .
- Naon anu bakal dibahas?
- Ngembangkeun jasa statistik léngkah-léngkah:
- Sambungan ka Tinkoff Investasi API
- Ngagambar data tina Tinkoff Invest API dina browser
- Narima laporan brokerage sarta transaksi
- GetBrokerReport
- Métode pikeun meunangkeun tanggal, nyandak kana akun pangurangan ti tanggal ayeuna
- pamundut generasi laporan
- Hasilna:
- GetDividendsForeignIsuer
- GetOperationsByCursor
- Itungan jeung kaluaran informasi dipikaresep
- Gawe sareng harga
- Biaya kontrak futures
- pasar OTC
- Operasi matematik dina alat
- Microservice geus siap!
- Kacindekan jeung rencana pikeun mangsa nu bakal datang
- https://opexbot.info
Naon anu bakal dibahas?
- Ngan bagian dilarapkeun ngeunaan pangwangunan.
- Pangaweruh sareng pangalaman nyata, anu penting pisan dina damel sareng instrumen kauangan.
- Tinjauan masalah pikeun digarap
Janten, abdi hoyong ngitung statistik perdagangan sareng ngalakukeunana dina cara anu merenah.
Ngembangkeun jasa statistik léngkah-léngkah:
- Sambungan ka Tinkoff Investasi API
- Ngagambar data tina Tinkoff Invest API dina browser
- Narima laporan brokerage sarta transaksi
- Itungan jeung kaluaran informasi dipikaresep
- Kacindekan jeung rencana pikeun mangsa nu bakal datang
Sambungan ka Tinkoff Investasi API
Pikeun nyambung ka API, anjeun tiasa nyandak SDK wae tina dokuméntasi HTTPS://github.com/Tinkoff/investAPI#sdk . Atanapi pakét npm ` tinkoff-sdk-grpc-js` . Kadé pakét diropéa kana versi panganyarna ku pamekar. Masang
npm kuring tinkoff-sdk-grpc-js
Mariksa
const {createSdk} = merlukeun ( ‘tinkoff-sdk-grpc-js’); // Token anu tiasa dicandak sapertos const TOKEN = ‘YOURAPI’; // Nami aplikasi dimana anjeun tiasa dipendakan dina log TCS. const appName = ‘tcsstat’; const sdk = createSdk(TOKEN, appName); (async () => { console.log(await sdk.users.getAccounts()); })();
Hasilna: daptar akun anjeun bakal ditingalikeun dina konsol. Contona, hayu urang nganalisis nuances:
- Dina daptar rekening aya “bank Investasi”, jeung nu teu bisa dianggo maké API
- Perhatikeun yén widang datangna dina camelCase, sedengkeun dina dokuméntasi widang ieu dibere under_score.
- Éta bakal sapertos kieu dimana-mana, janten anjeun henteu tiasa ngan ukur nyandak sareng nyalin lapangan tina dokuméntasi.
Mangpaat:
- Anjeun tiasa mendakan kode ieu dina cabang proyék
https://github.com/pskucherov/tcsstat/tree/step1 https://github.com/pskucherov/tcsstat/compare/step1
Ngagambar data tina Tinkoff Invest API dina browser
Kuring nyandak next.js sareng socket.io. Ieu sanés rekomendasi anu kuat, pilih kana kawijaksanaan anjeun.
npx create-next-app@ latest npm i socket.io socket.io-client
Urang langsung neruskeun kana hambalan silaturahim salajengna + stop kontak + investapi, tur tingal bagian Mangpaat hambalan ieu pikeun sakabéh rinci. Kuring bakal ngajelaskeun rinci:
- Di sisi nodejs (server), aya file pages/api/investapi.js. Ieu dimana urang nyieun server socket.io tur sambungkeun ka investapi.
- Di sisi browser (klien), urang nyambung ka server liwat stop kontak sareng nyuhunkeun data akun ti calo.
- Kami nampi data ti calo dina server, teras kirimkeun ka klien. Nalika aranjeunna nampi kana klien, aranjeunna ditampilkeun dina browser.
Hasilna: dina konsol browser urang tiasa ningali inpormasi ngeunaan akun. Nyaéta, dina léngkah anu terakhir, urang ningali inpormasi ngeunaan akun dina konsol server (nodejs), dina léngkah ayeuna, urang mindahkeun inpormasi ieu ka klien (browser).
Ayeuna hayu urang ngajantenkeun anjeun tiasa milih akun tina browser, sareng upami teu aya token, teras kasalahan dikirim ka konsol. Gawéna basajan sareng teu aya anu énggal, janten kuring ngan ukur masihan tautan pikeun komitmen
- https://github.com/pskucherov/tcsstat/commit/7e1ac57061e5e971588479015b06d8814d6609a9
- https://github.com/pskucherov/tcsstat/commit/b28ac973a57494f5232589b4cb6b9fb13b8af759
Mangpaat:
- Kumaha carana sangkan babaturan hareup jeung stop kontak dijelaskeun di jéntré dieu .
- Kode silaturahim salajengna + stop kontak + investapi:
https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Pikeun saha di luhur hese, mangka urang tetep dina tahap ieu jeung nungkulan kode. Upami Anjeun gaduh patarosan – nanya. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2
Narima laporan brokerage sarta transaksi
Aya tilu metode pikeun nampi laporan sareng transaksi brokerage
Ti mimiti pisan penting pikeun terang:
- Laporan brokerage dihasilkeun dina modeu T-3, i.e. trades dipintonkeun aya sanggeus palaksanaan sabenerna maranéhanana.
- Sasuai, lamun menta laporan ieu pikeun dua poé panungtungan, éta bakal siap dina tilu poé.
- Pikeun meunangkeun transaksi pikeun poé panungtungan, kami nganggo metodeu pikeun narima transaksi, tapi inget yen id jeung eusi maranéhna bisa robah sanggeus laporan brokerage dihasilkeun.
GetBrokerReport
Pikeun kéngingkeun laporan calo, anjeun kedah nyandak id akun, tanggal ngamimitian sareng tanggal tungtung laporan, tapi henteu langkung ti 31 dinten. Kami ngirimkeun pamundut pikeun ngahasilkeun laporan ka API dina ngahasilkeun _broker_report_request , kéngingkeun taskId pikeun ngaréspon. Sanggeus éta, ngagunakeun taskId ieu, urang meunang data ti get _broker_report_response.
- Anjeun kedah nyimpen TaskID salamina persis pikeun kaping ieu.
- Kusabab upami anjeun leungit, maka pikeun tanggal anu dipénta laporan éta bakal mimiti ngaréspon kana pamundut generasi,
- Lajeng éta moal datang pisan.
Métode pikeun meunangkeun tanggal, nyandak kana akun pangurangan ti tanggal ayeuna
const getDateSubDay = (subDay = 5, ngamimitian = leres) => { const titimangsa = anyar Tanggal (); date.setUTCDate (date.getUTCDate () – subDay); lamun (mimitian) { date.setUTCHours(0, 0, 0, 0); } Sejenna { date.setUTCHours(23, 59, 59, 999); } tanggal balik; };
pamundut generasi laporan
const brokerReport = await (sdk.operations.getBrokerReport)({ generateBrokerReportRequest: { accountId, ti, ka, }, });
Hasilna:
- Salaku hasil tina palaksanaan kahiji paréntah, urang meunang taskId.
- Laporan mimiti dihasilkeun di sisi calo urang. Nalika éta siap teu kanyahoan, urang antosan sarta périodik narik taskId dina antisipasi laporan.
- Naha? Kusabab lamun laporan teu siap, eta throws kasalahan. Upami laporan henteu siap di sisi calo, maka ieu mangrupikeun kasalahan dina kode anjeun. Mangga proses: 30058|INVALID_ARGUMENT|tugas teu acan réngsé, mangga cobian deui engké
Kode pikeun ngantosan sareng nampi laporan sapertos kieu.
const timer = waktos async => { balikkeun Janji anyar (ngabéréskeun => setTimeout (ngabéréskeun, waktos)); } const getBrokerResponseByTaskId = async (taskId, kaca = 0) => { coba { balik await (sdk.operations.getBrokerReport)({ getBrokerReportRequest: { taskId, kaca, }, }); } nyekel (e) { console.log ( ‘antosan’, e); ngantosan timer (10000); mulang await getBrokerResponseByTaskId(taskId, page); } };
Lajeng magic sarua kajadian. Urang ngeureunkeun naskah urang, mimitian deui, urang teu boga taskId. Urang ngaéksekusi kode jeung pamundut taskId, tapi urang teu meunang deui taskId, tapi geuwat laporan. Sihir! Jeung sagalana bakal rupa lamun éta salawasna kawas kieu. Tapi dina sabulan moal aya data pisan. Mangpaat :
- Saeutik téori ieu outlined di dieu jeung di dieu .
- Ngahijikeun kodeu, drafna bakal katingali sapertos kieu.
https://github.com/pskucherov/tcsstat/tree/step3.1 https://github.com/pskucherov/tcsstat/compare/step3.1
- Upami aya anu mendakan ieu, teras wilujeng sumping kana masalah éta . Saatos aranjeunna ngalereskeun sihir ieu, éta bakal leungit kakuatanana sareng bakal béda. Tapi dina momen ayeuna (03/21/2023) jalanna sapertos kitu.
GetDividendsForeignIsuer
Batur panginten yén metodeu sami sareng anu sateuacana sareng anjeun tiasa nganggo metode tunggal dimana anjeun ngan ukur ngarobih nami operasi. Tapi aranjeunna henteu nebak! Ngaranna aya béda pisan boh dina métode sareng inpormasi anu dipulangkeun. Jeung count kaca dimimitian ti 0, lajeng ti 1. Dina raraga teu meunang bingung dina sakabéh ieu, leuwih gampang nulis dua métode béda. Nu aneh, sabab logika gawé téh sarua. Kuring nyiduh pikeun lila nalika kuring diusahakeun nyieun hiji metoda na aya kirang kode. Moal aya conto di dieu.
GetOperationsByCursor
Paporit abdi tina tilu. Sanajan teu paling akurat, tapi paling nyukupan. Urang ngadamel pamundut ti mimiti nyieun hiji akun ka tanggal maksimum mungkin (nutup hiji akun atawa nu ayeuna). Simkuring meunang jawaban, nyandak kursor jeung menta ulang salami aya data. Sareng kodeu langkung ringkes tibatan conto di luhur.
const timer = waktos async => { balikkeun Janji anyar (ngabéréskeun => setTimeout (ngabéréskeun, waktos)); } const getOperationsByCursor = async (sdk, accountId, ti, ka, kursor = ”) => { coba { const reqData = { accountId, ti, ka, wates: 1000, kaayaan: sdk.OperationState.OPERATION_STATE_EXECUTED, tanpa Komisi: palsu, withoutTrades: palsu, withoutOvernights: palsu, kursor, }; mulang await sdk.operations.getOperationsByCursor(reqData); } nyekel (e) { antosan timer (60000); mulang await getOperationsByCursor(sdk, accountId, ti, ka, kursor = ”); } };
Draf pikeun ngajalankeun aya di dieu: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Ayeuna kami siap pikeun nambahkeun operasi narima ka aplikasi urang. Lamun dipigawé leres, mangka anjeun kudu meunang laporan brokerage pikeun sakabéh ayana akun. Sareng pikeun data anu leungit, T-3 anu sami, ngamuat deui tina operasi. Tapi ieu bisa dipisahkeun kana artikel misah. Tina nuansa utama anu anjeun bakal sapatemon nyaéta operasi lem sareng laporan brokerage.
- Upami dinten ayeuna anjeun nampi laporan brokerage sareng transaksi kanggo tanggal anu diperyogikeun, nempatkeun sadayana dina pangkalan data, teras teu aya masalah.
- Anjeun bakal boga masalah isukan mun anjeun nampi bagian salajengna data tina laporan sarta operasi sarta mutuskeun pikeun nyingkronkeun aranjeunna kalayan database aya.
- A loba nuances ngeunaan mismatched atawa ngarobah id sanggeus processing
- Lajeng pikeun pasar OTC, id urang teu cocog pisan.
- Kitu ogé nuansa nyinkronkeun instrumen, nu deui teu coincide, alatan peculiarities tina API. Tapi éta carita sejen.
Hayu urang tambahkeun inpormasi ngeunaan operasi kana aplikasi urang. Patarosan utama nyaéta dimana data bakal diolah sareng disimpen.
- Upami anjeun ngalakukeunana pikeun diri anjeun, anjeun bakal meakeun data anu sami tina alat anu béda. Teras anjeun kedah ngolah sareng nyimpen data dina server.
- Upami anjeun gaduh seueur data anu béda-béda anu dikonsumsi ku seueur pangguna anu béda, maka anjeun kedah mutuskeun naon anu langkung penting: laju pangguna atanapi ngahémat beusi di sisi anjeun. Saha waé anu mampuh jumlah hardware anu teu terbatas ngitung sadayana dina serverna sareng ngajantenkeun éta gancang pisan pikeun pangguna, ngahémat sumber daya pangguna, sapertos batré sareng lalu lintas, anu penting pisan dina telepon.
Sabalikna, cacah dina browser sanes solusi anu paling optimal dina prinsipna. Ku alatan éta, naon teu mahal, anggap we eta dina server urang. Urang ninggalkeun sésana ka klien. Abdi hoyong pisan nyandak sareng ngitung komisi dina server. Tapi di dieu asalna nuansa disebut “interaktivitas”. Anggap anjeun gaduh rébuan operasi sareng peryogi lima menit pikeun nampi éta. Naon anu bakal dipiboga ku pangguna dina waktos ayeuna? Spinner? Kamajuan? Infa ngeunaan sabaraha ieu diunggah? Éta idéal ngagunakeun “antosan aktif” lamun pamaké dina prosés geus bisa ningali hiji hal. Ieu hasilna:
- Page loading
- Sadaya invoice dipénta
- Saatos éta, sadaya transaksi sareng komisi pikeun transaksi anu dieksekusi dipénta pikeun sadaya akun. Nalika data ditampi, éta dipasihan dina browser.
Dina raraga teu nyaring data dina acara unggal waktu, urang narik acara urang sorangan pikeun tiap akun. Resep ieu:
socket.emit(‘sdk:getOperationsCommissionResult_’ + accountId, { item: data?.item, inProgress: Boolean(nextCursor), });
Draf pikeun peluncuran nyaéta di dieu: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Moving on. Ieu hébat nu geus maca baris ieu!
Itungan jeung kaluaran informasi dipikaresep
Gumantung kana anu peryogi informasi naon. Ku alatan éta, kuring langsung ngabejaan Anjeun nuances utama nu bakal Anjeun sapatemon.
Gawe sareng harga
Saha waé anu damel sareng kauangan terang yén transaksi artos ngan ukur kedah dilakukeun kalayan nomer sadayana. Kusabab henteu akurat nilai saatos titik perpuluhan sareng kasalahan kumulatif kalayan sajumlah operasi. Éta pisan sababna naha sakabeh harga dibere dina format MoneyValue handap
sawah | ngetik | Katerangan |
---|---|---|
mata uang | senar | String kode mata uang ISO |
hijian | int64 | Integer bagian tina jumlah, bisa jadi angka négatip |
nano | int32 | Fractional bagian tina jumlah, bisa jadi angka négatip |
Urang ngolah aranjeunna nyalira, teras bawa ka nilai harga:
cutatan.unit + cutatan.nano / 1e9
Biaya kontrak futures
Harga futures dibere dina titik, nalika anjeun gaduh masa depan mata uang, anjeun kedah terang tingkatna. Sarta tangtu harga dina titik jeung hambalan harga. Lamun anjeun ngitung kauntungan tina transaksi, ieu bisa némbak, sabab. lamun ngitung jumlah total ku cara ngalikeun harga ku kuantitas. Di dieu anjeun kudu ati-ati. Pikeun ayeuna, urang bakal ningali kumaha jalanna. Ieu lumaku pikeun futures mata uang, di tempat séjén sagalana ok jeung ieu.
pasar OTC
Pasar ieu ngagaduhan seueur ciri, janten hayu urang diajar operasi sacara misah.Sawaktos anjeun ngawitan nyinkronkeun operasi, bakal tétéla yén anjeun kedah nyangking figi / ticker kana bentuk anu sami supados leres cocog sareng instrumen. Sawaktos anjeun ngawitan nyinkronkeun ieu sareng laporan brokerage, éta bakal tétéla yén tradeID tina transaksi anu sami ngagaduhan hurup dina awal transaksi sareng aranjeunna henteu aya dina laporan brokerage. Ku alatan éta, maranéhna teu bisa dibandingkeun … ahem-ahem … ku ngabandingkeun! Kuring cocog waktos dagang, ticker tur cocog yen hiji tradeId dikandung dina sejen. Leres, abdi henteu terang. Saha waé anu mendakan ieu sareng anu paduli, angkat kana masalah atanapi ngamimitian anu énggal.
Operasi matematik dina alat
Teu mungkin, tanpa ningali, pikeun ngalakukeun operasi matematik sareng sadaya daptar. Dina raraga teu nambahan haneut kana lemes, urang salawasna pariksa mata uang jeung prosés ngan lamun urang yakin yén mata uang cocog, sarta titik nu dirobah jadi mata uang nu dipikahoyong. Bersenjata sareng pangaweruh ngeunaan damel sareng nomer bank, urang bakal ngitung komisi anu dikaluarkeun pikeun unggal rekening. Kawas kieu: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4
Microservice geus siap!
HTTPS://github.com/pskucherov/tcsstat Salaku PR a, anjeun tiasa pariksa lamun jasa jalan kalawan sambungan slow, nalika sambungan pegat, nalika Internet dipegatkeun, nalika kasalahan atawa wates kadaluwarsa dina bagian tina calo nu.
Kacindekan jeung rencana pikeun mangsa nu bakal datang
- Diajar ngeunaan operasi dasar sareng damel sareng Invest API
- Waktos nyéépkeun ~ 10 jam
- Tingkat kasulitan ~ junior+ / low middle
Upami anjeun teras-terasan nyaring microservice, anjeun tiasa waé sapertos kieu
https://opexbot.info
Ieu perkembangan kuring, keur nu geus puguh ngarti, lumpat jeung ngitung sorangan. Kuring rencanana pikeun nambahkeun analytics aya dina pamundut pamaké. Upami anjeun resep kana tulisan éta, teras ngalanggan saluran telegram kuring .
Полезная статья. Не могу представить, сколько усилий автора потребовалось, чтобы все описать. Благодарю.