Kami sedang membangunkan perkhidmatan mikro menggunakan API Tinkoff Invest untuk mengautomasikan kerja dengan laporan pembrokeran dan mengira komisen.

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

Inspirasi di sebalik pembangunan perkhidmatan statistik untuk Tinkoff Investments ialah:

Apa yang akan dibincangkan?

  • Hanya bahagian yang digunakan tentang pembangunan.
  • Pengetahuan dan pengalaman sebenar, yang sangat penting dalam bekerja dengan instrumen kewangan.
  • Gambaran keseluruhan isu untuk diusahakan

Jadi, saya ingin mengira statistik perdagangan dan melakukannya dengan cara yang mudah. 

Membangunkan perkhidmatan statistik langkah demi langkah: 

  1. Sambungan ke API Tinkoff Invest
  2. Melukis data daripada Tinkoff Invest API dalam penyemak imbas
  3. Menerima laporan dan transaksi pembrokeran
  4. Pengiraan dan pengeluaran maklumat yang diminati
  5. Kesimpulan dan rancangan untuk masa hadapan

Sambungan ke API Tinkoff Invest

Untuk menyambung ke API, anda boleh mengambil sebarang sdk daripada dokumentasi https://github.com/Tinkoff/investAPI#sdk . Atau pakej npm ` tinkoff-sdk-grpc-js `. Adalah penting bahawa pakej dikemas kini kepada versi terkini oleh pembangun. Pasang

npm saya tinkoff-sdk-grpc-js

Menyemak

const { createSdk } = memerlukan(‘tinkoff-sdk-grpc-js’);   // Token yang boleh diperolehi seperti  const TOKEN = ‘YOURAPI’;   // Nama aplikasi yang anda boleh didapati dalam log TCS. const appName = ‘tcsstat’;   const sdk = createSdk(TOKEN, appName); (async () => {     console.log(menunggu sdk.users.getAccounts()); })();

Keputusan: senarai akaun anda akan dipaparkan dalam konsol. Sebagai contoh, mari analisa nuansa:Kami sedang membangunkan perkhidmatan mikro menggunakan API Tinkoff Invest untuk mengautomasikan kerja dengan laporan pembrokeran dan mengira komisen.

  • Dalam senarai akaun terdapat “Bank pelaburan”, yang anda tidak boleh bekerja menggunakan API
  • Sila ambil perhatian bahawa medan datang dalam camelCase, manakala dalam dokumentasi medan ini dibentangkan dalam under_score. 
  • Ia akan menjadi seperti ini di mana-mana, jadi anda tidak boleh mengambil dan menyalin medan daripada dokumentasi.

Berguna:

  • Anda boleh mencari kod ini dalam cawangan projek

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

Melukis data daripada Tinkoff Invest API dalam penyemak imbas

Saya mengambil next.js dan socket.io. Ini bukan cadangan yang kuat, pilih mengikut budi bicara anda. 

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

Kami segera meneruskan ke langkah persahabatan seterusnya+soket+investapi, dan lihat bahagian Berguna langkah ini untuk semua butiran.  Saya akan menerangkan butirannya: 

  • Di bahagian nodejs (pelayan), terdapat fail pages/api/investapi.js. Di sinilah kami mencipta pelayan socket.io dan menyambung ke investapi.
  • Di bahagian pelayar (pelanggan), kami menyambung ke pelayan melalui soket dan meminta data akaun daripada broker. 
  • Kami menerima data daripada broker pada pelayan, kemudian menghantarnya kepada pelanggan. Apabila ia diterima pada klien, ia dipaparkan dalam penyemak imbas. 

Keputusan:  dalam konsol penyemak imbas kita boleh melihat maklumat tentang akaun. Iaitu, pada langkah terakhir, kami melihat maklumat tentang akaun dalam konsol pelayan (nodejs), dalam langkah semasa, kami memindahkan maklumat ini kepada klien (penyemak imbas).

