Kita ngembangake layanan mikro nggunakake API Tinkoff Invest kanggo ngotomatisasi nggarap laporan broker lan ngitung komisi.

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

Inspirator ing mburi pangembangan layanan statistik kanggo Tinkoff Investments yaiku:

Apa sing bakal dirembug?

  • Mung bagean Applied babagan pembangunan.
  • Kawruh lan pengalaman nyata, sing penting banget kanggo nggarap instrumen finansial.
  • Ringkesan masalah sing kudu digarap

Dadi, aku pengin ngetung statistik perdagangan lan nindakake kanthi cara sing trep. 

Ngembangake layanan statistik langkah demi langkah: 

  1. Sambungan menyang Tinkoff Invest API
  2. Nggambar data saka Tinkoff Invest API ing browser
  3. Nampa laporan lan transaksi broker
  4. Pitungan lan output informasi kapentingan
  5. Kesimpulan lan rencana kanggo masa depan

Sambungan menyang Tinkoff Invest API

Kanggo nyambung menyang API, sampeyan bisa njupuk SDK saka dokumentasi https://github.com/Tinkoff/investAPI#sdk . Utawa paket npm ` tinkoff-sdk-grpc-js `. Penting yen paket kasebut dianyari menyang versi paling anyar dening pangembang. Instal

npm lan tinkoff-sdk-grpc-js

mriksa

const {createSdk} = mbutuhake (‘tinkoff-sdk-grpc-js’);   // Token sing bisa dipikolehi kaya  const TOKEN = ‘YOURAPI’;   // Jeneng aplikasi sing bisa ditemokake ing log TCS. const appName = ‘tcsstat’;   const sdk = createSdk(TOKEN, appName); (async () => {     console.log(ngenteni sdk.users.getAccounts()); })();

Asil: dhaptar akun sampeyan bakal ditampilake ing konsol. Contone, ayo nganalisa nuansa:Kita ngembangake layanan mikro nggunakake API Tinkoff Invest kanggo ngotomatisasi nggarap laporan broker lan ngitung komisi.

  • Ing dhaptar akun ana “bank Investasi”, sing sampeyan ora bisa nggunakake API
  • Wigati dimangerteni manawa kolom kasebut ana ing camelCase, nalika ing dokumentasi lapangan kasebut ditampilake ing under_score. 
  • Bakal kaya iki ing endi wae, supaya sampeyan ora bisa njupuk lan nyalin lapangan saka dokumentasi.

migunani:

  • Sampeyan bisa nemokake kode iki ing cabang project

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

Nggambar data saka Tinkoff Invest API ing browser

Aku njupuk next.js lan socket.io. Iki dudu rekomendasi sing kuat, pilih miturut kebijaksanaan sampeyan. 

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

Kita langsung nerusake menyang langkah Persahabatan sabanjuré+soket+investapi, lan ndeleng bagean Migunani langkah iki kanggo kabeh rincian.  Aku bakal nerangake rincian: 

  • Ing sisih nodejs (server), ana file pages/api/investapi.js. Iki ngendi kita nggawe server socket.io lan nyambung menyang investapi.
  • Ing sisih browser (klien), kita nyambung menyang server liwat soket lan njaluk data akun saka makelar. 
  • Kita nampa data saka makelar ing server, banjur dikirim menyang klien. Nalika ditampa ing klien, ditampilake ing browser. 

Asil:  ing konsol browser kita bisa ndeleng informasi babagan akun. Yaiku, ing langkah pungkasan, kita weruh informasi babagan akun ing konsol server (nodejs), ing langkah saiki, kita nransfer informasi iki menyang klien (browser).

Kita ngembangake layanan mikro nggunakake API Tinkoff Invest kanggo ngotomatisasi nggarap laporan broker lan ngitung komisi.

Saiki ayo nggawe supaya sampeyan bisa milih akun saka browser, lan yen ora ana token, banjur kesalahan dikirim menyang console. Karya iku prasaja lan ora ana sing anyar, mula aku mung menehi tautan menyang komitmen

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

migunani:

  • Carane nggawe kanca sabanjuré lan soket diterangake ing rinci kene
  • Kode Persahabatan sabanjure + soket + investapi:

https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Kanggo sapa ing ndhuwur iku angel, banjur kita tetep ing tataran iki lan menehi hasil karo kode. Yen sampeyan duwe pitakon – takon. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2

Nampa laporan lan transaksi broker

Ana telung cara kanggo nampa laporan lan transaksi broker

  1. GetBrokerReport
  2. GetDividendsForeignIssuer
  3. GetOperationsByCursor

