Biz brokerlik hisobotlari bilan ishlash va komissiyalarni hisoblashni avtomatlashtirish uchun Tinkoff Invest API yordamida mikroservisni ishlab chiqmoqdamiz.

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

Tinkoff Investments uchun statistik xizmatni rivojlantirishning ilhomlantiruvchilari quyidagilar edi:

Nima muhokama qilinadi?

  • Rivojlanish haqida faqat amaliy qism.
  • Moliyaviy vositalar bilan ishlashda juda muhim bo’lgan haqiqiy bilim va tajriba.
  • Ishlash kerak bo’lgan masalalarning umumiy ko’rinishi

Shunday qilib, men savdo statistikasini hisoblashni va uni qulay tarzda qilishni xohlayman. 

Statistika xizmatini bosqichma-bosqich rivojlantirish: 

  1. Tinkoff Invest API-ga ulanish
  2. Brauzerda Tinkoff Invest API-dan ma’lumotlarni chizish
  3. Brokerlik hisobotlari va operatsiyalarini qabul qilish
  4. Qiziqarli ma’lumotlarni hisoblash va chiqarish
  5. Xulosa va kelajak uchun rejalar

Tinkoff Invest API-ga ulanish

API ga ulanish uchun https://github.com/Tinkoff/investAPI#sdk hujjatidan istalgan SDK ni olishingiz mumkin . Yoki ` tinkoff-sdk-grpc-js` npm paketi . Paket ishlab chiquvchilar tomonidan eng so’nggi versiyaga yangilangan bo’lishi muhimdir. O’rnatish

npm va tinkoff-sdk-grpc-js

Tekshirish

const { createSdk } = talab (‘tinkoff-sdk-grpc-js’);   // Shu tarzda olinishi mumkin bo’lgan token   const TOKEN = ‘YOURAPI’;   // Sizni TCS jurnallarida topish mumkin bo’lgan dastur nomi. const appName = ‘tcsstat’;   const sdk = createSdk(TOKEN, appName); (async () => {     console.log(kutish sdk.users.getAccounts()); })();

Natija: konsolda hisoblaringiz ro’yxati ko’rsatiladi. Masalan, nuanslarni tahlil qilaylik:Biz brokerlik hisobotlari bilan ishlash va komissiyalarni hisoblashni avtomatlashtirish uchun Tinkoff Invest API yordamida mikroservisni ishlab chiqmoqdamiz.

  • Hisoblar ro’yxatida “Investitsiya banki” mavjud bo’lib, u bilan API yordamida ishlay olmaysiz
  • E’tibor bering, maydonlar camelCase-da keladi, hujjatlarda esa bu maydonlar under_score-da ko’rsatilgan. 
  • Hamma joyda shunday bo’ladi, shuning uchun siz hujjatlardan maydonni olib, nusxa ko’chira olmaysiz.

Foydali:

  • Ushbu kodni loyiha bo’limida topishingiz mumkin

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

Brauzerda Tinkoff Invest API-dan ma’lumotlarni chizish

Men next.js va socket.io-ni oldim. Bu kuchli tavsiya emas, o’zingizning ixtiyoringiz bilan tanlang. 

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

Biz darhol keyingi+socket+investapi doʻstlik bosqichiga oʻtamiz va barcha tafsilotlar uchun ushbu bosqichning  Foydali boʻlimiga qarang. Tafsilotlarni tasvirlab beraman: 

  • Nodejs (server) tomonida pages/api/investapi.js fayli mavjud. Bu erda biz socket.io serverini yaratamiz va investapi-ga ulanamiz.
  • Brauzer (mijoz) tomonida biz serverga rozetka orqali ulanamiz va brokerdan hisob ma’lumotlarini so’raymiz. 
  • Biz serverdagi brokerdan ma’lumotlarni olamiz, keyin uni mijozga yuboramiz. Ular mijozda qabul qilinganda, ular brauzerda ko’rsatiladi. 

Natija:  brauzer konsolida biz hisoblar haqidagi ma’lumotlarni ko’rishimiz mumkin. Ya’ni, oxirgi bosqichda biz server konsolidagi (nodejs) hisoblar haqidagi ma’lumotlarni ko’rdik, joriy bosqichda biz ushbu ma’lumotni mijozga (brauzer) uzatdik.