Kami sedang membangunkan perkhidmatan mikro menggunakan API Tinkoff Invest untuk mengautomasikan kerja dengan laporan pembrokeran dan mengira komisen.

Sekarang mari kita buat supaya anda boleh memilih akaun daripada penyemak imbas, dan jika tiada token, maka ralat dihantar ke konsol. Kerja ini mudah dan bukan perkara baharu, jadi saya hanya memberikan pautan kepada komitmen

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

Berguna:

  • Cara membuat kawan seterusnya dan soket diterangkan secara terperinci di sini
  • Kod persahabatan seterusnya+soket+investapi:

https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Bagi siapa perkara di atas sukar, maka kami kekal pada peringkat ini dan berurusan dengan kod tersebut. Jika anda mempunyai soalan – tanya. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2

Menerima laporan dan transaksi pembrokeran

Terdapat tiga kaedah untuk menerima laporan dan transaksi pembrokeran

  1. GetBrokerReport
  2. DapatkanDividenForeignIsuer
  3. GetOperationsByCursor

Dari awal lagi adalah penting untuk mengetahui: 

  • Laporan pembrokeran dijana dalam mod T-3, i.e. dagangan dipaparkan di sana selepas pelaksanaan sebenar mereka. 
  • Sehubungan itu, jika anda meminta laporan ini untuk dua hari terakhir, ia akan siap dalam tiga hari. 
  • Untuk membuat tawaran untuk hari-hari terakhir, kami menggunakan kaedah untuk menerima operasi, tetapi ingat bahawa id dan kandungan mereka mungkin berubah selepas pembentukan laporan pembrokeran.

GetBrokerReport

Untuk mendapatkan laporan pembrokeran, anda perlu mengambil id akaun, tarikh mula dan tarikh tamat laporan, tetapi tidak melebihi 31 hari. Kami menghantar permintaan untuk menjana laporan kepada API dalam menjana _broker_report_request , dapatkan taskId sebagai respons. Selepas itu, menggunakan taskId ini, kami mendapat data daripada get _broker_report_response.

Jadi dokumentasi mengatakan, sebenarnya ada nuansa. Tonton tangan anda:
  • Anda perlu menyimpan TaskID selama-lamanya tepat untuk tarikh ini. 
  • Oleh kerana jika anda kehilangannya, maka untuk tarikh yang diminta laporan itu akan mula-mula datang sebagai tindak balas kepada permintaan penjanaan, 
  • Dan kemudian ia tidak akan datang sama sekali.
Mari mula menulis kod

Kaedah untuk mendapatkan tarikh, dengan mengambil kira penolakan dari tarikh semasa

const getDateSubDay = (subDay = 5, start = true) => {     const date = new Date();     date.setUTCDate(date.getUTCDate() – subDay);       jika (mula) {         date.setUTCHours(0, 0, 0, 0);     } else {         date.setUTCHours(23, 59, 59, 999);     }       tarikh kembali; };

Permintaan penjanaan laporan 

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

Keputusan:

  • Hasil daripada pelaksanaan pertama arahan, kami mendapat taskId. 
  • Laporan itu mula dijana di pihak broker. Apabila ia sedia tidak diketahui, kami menunggu dan secara berkala menarik taskId untuk menjangkakan laporan.
  • kenapa? Kerana jika laporan itu tidak siap, ia menimbulkan ralat. Jika laporan itu tidak disediakan di pihak broker, maka ini adalah ralat dalam kod anda. Sila proses: 30058|INVALID_ARGUMENT|tugas belum selesai, sila cuba sebentar lagi

Kod untuk menunggu dan menerima laporan kelihatan seperti ini.

pemasa const = masa tak segerak => {     kembalikan Janji baharu(selesai => setTimeout(selesai, masa)); }   const getBrokerResponseByTaskId = async (taskId, page = 0) => {     cuba {         return tunggu (sdk.operations.getBrokerReport)({             getBrokerReportRequest: {                 taskId,                 page,             },         });     } tangkap (e) {         console.log(‘tunggu’, e);         tunggu pemasa(10000);         kembali menunggu getBrokerResponseByTaskId(taskId, halaman);     } };