Saka awal iku penting kanggo ngerti: 

  • Laporan broker digawe ing mode T-3, i.e. dagang ditampilake ana sawise eksekusi nyata. 
  • Mulane, yen sampeyan njaluk laporan iki kanggo rong dina pungkasan, iku bakal siap ing telung dina. 
  • Kanggo entuk transaksi ing dina pungkasan, kita nggunakake cara kanggo nampa transaksi, nanging elinga yen id lan isi bisa diganti sawise laporan broker digawe.

GetBrokerReport

Kanggo entuk laporan broker, sampeyan kudu njupuk id akun, tanggal wiwitan lan tanggal pungkasan laporan, nanging ora luwih saka 31 dina. We ngirim panjalukan kanggo generate laporan kanggo API ing generate _broker_report_request , njaluk taskId nanggepi. Sawise iku, nggunakake taskId iki, kita entuk data saka get _broker_report_response.

Dadi dokumentasi ngandika, ing kasunyatan ana nuansa. Watch tangan sampeyan:

  • Sampeyan kudu nyimpen TaskID ing salawas-lawase persis kanggo tanggal kasebut. 
  • Awit yen ilang, banjur kanggo tanggal sing dijaluk laporan bakal teka kanggo nanggepi panjalukan generasi, 
  • Banjur ora bakal teka.

Ayo miwiti nulis kode

Cara kanggo njupuk tanggal, njupuk menyang akun subtraction saka tanggal saiki

const getDateSubDay = (subDay = 5, wiwitan = bener) => {     const tanggal = anyar Tanggal ();     date.setUTCDate(date.getUTCDate() – subDay);       yen (wiwitan) {         date.setUTCHours(0, 0, 0, 0);     } liya {         date.setUTCHours(23, 59, 59, 999);     }       tanggal bali; };

Panyuwunan generasi laporan 

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

asil:

  • Minangka asil eksekusi perintah pisanan, kita entuk taskId. 
  • Laporan kasebut wiwit digawe ing sisih broker. Nalika wis siyap dingerteni, kita ngenteni lan periodik narik taskId ing nunggu laporan.
  • Kenging punapa? Amarga yen laporan durung siyap, bakal nggawe kesalahan. Yen laporan durung siyap ing sisih broker, iki minangka kesalahan ing kode sampeyan. Mangga proses: 30058|INVALID_ARGUMENT|tugas durung rampung, coba maneh mengko

Kode kanggo nunggu lan nampa laporan katon kaya iki.

const timer = wektu async => {     bali Janji anyar (ngrampungake => setTimeout (mutusake, wektu)); }   const getBrokerResponseByTaskId = async (taskId, page = 0) => {     coba {         bali ngenteni (sdk.operations.getBrokerReport)({             getBrokerReportRequest: {                 taskId,                 kaca,             },         });     } nyekel (e) {         console.log(‘ngenteni’, e);         ngenteni timer (10000);         bali ngenteni getBrokerResponseByTaskId(taskId, page);     } };

Banjur sihir sing padha kedadeyan. Kita mungkasi script kita, miwiti maneh, kita ora duwe taskId. Kita nglakokake kode kanthi panjaluk taskId, nanging ora entuk taskId maneh, nanging langsung laporan. Sihir! Lan kabeh bakal apik yen tansah kaya iki. Nanging ing sasi ora bakal ana data babar pisan. Migunani :

  • A dicokot saka teori wis mbatesi kene lan kene .
  • Nggabungake kode kasebut, draf bakal katon kaya iki.

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

  • Yen ana wong sing nemoni iki, mula ayo teka ing masalah kasebut . Sawise ndandani sihir iki, bakal ilang kekuwatane lan bakal beda. Nanging ing wektu saiki (03/21/2023) kerjane kaya ngono.

GetDividendsForeignIssuer

Ana sing mikir yen cara kasebut padha karo sing sadurunge lan sampeyan bisa nggunakake cara siji sing mung ngganti jeneng operasi kasebut. Nanging padha ora ngira!  Penamaan ana beda banget ing metode lan informasi sing bali. Lan count kaca wiwit saka 0, banjur saka 1. Supaya ora bingung ing kabeh iki, iku luwih gampang kanggo nulis loro cara beda. Sing aneh, amarga logika karya iku padha. Aku ngidoni kanggo dangu nalika aku nyoba kanggo nggawe siji cara lan ana kode kurang. Ora bakal ana conto ing kene.

GetOperationsByCursor

