Tinkoff Investments uchun statistik xizmatni rivojlantirishning ilhomlantiruvchilari quyidagilar edi:
- Habré haqidagi maqola “Tinkoff Investments nima demayapti”
- platforma foydalanuvchilarining istaklarini tahlil qilish
- komissiyalarni hisoblash haqida maqola .
- Nima muhokama qilinadi?
- Statistika xizmatini bosqichma-bosqich rivojlantirish:
- Tinkoff Invest API-ga ulanish
- Brauzerda Tinkoff Invest API-dan ma’lumotlarni chizish
- Brokerlik hisobotlari va operatsiyalarini qabul qilish
- GetBrokerReport
- Joriy sanadan ayirishni hisobga olgan holda sanani olish usuli
- Hisobot yaratish so’rovi
- Natija:
- Dividendlarni oling. Xorijiy emitent
- GetOperationsByCursor
- Qiziqarli ma’lumotlarni hisoblash va chiqarish
- Narxlar bilan ishlash
- Fyuchers shartnomalari narxi
- Birjadan tashqari bozor
- Asboblar ustidagi matematik amallar
- Mikroservis tayyor!
- Xulosa va kelajak uchun rejalar
- https://opexbot.info
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:
- Tinkoff Invest API-ga ulanish
- Brauzerda Tinkoff Invest API-dan ma’lumotlarni chizish
- Brokerlik hisobotlari va operatsiyalarini qabul qilish
- Qiziqarli ma’lumotlarni hisoblash va chiqarish
- 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:
- 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.
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
- https://github.com/pskucherov/tcsstat/commit/7e1ac57061e5e971588479015b06d8814d6609a9
- https://github.com/pskucherov/tcsstat/commit/b28ac973a57494f5232589b4cb6b9fb13b8af759
Foydali:
- Keyingi va rozetka bilan qanday qilib do’stlar orttirish bu erda batafsil tavsiflangan .
- Do’stlik kodi next+socket+investapi:
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
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 .
- 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.
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 :
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:
- 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 keltirilgan
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.
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.
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…step4
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 .
Полезная статья. Не могу представить, сколько усилий автора потребовалось, чтобы все описать. Благодарю.