Kemudian sihir yang sama berlaku. Kami hentikan skrip kami, mulakan semula, kami tidak mempunyai ID tugas. Kami melaksanakan kod dengan permintaan taskId, tetapi kami tidak lagi mendapat taskId, tetapi serta-merta laporan. Sihir! Dan semuanya akan baik-baik saja jika ia sentiasa seperti ini. Tetapi dalam sebulan tidak akan ada data langsung. Berguna :

  • Sedikit teori digariskan di sini dan di sini .
  • Meletakkan kod bersama-sama, draf akan kelihatan seperti ini.

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

  • Jika seseorang terjumpa perkara ini, maka dialu-alukan untuk isu ini . Selepas mereka membaiki sihir ini, ia akan kehilangan kuasanya dan akan menjadi berbeza. Tetapi pada masa ini (21/03/2023) ia berfungsi begitu sahaja.

DapatkanDividenForeignIsuer

Seseorang mungkin berfikir bahawa kaedah itu serupa dengan yang sebelumnya dan anda boleh menggunakan satu kaedah di mana anda hanya menukar nama operasi. Tetapi mereka tidak meneka!  Penamaan di sana sangat berbeza dalam kaedah dan dalam maklumat yang dikembalikan. Dan kiraan halaman bermula dari 0, kemudian dari 1. Agar tidak keliru dalam semua ini, lebih mudah untuk menulis dua kaedah yang berbeza. Yang pelik, kerana logik kerja adalah sama. Saya meludah untuk masa yang lama apabila saya cuba membuat satu kaedah dan terdapat kurang kod. Tidak akan ada contoh di sini.

GetOperationsByCursor

Kegemaran saya daripada mereka bertiga. Walaupun bukan yang paling tepat, tetapi yang paling memadai. Kami membuat permintaan dari awal membuat akaun hingga tarikh maksimum yang mungkin (menutup akaun atau akaun semasa). Kami mendapat jawapan, ambil kursor dan minta semula selagi ada data.  Dan kod itu lebih ringkas daripada contoh di atas.

pemasa const = masa tak segerak => {     kembalikan Janji baharu(selesai => setTimeout(selesai, masa)); }   const getOperationsByCursor = async (sdk, accountId, from, to, cursor = ”) => {     cuba {         const reqData = {             accountId,             from,             to,             had: 1000,             state: sdk.OperationState.OPERATION_STATE_EXECUTED,             withoutCommissions: false,             withoutTrades: false,             withoutOvernights: false,             kursor,         };           kembali menunggu sdk.operations.getOperationsByCursor(reqData);     } tangkap (e) {         tunggu pemasa(60000);         kembali menunggu getOperationsByCursor(sdk, accountId, from, to, cursor = ”);     } };

Draf untuk dijalankan ada di sini: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Kini kami bersedia untuk menambah operasi penerimaan ke permohonan kami. Jika dilakukan dengan betul, maka anda perlu mendapatkan laporan pembrokeran untuk keseluruhan kewujudan akaun. Dan untuk data yang hilang, T-3 yang sama, muat semula daripada operasi. Tetapi ini boleh dipisahkan menjadi artikel yang berasingan. Antara nuansa utama yang anda akan temui adalah untuk melekatkan operasi dan laporan pembrokeran.

  •  Jika hari ini anda menerima laporan pembrokeran dan transaksi untuk tarikh yang diperlukan, letakkan semuanya dalam pangkalan data, maka tiada masalah. 
  • Anda akan menghadapi masalah esok apabila anda menerima bahagian data seterusnya daripada laporan dan operasi dan memutuskan untuk menyegerakkannya dengan pangkalan data sedia ada. 
  • Banyak nuansa tentang tidak sepadan atau menukar id selepas pemprosesan
  • Kemudian untuk pasaran OTC, id tidak sepadan sama sekali.
  •  Serta nuansa instrumen penyegerakan, yang sekali lagi tidak bertepatan, disebabkan oleh keanehan API. Tetapi itu cerita lain.