Favoritku saka telu. Sanajan ora paling akurat, nanging paling nyukupi. Kita nggawe panjalukan saka wiwitan nggawe akun nganti tanggal maksimal (nutup akun utawa sing saiki). We njaluk jawaban, njupuk kursor lan re-request anggere ana data.  Lan kode luwih ringkes tinimbang ing conto ing ndhuwur.

const timer = wektu async => {     bali Janji anyar (ngrampungake => setTimeout (mutusake, wektu)); }   const getOperationsByCursor = asinkron (sdk, accountId, saka, kanggo, kursor = ”) => {     coba {         const reqData = {             accountId,             saka,             kanggo,             watesan: 1000,             negara: sdk.OperationState.OPERATION_STATE_EXECUTED,             tanpa Komisi: palsu,             withoutTrades: palsu,             withoutOvernights: palsu,             kursor,         };           bali ngenteni sdk.operations.getOperationsByCursor(reqData);     } nyekel (e) {         ngenteni timer (60000);         bali ngenteni getOperationsByCursor(sdk, accountId, saka, kanggo, kursor = ”);     } };

Konsep sing bakal ditindakake ana ing kene: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Saiki kita siyap nambah operasi panampa menyang aplikasi kita. Yen rampung kanthi bener, sampeyan kudu entuk laporan broker kanggo kabeh akun kasebut. Lan kanggo data sing ilang, T-3 sing padha, muat ulang saka operasi. Nanging iki bisa dipisahake dadi artikel sing kapisah. Saka nuansa utama sing bakal sampeyan temokake yaiku operasi lem lan laporan broker.

  •  Yen dina iki sampeyan nampa laporan broker lan transaksi kanggo tanggal sing dibutuhake, sijine kabeh ing database, banjur ora ana masalah. 
  • Sampeyan bakal duwe masalah sesuk nalika sampeyan nampa bagean sabanjure data saka laporan lan operasi lan arep kanggo nyinkronake karo database ana. 
  • Akeh nuansa babagan ora cocog utawa ganti id sawise diproses
  • Banjur kanggo pasar OTC, id ora cocog.
  •  Uga nuansa instrumen sinkronisasi, sing maneh ora pas, amarga fitur API. Nanging iki crita liyane.

Ayo tambahake informasi babagan operasi menyang aplikasi kita. Pitakonan utama yaiku ing ngendi data bakal diproses lan disimpen.

  •  Yen sampeyan nindakake dhewe, sampeyan bakal nggunakake data sing padha saka piranti beda. Banjur sampeyan kudu ngolah lan nyimpen data ing server.
  • Yen sampeyan duwe macem-macem data sing dikonsumsi dening akeh pangguna sing beda-beda, mula sampeyan kudu mutusake apa sing luwih penting: kacepetan pangguna utawa nyimpen wesi ing sisih sampeyan. Sapa sing bisa mbayar jumlah hardware tanpa wates, ngetung kabeh sing ana ing server lan nggawe cepet banget kanggo pangguna, ngirit sumber daya pangguna, kayata baterei lan lalu lintas, sing penting banget ing telpon.

Sabanjure, ngetang ing browser dudu solusi sing paling optimal ing prinsip. Mulane, apa sing ora larang, kita nimbang ing server kita. We ninggalake liyane kanggo klien. Aku pancene pengin njupuk lan ngetung komisi ing server. Nanging kene teka nuansa disebut “interaktivitas”. Contone, sampeyan duwe ewonan operasi lan butuh limang menit kanggo nampa. Apa sing bakal ditindakake pangguna ing wektu iki? Spinner? kemajuan? Infa babagan pira sing diunggah? Iku becik kanggo nggunakake “tunggu aktif” nalika pangguna ing proses wis bisa ndeleng soko. Punika Asil:Kita ngembangake layanan mikro nggunakake API Tinkoff Invest kanggo ngotomatisasi nggarap laporan broker lan ngitung komisi.

  • Page loading
  • Kabeh invoice dijaluk
  • Sawise iku, kabeh transaksi karo komisi kanggo transaksi sing dileksanakake dijaluk kanggo kabeh akun. Minangka data ditampa, iku render ing browser.

Supaya ora nyaring data ing acara saben wektu, kita narik acara dhewe kanggo saben akun. Kaya iki:

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

Konsep sing bakal diluncurake ing kene: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Moving on. Apik banget yen sampeyan wis maca baris iki! 

Pitungan lan output informasi kapentingan

Gumantung sing mbutuhake informasi apa. Mulane, aku langsung ngandhani nuansa utama sing bakal sampeyan temoni.

Nggarap prices 