Biz brokerlik hisobotlari bilan ishlash va komissiyalarni hisoblashni avtomatlashtirish uchun Tinkoff Invest API yordamida mikroservisni ishlab chiqmoqdamiz.

Keling, brauzerdan hisob qaydnomasini tanlashingiz uchun buni qilaylik va agar token bo’lmasa, konsolga xatolik yuboriladi. Ish oddiy va yangi narsa yo’q, shuning uchun men faqat majburiyatlarga havolalar beraman

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

Foydali:

https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Yuqoridagilar kimga qiyin bo’lsa, biz ushbu bosqichda qolamiz va kod bilan shug’ullanamiz. Savollaringiz bo’lsa – so’rang. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2

Brokerlik hisobotlari va operatsiyalarini qabul qilish

Brokerlik hisobotlari va operatsiyalarini olishning uchta usuli mavjud

  1. GetBrokerReport
  2. Dividendlarni oling. Xorijiy emitent
  3. GetOperationsByCursor

Eng boshidan bilish muhim: 

  • Brokerlik hisoboti T-3 rejimida ishlab chiqariladi, ya’ni. savdolar ular haqiqiy bajarilgandan so’ng u erda ko’rsatiladi. 
  • Shunga ko’ra, agar siz oxirgi ikki kun davomida ushbu hisobotni so’rasangiz, u uch kun ichida tayyor bo’ladi. 
  • Oxirgi kunlardagi tranzaktsiyalarni olish uchun biz tranzaktsiyalarni qabul qilish usulidan foydalanamiz, ammo esda tutingki, ularning identifikatori va mazmuni brokerlik hisoboti yaratilgandan keyin o’zgarishi mumkin.

GetBrokerReport

Brokerlik hisobotini olish uchun siz hisob identifikatorini, hisobotning boshlanish sanasi va tugash sanasini olishingiz kerak, lekin 31 kundan oshmasligi kerak. Biz _broker_report_request yaratishda API-ga hisobot yaratish uchun so’rov yuboramiz , javob sifatida taskId oling. Shundan so’ng, ushbu taskId-dan foydalanib, biz _broker_report_response-dan ma’lumotlarni olamiz .

Hujjatlarda aytilishicha, aslida nuanslar bor. Qo'llaringizga e'tibor bering:

  • TaskID ni aynan shu sanalar uchun abadiy saqlashingiz kerak. 
  • Agar siz uni yo’qotsangiz, so’ralgan sanalar uchun hisobot birinchi navbatda avlod so’roviga javob beradi, 
  • Va keyin u umuman kelmaydi.

Keling, kod yozishni boshlaylik

Joriy sanadan ayirishni hisobga olgan holda sanani olish usuli

const getDateSubDay = (subDay = 5, start = rost) => {     const date = new Date();     date.setUTCDate(date.getUTCDate() – subDay);       if (start) {         date.setUTCHours(0, 0, 0, 0);     } else {         date.setUTCHours(23, 59, 59, 999);     }       qaytish sanasi; };

Hisobot yaratish so’rovi 

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

Natija:

  • Buyruqning birinchi bajarilishi natijasida biz taskId ni olamiz. 
  • Hisobot broker tomonidan tuzila boshlaydi. Qachon tayyor ekanligi noma’lum, biz kutamiz va vaqti-vaqti bilan hisobotni kutish uchun taskId ni tortib olamiz.
  • Nega? Chunki agar hisobot tayyor bo’lmasa, u xato qiladi. Agar hisobot broker tomonidan tayyor bo’lmasa, bu sizning kodingizdagi xatodir. Iltimos, ishlov bering: 30058|INVALID_ARGUMENT|vazifa hali bajarilmadi, keyinroq qayta urinib ko’ring

Hisobotni kutish va qabul qilish kodi shunday ko’rinadi.

const timer = async time => {     yangi va’dani qaytarish (resolve => setTimeout(yechish, vaqt)); }   const getBrokerResponseByTaskId = async (taskId, page = 0) => {     try {         return await (sdk.operations.getBrokerReport)({             getBrokerReportRequest: {                 taskId,                 page,             },         });     } catch (e) {         console.log(‘kuting’, e);         taymerni kutish (10000);         qaytish kutilmoqda getBrokerResponseByTaskId(taskId, sahifa);     } };