Mari tambahkan mendapatkan maklumat tentang operasi pada aplikasi kami. Persoalan utama ialah di mana data akan diproses dan disimpan.

  •  Jika anda melakukannya untuk diri sendiri, anda akan menggunakan data yang sama daripada peranti yang berbeza. Kemudian anda perlu memproses dan menyimpan data pada pelayan.
  • Jika anda mempunyai banyak data berbeza yang digunakan oleh banyak pengguna yang berbeza, maka anda perlu memutuskan apa yang lebih penting: kelajuan pengguna atau penjimatan besi di sebelah anda. Sesiapa yang mampu membeli perkakasan yang tidak terhingga mengira segala-galanya pada pelayannya dan menjadikannya sangat pantas untuk pengguna, menjimatkan sumber pengguna, seperti bateri dan trafik, yang sangat penting pada telefon.

Sebaliknya, mengira dalam penyemak imbas bukanlah penyelesaian yang paling optimum pada dasarnya. Oleh itu, apa yang tidak mahal, kami menganggapnya pada pelayan kami. Selebihnya kami serahkan kepada pelanggan. Saya sangat ingin mengambil dan mengira komisen pada pelayan. Tetapi inilah nuansa yang dipanggil “interaktiviti”. Katakan anda mempunyai beribu-ribu operasi dan mengambil masa lima minit untuk menerimanya. Apakah yang akan dimiliki oleh pengguna pada masa ini? pemutar? Kemajuan? Infa tentang berapa banyak yang telah dimuat naik? Adalah sesuai untuk menggunakan “menunggu aktif” apabila pengguna dalam proses sudah dapat melihat sesuatu. Inilah Hasilnya:Kami sedang membangunkan perkhidmatan mikro menggunakan API Tinkoff Invest untuk mengautomasikan kerja dengan laporan pembrokeran dan mengira komisen.

  • Memuatkan halaman
  • Semua invois diminta
  • Selepas itu, semua transaksi dengan komisen untuk transaksi yang dilaksanakan diminta untuk semua akaun. Apabila data diterima, ia dipaparkan dalam penyemak imbas.

Untuk tidak menapis data dalam acara setiap kali, kami menarik acara kami sendiri untuk setiap akaun. seperti ini:

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

Draf untuk dilancarkan ada di sini: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Teruskan. Sangat bagus kerana anda telah membaca baris ini! 

Pengiraan dan pengeluaran maklumat yang diminati

Bergantung pada siapa yang memerlukan maklumat apa. Oleh itu, saya segera memberitahu anda nuansa utama yang akan anda hadapi.

Bekerja dengan harga 

Setiap orang yang bekerja dengan kewangan tahu bahawa urus niaga wang hanya boleh dilakukan dengan nombor bulat. Disebabkan oleh ketidaktepatan nilai selepas titik perpuluhan dan ralat kumulatif dengan sejumlah besar operasi. Itulah sebabnya semua harga dibentangkan dalam format MoneyValue berikutKami sedang membangunkan perkhidmatan mikro menggunakan API Tinkoff Invest untuk mengautomasikan kerja dengan laporan pembrokeran dan mengira komisen.

padangmenaipPenerangan
mata wangtaliKod mata wang ISO rentetan
unitint64Bahagian integer daripada jumlah, boleh menjadi nombor negatif
nanoint32Bahagian pecahan daripada jumlah, boleh menjadi nombor negatif

Kami memprosesnya secara berasingan, kemudian membawanya kepada nilai harga:

sebut harga.unit + sebut harga.nano / 1e9

Kos kontrak niaga hadapan