Saben uwong sing kerja karo keuangan ngerti yen transaksi dhuwit mung kudu ditindakake kanthi nomer wutuh. Amarga ora akurat nilai sawise titik desimal lan kesalahan kumulatif kanthi akeh operasi. Pramila kabeh rega ditampilake ing format MoneyValue ing ngisor ikiKita ngembangake layanan mikro nggunakake API Tinkoff Invest kanggo ngotomatisasi nggarap laporan broker lan ngitung komisi.

lapangan jinis Katrangan
mata uang senar String kode mata uang ISO
Unit ingt64 Bagéan integer saka jumlah, bisa dadi nomer negatif
nano int32 Bagéan pecahan saka jumlah, bisa dadi nomer negatif

Kita ngolah kanthi kapisah, banjur nggawa menyang regane:

kuotasi.unit + kuotasi.nano / 1e9

Biaya kontrak berjangka

Rega berjangka ditampilake ing poin, nalika sampeyan duwe mata uang, sampeyan kudu ngerti tingkat kasebut. Lan mesthi rega ing titik lan langkah rega. Nalika ngetung MediaWiki saka transaksi, iki bisa njupuk, amarga. yen sampeyan ngetung jumlah total kanthi nikelake rega kanthi jumlah. Ing kene sampeyan kudu ati-ati. Saiki, kita bakal weruh kepiye carane. Iki ditrapake kanggo mata uang berjangka, ing panggonan liyane kabeh ok karo iki.Kita ngembangake layanan mikro nggunakake API Tinkoff Invest kanggo ngotomatisasi nggarap laporan broker lan ngitung komisi. Kita ngembangake layanan mikro nggunakake API Tinkoff Invest kanggo ngotomatisasi nggarap laporan broker lan ngitung komisi.

pasar OTC

Pasar iki duwe akeh kekhasan, mula ayo sinau operasi kasebut kanthi kapisah. Nalika sampeyan miwiti nyinkronake operasi, mula sampeyan kudu nggawa figi / ticker menyang wangun sing padha supaya cocog karo instrumen kasebut. Nalika sampeyan miwiti nyinkronake iki karo laporan broker, bakal dadi tradeID saka transaksi sing padha duwe huruf ing wiwitan transaksi lan ora ana ing laporan broker. Mula, ora bisa ditandhingake … ahem-ahem … mbandhingake! Aku cocog wektu perdagangan, ticker lan cocog sing siji tradeId ana ing liyane. Bener, aku ora ngerti. Sapa wae sing nemoni iki lan sing peduli, teka menyang masalah kasebut utawa miwiti sing anyar.Kita ngembangake layanan mikro nggunakake API Tinkoff Invest kanggo ngotomatisasi nggarap laporan broker lan ngitung komisi.

Operasi matématika ing piranti

Ora mungkin, tanpa ndeleng, nindakake operasi matematika kanthi dhaptar kabeh. Supaya ora nambah anget kanggo alus, kita tansah mriksa itungan lan proses mung yen kita yakin yen itungan cocog, lan TCTerms diowahi kanggo itungan dikarepake. Bersenjata karo kawruh babagan nggarap nomer bank, kita bakal ngetung komisi sing digunakake kanggo saben akun. Kaya iki: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4Kita ngembangake layanan mikro nggunakake API Tinkoff Invest kanggo ngotomatisasi nggarap laporan broker lan ngitung komisi.    

Microservice wis siyap!

https://github.com/pskucherov/tcsstat Minangka peer, sampeyan bisa mriksa yen layanan dianggo karo sambungan alon, nalika sambungan rusak, nalika Internet pedhot, nalika kasalahan utawa watesan kadaluwarsa ing bagean broker. 

Kesimpulan lan rencana kanggo masa depan

  • Sinau babagan operasi dhasar lan nggarap Invest API
  • Wektu ngginakaken ~ 10 jam
  • Tingkat kangelan ~ junior + / madya ngisor 

Yen sampeyan terus nyaring layanan mikro, sampeyan bisa uga ngalami kaya iki

https://opexbot.info

  Iki pangembanganku, kanggo wong sing kesed ngerti, mlayu lan ngetung dhewe. Aku rencana kanggo nambah analytics ana ing panjalukan saka kedhaftar. Yen sampeyan seneng karo artikel kasebut, banjur langganan saluran telegramku . Kita ngembangake layanan mikro nggunakake API Tinkoff Invest kanggo ngotomatisasi nggarap laporan broker lan ngitung komisi.

Pavel
Rate author
Add a comment

  1. Isakiiev

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

    Reply