Keyin xuddi shunday sehr sodir bo’ladi. Biz skriptimizni to’xtatamiz, uni qayta boshlaymiz, bizda taskid yo’q. Biz kodni taskId so’rovi bilan bajaramiz, lekin biz endi taskIdni emas, balki darhol hisobotni olamiz. Sehrli! Va agar har doim shunday bo’lsa, hamma narsa yaxshi bo’lar edi. Ammo bir oy ichida umuman ma’lumot bo’lmaydi. Foydali :

  • Bu erda va bu erda bir oz nazariya tasvirlangan .
  • Kodni birlashtirganda, qoralama shunday ko’rinadi.

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

  • Agar kimdir bunga duch kelsa, muammoga xush kelibsiz . Ular bu sehrni tuzatgandan so’ng, u o’z kuchini yo’qotadi va qandaydir tarzda boshqacha bo’ladi. Ammo hozirgi vaqtda (21.03.2023) u xuddi shunday ishlaydi.

Dividendlarni oling. Xorijiy emitent

Kimdir bu usul avvalgisiga o’xshash deb o’ylashi mumkin va siz faqat operatsiyalar nomini o’zgartiradigan yagona usuldan foydalanishingiz mumkin. Ammo ular taxmin qilishmadi!  U erdagi nomlash usullarida ham, qaytarilgan ma’lumotlarda ham juda farq qiladi. Va sahifalar soni 0 dan boshlanadi, keyin 1 dan. Bularning barchasida adashmaslik uchun ikki xil usulni yozish osonroq. Bu g’alati, chunki ish mantig’i bir xil. Men bir usulni yaratmoqchi bo’lganimda uzoq vaqt tupurdim va kamroq kod bor edi. Bu erda hech qanday misollar bo’lmaydi.

GetOperationsByCursor

Mening eng sevimli uchtasi. Garchi eng aniq bo’lmasa-da, lekin eng adekvat. Hisob qaydnomasini yaratish boshidan maksimal mumkin bo’lgan sanaga (hisobni yopish yoki joriy) so’rov yuboramiz. Biz javob olamiz, kursorni olamiz va ma’lumotlar mavjud ekan, qayta so’raymiz.  Va kod yuqoridagi misollarga qaraganda qisqaroq.

const timer = async time => {     yangi va’dani qaytarish (resolve => setTimeout(yechish, vaqt)); }   const getOperationsByCursor = async (sdk, accountId, dan, to, cursor = ”) => {     try {         const reqData = {             accountId,             dan,             to,             limit: 1000,             davlat: sdk.OperationState.OPERATION_STATE_EXECUTED,             Komissiyalarsiz:             withoutTrades: false,             withoutOvernights: false,             kursor,         };           qaytish await sdk.operations.getOperationsByCursor(reqData);     } catch (e) {         taymerni kutish (60000);         return await getOperationsByCursor(sdk, accountId, dan, to, kursor = ”);     } };

Ishlash uchun loyiha bu yerda: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Endi biz qabul qilish operatsiyalarini qo’shishga tayyormiz. bizning arizamiz. To’g’ri bajarilgan bo’lsa, hisobning butun mavjudligi uchun brokerlik hisobotlarini olishingiz kerak. Va etishmayotgan ma’lumotlar uchun, xuddi shu T-3lar, operatsiyalardan qayta yuklanadi. Ammo buni alohida maqolaga ajratish mumkin. Siz duch keladigan asosiy nuanslardan biri operatsiyalar va brokerlik hisobotini yopishtirishdir.

  •  Agar bugun siz brokerlik hisobotini va kerakli sanalar bo’yicha operatsiyalarni olgan bo’lsangiz, barchasini ma’lumotlar bazasiga qo’ying, unda hech qanday muammo yo’q. 
  • Ertaga siz hisobot va operatsiyalardan ma’lumotlarning keyingi qismini olganingizda va ularni mavjud ma’lumotlar bazasi bilan sinxronlashtirishga qaror qilganingizda muammolarga duch kelasiz. 
  • Qayta ishlashdan so’ng identifikatorning mos kelmasligi yoki o’zgarishi haqida juda ko’p nuanslar
  • Keyin birjadan tashqari bozor uchun identifikatorlar umuman mos kelmaydi.
  •  Shuningdek, API ning o’ziga xos xususiyatlaridan kelib chiqqan holda, sinxronlash asboblarining nuanslari yana mos kelmaydi. Lekin bu boshqa hikoya.