Harga niaga hadapan dibentangkan dalam mata, apabila anda mempunyai masa hadapan mata wang, anda perlu mengetahui kadarnya. Dan sudah tentu harga dalam mata dan langkah harga. Apabila anda mengira keuntungan daripada transaksi, ini boleh menembak, kerana. jika anda mengira jumlah keseluruhan dengan mendarabkan harga dengan kuantiti. Di sini anda perlu berhati-hati. Buat masa ini, kita akan lihat bagaimana keadaannya. Ini terpakai kepada niaga hadapan mata wang, di tempat lain semuanya ok dengan ini.Kami sedang membangunkan perkhidmatan mikro menggunakan API Tinkoff Invest untuk mengautomasikan kerja dengan laporan pembrokeran dan mengira komisen.Kami sedang membangunkan perkhidmatan mikro menggunakan API Tinkoff Invest untuk mengautomasikan kerja dengan laporan pembrokeran dan mengira komisen.

pasaran OTC

Pasaran ini mempunyai banyak keanehan, jadi mari kita kaji operasi di atasnya secara berasingan. Apabila anda mula menyegerakkan operasi, ternyata anda perlu membawa figi / ticker ke bentuk yang sama untuk memadankan instrumen dengan betul. Apabila anda mula menyegerakkan ini dengan laporan pembrokeran, ternyata tradeID bagi transaksi yang sama mempunyai huruf pada permulaan urus niaga dan ia tiada dalam laporan pembrokeran. Oleh itu, mereka tidak boleh dibandingkan … ahem-ahem … dengan perbandingan! Saya memadankan masa perdagangan, ticker dan memadankan bahawa satu tradeId terkandung dalam yang lain. Betul, saya tidak tahu. Sesiapa yang menghadapi perkara ini dan yang mengambil berat tentangnya, datang kepada isu itu atau mulakan isu baharu.Kami sedang membangunkan perkhidmatan mikro menggunakan API Tinkoff Invest untuk mengautomasikan kerja dengan laporan pembrokeran dan mengira komisen.

Operasi matematik pada alatan

Adalah mustahil, tanpa melihat, untuk melaksanakan operasi matematik dengan keseluruhan senarai. Untuk tidak menambah hangat kepada lembut, kami sentiasa menyemak mata wang dan memproses hanya jika kami pasti mata wang itu sepadan, dan mata ditukar kepada mata wang yang dikehendaki. Berbekalkan pengetahuan tentang bekerja dengan nombor bank, kami akan mengira komisen yang dibelanjakan untuk setiap akaun. Seperti ini: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4Kami sedang membangunkan perkhidmatan mikro menggunakan API Tinkoff Invest untuk mengautomasikan kerja dengan laporan pembrokeran dan mengira komisen.   

Perkhidmatan mikro sedia!

https://github.com/pskucherov/tcsstat Sebagai kerja rumah, anda boleh menyemak sama ada perkhidmatan berfungsi dengan sambungan yang perlahan, apabila sambungan terputus, apabila Internet terputus, apabila ralat atau had tamat tempoh di pihak broker. 

Kesimpulan dan rancangan untuk masa hadapan

  • Belajar tentang operasi asas dan bekerja dengan Invest API
  • Masa yang dibelanjakan ~ 10 jam
  • Tahap kesukaran ~ junior+ / pertengahan rendah 

Jika anda terus memperhalusi perkhidmatan mikro, anda mungkin akan mendapat sesuatu seperti ini

https://opexbot.info

  Ini perkembangan saya, bagi mereka yang malas faham, berlari dan mengira sendiri. Saya bercadang untuk menambah analitik di sana atas permintaan pengguna. Jika anda menyukai artikel itu, langgan saluran telegram saya . Kami sedang membangunkan perkhidmatan mikro menggunakan API Tinkoff Invest untuk mengautomasikan kerja dengan laporan pembrokeran dan mengira komisen.

Pavel
Rate author
Add a comment

  1. Isakiiev

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

    Reply