Amaliyotlar haqida ma’lumot olishni ilovamizga qo’shamiz. Asosiy savol ma’lumotlar qayerda qayta ishlanishi va saqlanishi bo’ladi.

  •  Agar siz buni o’zingiz uchun qilsangiz, siz turli xil qurilmalardan bir xil ma’lumotlarni iste’mol qilasiz. Keyin serverda ma’lumotlarni qayta ishlashingiz va saqlashingiz kerak.
  • Agar sizda juda ko’p turli xil foydalanuvchilar tomonidan iste’mol qilinadigan juda ko’p turli xil ma’lumotlar bo’lsa, unda nima muhimroq ekanligini hal qilishingiz kerak: foydalanuvchilarning tezligi yoki siz tomonda temirni tejash. Cheksiz miqdordagi uskunani sotib olishga qodir bo’lgan har bir kishi o’z serveridagi hamma narsani hisoblaydi va uni foydalanuvchilar uchun juda tez qiladi, telefonlar uchun juda muhim bo’lgan batareya va trafik kabi foydalanuvchi resurslarini tejaydi.

O’z navbatida, brauzerda hisoblash printsipial jihatdan eng maqbul echim emas. Shuning uchun, nima qimmat bo’lmasa, biz buni serverimizda ko’rib chiqamiz. Qolganini mijozga qoldiramiz. Men haqiqatan ham serverdagi komissiyani olishni va hisoblashni xohlayman. Ammo bu erda “interaktivlik” deb nomlangan nuance keladi. Aytaylik, sizda minglab operatsiyalar bor va ularni qabul qilish uchun besh daqiqa vaqt ketadi. Bu vaqtda foydalanuvchi nimaga ega bo’ladi? Spinner? Oldingami? Qancha yuklanganligi haqida infa? Jarayondagi foydalanuvchi biror narsani ko’rishi mumkin bo’lsa, “faol kutish” dan foydalanish idealdir. Mana natija:Biz brokerlik hisobotlari bilan ishlash va komissiyalarni hisoblashni avtomatlashtirish uchun Tinkoff Invest API yordamida mikroservisni ishlab chiqmoqdamiz.

  • Sahifani yuklash
  • Barcha hisob-fakturalar so’raladi
  • Shundan so’ng, barcha hisoblar uchun bajarilgan operatsiyalar uchun komissiyalar bilan barcha operatsiyalar so’raladi. Ma’lumotlar qabul qilinganda, u brauzerda ko’rsatiladi.

Har safar voqealardagi ma’lumotlarni filtrlamaslik uchun biz har bir hisob uchun o’z tadbirimizni tortamiz. Mana bunday:

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

Ishga tushiriladigan qoralama bu yerda: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Davom etilmoqda. Ushbu satrni o’qiganingiz juda yaxshi! 

Qiziqarli ma’lumotlarni hisoblash va chiqarish

Kimga qanday ma’lumot kerakligiga bog’liq. Shuning uchun, men darhol sizga duch keladigan asosiy nuanslarni aytaman.

Narxlar bilan ishlash 

Moliya bilan ishlaydigan har bir kishi pul operatsiyalarini faqat butun raqamlar bilan bajarish kerakligini biladi. O’nli kasrdan keyin qiymatlarning noto’g’riligi va ko’p sonli operatsiyalar bilan kümülatif xatolik tufayli. Shuning uchun barcha narxlar quyidagi MoneyValue formatida keltirilganBiz brokerlik hisobotlari bilan ishlash va komissiyalarni hisoblashni avtomatlashtirish uchun Tinkoff Invest API yordamida mikroservisni ishlab chiqmoqdamiz.

maydon turi Tavsif
valyuta ip String ISO valyuta kodi
birliklar int64 Yig’indining butun qismi manfiy son bo’lishi mumkin
nano int32 Miqdorning kasr qismi salbiy raqam bo’lishi mumkin

Biz ularni alohida qayta ishlaymiz, keyin ularni narx qiymatiga keltiramiz:

kotirovka.birliklar + kotirovka.nano / 1e9

Fyuchers shartnomalari narxi

Fyucherslar narxi ballarda taqdim etiladi, agar sizda valyuta kelajagingiz bo’lsa, kursni bilishingiz kerak. Va, albatta, ballardagi narx va narx bosqichi. Agar bitimlar foyda hisoblash qachon, bu otib mumkin, chunki. agar siz narxni miqdorga ko’paytirish orqali umumiy miqdorni hisoblasangiz. Bu erda siz ehtiyot bo’lishingiz kerak. Hozircha hammasi qanday ketayotganini ko’ramiz. Bu valyuta fyucherslari uchun amal qiladi, boshqa joylarda bu bilan hamma narsa yaxshi.Biz brokerlik hisobotlari bilan ishlash va komissiyalarni hisoblashni avtomatlashtirish uchun Tinkoff Invest API yordamida mikroservisni ishlab chiqmoqdamiz. Biz brokerlik hisobotlari bilan ishlash va komissiyalarni hisoblashni avtomatlashtirish uchun Tinkoff Invest API yordamida mikroservisni ishlab chiqmoqdamiz.

Birjadan tashqari bozor

Bu bozor juda ko’p o’ziga xos xususiyatlarga ega, shuning uchun keling, u bo’yicha operatsiyalarni alohida o’rganamiz.Amaliyalarni sinxronlashni boshlaganingizda, asbobni to’g’ri moslashtirish uchun figi / tickerni bir xil shaklga keltirishingiz kerak bo’ladi. Buni brokerlik hisoboti bilan sinxronlashni boshlaganingizda, xuddi shu tranzaktsiyaning savdo identifikatorida bitimlarning boshida harflar borligi va ular brokerlik hisobotida yo’qligi ma’lum bo’ladi. Shuning uchun ularni solishtirish mumkin emas … ahem-ahem … taqqoslash orqali! Men savdo vaqtini, tickerni va bitta savdo identifikatori boshqasida joylashganligini moslashtirdim. To’g’ri, bilmayman. Kim bunga duch kelsa va kim bu haqda qayg’ursa, masalaga keling yoki yangisini boshlang.Biz brokerlik hisobotlari bilan ishlash va komissiyalarni hisoblashni avtomatlashtirish uchun Tinkoff Invest API yordamida mikroservisni ishlab chiqmoqdamiz.

Asboblar ustidagi matematik amallar

To’liq ro’yxat bilan matematik amallarni izlamasdan bajarish mumkin emas. Yumshoqga issiq qo’shmaslik uchun biz har doim valyutani tekshiramiz va faqat valyuta mos kelishiga va ballar kerakli valyutaga aylantirilganiga ishonchimiz komil bo’lsa, qayta ishlaymiz. Bank raqamlari bilan ishlash bo’yicha bilimlar bilan qurollangan holda, biz har bir hisob uchun sarflangan komissiyani hisoblaymiz. Bu kabi: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4Biz brokerlik hisobotlari bilan ishlash va komissiyalarni hisoblashni avtomatlashtirish uchun Tinkoff Invest API yordamida mikroservisni ishlab chiqmoqdamiz.    

Mikroservis tayyor!

https://github.com/pskucherov/tcsstat Uyga vazifa sifatida xizmat sekin ulanish bilan ishlayotganligini, ulanishlar uzilganda, Internet uzilganda, xatoliklar yoki broker tomonidan chegaralar muddati o‘tganligini tekshirishingiz mumkin. 

Xulosa va kelajak uchun rejalar

  • Asosiy operatsiyalar va Invest API bilan ishlash haqida bilib oldik
  • Sarflangan vaqt ~ 10 soat
  • Qiyinchilik darajasi ~ kichik+ / past o’rta 

Agar siz mikroservisni yaxshilashda davom etsangiz, shunga o’xshash narsaga duch kelishingiz mumkin

https://opexbot.info

  Bu mening rivojlanishim, o’z-o’zidan tushunish, chopish va hisoblash uchun juda dangasalar uchun. Men foydalanuvchilarning iltimosiga ko’ra u erda tahlillarni qo’shishni rejalashtirmoqdaman. Agar sizga maqola yoqqan bo’lsa, mening telegram kanalimga obuna bo’ling . Biz brokerlik hisobotlari bilan ishlash va komissiyalarni hisoblashni avtomatlashtirish uchun Tinkoff Invest API yordamida mikroservisni ishlab chiqmoqdamiz.

Pavel
Rate author
Add a comment

  1. Isakiiev

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

    Reply