Tinkoff Investments üçün statistik xidmətin inkişafının ilhamvericiləri :
- Habré haqqında məqalə “Tinkoff İnvestisiyaları nə demir”
- platforma istifadəçilərinin istəklərinin təhlili
- komissiyaların hesablanması haqqında məqalə .
- Nə müzakirə olunacaq?
- Statistika xidmətinin addım-addım inkişafı:
- Tinkoff Invest API ilə əlaqə
- Brauzerdə Tinkoff Invest API-dən məlumatların çəkilməsi
- Broker hesabatlarının və əməliyyatların qəbulu
- GetBrokerReport
- Cari tarixdən çıxma nəzərə alınmaqla tarixin alınması üsulu
- Hesabatın yaradılması sorğusu
- Nəticə:
- Dividends Xarici Emitent alın
- GetOperationsByCursor
- Maraqlanan məlumatların hesablanması və çıxarılması
- Qiymətlərlə işləmək
- Fyuçers müqavilələrinin dəyəri
- OTC bazarı
- Alətlər üzərində riyazi əməliyyatlar
- Mikroservis hazırdır!
- Nəticələr və gələcək üçün planlar
- https://opexbot.info
Nə müzakirə olunacaq?
- İnkişaf haqqında yalnız tətbiq olunan hissə.
- Maliyyə alətləri ilə işləməkdə çox vacib olan real bilik və təcrübə.
- Üzərində işlənəcək məsələlərin icmalı
Beləliklə, ticarət statistikasını hesablamaq və bunu rahat şəkildə etmək istəyirəm.
Statistika xidmətinin addım-addım inkişafı:
- Tinkoff Invest API ilə əlaqə
- Brauzerdə Tinkoff Invest API-dən məlumatların çəkilməsi
- Broker hesabatlarının və əməliyyatların qəbulu
- Maraqlanan məlumatların hesablanması və çıxarılması
- Nəticələr və gələcək üçün planlar
Tinkoff Invest API ilə əlaqə
API-yə qoşulmaq üçün https://github.com/Tinkoff/investAPI#sdk sənədlərindən istənilən SDK götürə bilərsiniz . Və ya npm paketi ` tinkoff-sdk-grpc-js `. Paketin tərtibatçılar tərəfindən ən son versiyaya yenilənməsi vacibdir. Yüklemek
npm və tinkoff-sdk-grpc-js
Yoxlama
const { createSdk } = tələb (‘tinkoff-sdk-grpc-js’); // Bu şəkildə əldə edilə bilən token const TOKEN = ‘YOURAPI’; // TCS qeydlərində tapa biləcəyiniz tətbiqin adı. const appName = ‘tcsstat’; const sdk = createSdk(TOKEN, appName); (async () => { console.log(sdk.users.getAccounts() gözləyir); })();
Nəticə: konsolda hesablarınızın siyahısı görünəcək. Məsələn, nüansları təhlil edək:
- Hesablar siyahısında API istifadə edərək işləyə bilməyəcəyiniz “İnvestisiya bankı” var
- Nəzərə alın ki, sahələr camelCase-də gəlir, sənədləşmədə isə bu sahələr under_score-da təqdim olunur.
- Bu, hər yerdə belə olacaq, ona görə də sənədlərdən bir sahə götürüb kopyalaya bilməzsiniz.
Faydalı:
- Bu kodu layihə filialında tapa bilərsiniz
https://github.com/pskucherov/tcsstat/tree/step1 https://github.com/pskucherov/tcsstat/compare/step1
Brauzerdə Tinkoff Invest API-dən məlumatların çəkilməsi
Next.js və socket.io-nu götürdüm. Bu güclü tövsiyə deyil, öz mülahizənizlə seçin.
npx create-next-app@latest npm və socket.io socket.io-client
Dərhal növbəti+socket+investapi dostluq addımına keçirik və bütün təfərrüatlar üçün bu addımın Faydalı bölməsinə baxın. Təfərrüatları təsvir edəcəyəm:
- Nodejs (server) tərəfində pages/api/investapi.js faylı var. Burada biz socket.io serverini yaradırıq və investapi-yə qoşuluruq.
- Brauzer (müştəri) tərəfində biz rozetka vasitəsilə serverə qoşuluruq və brokerdən hesab məlumatlarını tələb edirik.
- Biz serverdəki brokerdən məlumatları alırıq, sonra müştəriyə göndəririk. Müştəridə qəbul edildikdə, onlar brauzerdə göstərilir.
Nəticə: brauzer konsolunda hesablar haqqında məlumat görə bilərik. Yəni son mərhələdə server konsolunda (nodejs) hesablar haqqında məlumat gördük, cari mərhələdə bu məlumatları müştəriyə (brauzerə) ötürdük.
İndi gəlin bunu edək ki, brauzerdən hesab seçə biləsən və heç bir işarə yoxdursa, konsola xəta göndərilir. İş sadədir və yeni bir şey yoxdur, ona görə də mən yalnız öhdəliklərə bağlantılar verirəm
- https://github.com/pskucherov/tcsstat/commit/7e1ac57061e5e971588479015b06d8814d6609a9
- https://github.com/pskucherov/tcsstat/commit/b28ac973a57494f5232589b4cb6b9fb13b8af759
Faydalı:
- Sonrakı və yuva ilə necə dostluq etmək burada ətraflı təsvir edilmişdir .
- Dostluq kodu next+socket+investapi:
https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Yuxarıdakılar kimin üçün çətindir, onda biz bu mərhələdə qalıb kodla məşğul oluruq. Suallarınız varsa – soruşun. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2
Broker hesabatlarının və əməliyyatların qəbulu
Broker hesabatlarını və əməliyyatlarını əldə etməyin üç üsulu var
Əvvəldən bilmək vacibdir:
- Broker hesabatı T-3 rejimində yaradılır, yəni. əməliyyatlar faktiki icra edildikdən sonra orada göstərilir.
- Müvafiq olaraq, son iki gündə bu hesabatı tələb etsəniz, üç günə hazır olacaq.
- Son günlər üçün əməliyyatları əldə etmək üçün biz əməliyyatların qəbulu metodundan istifadə edirik, lakin unutmayın ki, onların id və məzmunu broker hesabatı yaradıldıqdan sonra dəyişə bilər.
GetBrokerReport
Broker hesabatını əldə etmək üçün hesabın id-sini, hesabatın başlanğıc tarixini və bitmə tarixini götürməlisiniz, lakin 31 gündən çox olmamalıdır. _broker_report_request generasiyasında API-yə hesabat yaratmaq üçün sorğu göndəririk , cavab olaraq taskId əldə edirik. Bundan sonra, bu taskId-dən istifadə edərək, get _broker_report_response- dən məlumat alırıq .
- Bu tarixlər üçün TaskID-ni həmişəlik saxlamalısınız.
- Əgər onu itirsəniz, tələb olunan tarixlər üçün hesabat əvvəlcə nəsil sorğusuna cavab olaraq gələcək,
- Və sonra ümumiyyətlə gəlməyəcək.
Cari tarixdən çıxma nəzərə alınmaqla tarixin alınması üsulu
const getDateSubDay = (alt Gün = 5, başlanğıc = doğru) => { sabit tarix = yeni Tarix(); date.setUTCDate(date.getUTCDate() – subDay); if (start) { date.setUTCHours(0, 0, 0, 0); } else { date.setUTCHours(23, 59, 59, 999); } qaytarılma tarixi; };
Hesabatın yaradılması sorğusu
const brokerReport = gözləyirik (sdk.operations.getBrokerReport)({ generatorBrokerReportRequest: { accountId, from, to, }, });
Nəticə:
- Komandanın ilk icrası nəticəsində biz taskId alırıq.
- Hesabat broker tərəfindən hazırlanmağa başlayır. Nə vaxt hazır olduğu bilinmir, biz gözləyirik və hesabatı gözləyərək vaxtaşırı olaraq taskId-i çəkirik.
- Niyə? Çünki hesabat hazır deyilsə, xəta atır. Hesabat broker tərəfindən hazır deyilsə, bu, kodunuzda səhvdir. Lütfən, emal edin: 30058|INVALID_ARGUMENT|tapşırıq hələ tamamlanmayıb, daha sonra yenidən cəhd edin
Hesabatı gözləmək və qəbul etmək üçün kod bu kimi görünür.
const timer = async time => { yeni Promise qaytarın (həll et => setTimeout (həll et, vaxt)); } const getBrokerResponseByTaskId = async (taskId, page = 0) => { cəhd edin { qaytarın gözləyin (sdk.operations.getBrokerReport)({ getBrokerReportRequest: { taskId, page, }, }); } catch (e) { console.log(‘gözləyin’, e); gözləmə taymeri (10000); qayıdış gözləyir getBrokerResponseByTaskId(taskId, page); } };
Sonra eyni sehr baş verir. Biz skriptimizi dayandırırıq, yenidən başlayırıq, tapşırıq identifikatorumuz yoxdur. Biz kodu taskId sorğusu ilə icra edirik, lakin biz artıq taskId deyil, dərhal hesabat alırıq. Sehrli! Həmişə belə olsaydı hər şey yaxşı olardı. Ancaq bir aydan sonra heç bir məlumat olmayacaq. Faydalı :
- Burada və burada bir az nəzəriyyə təsvir edilmişdir .
- Kodu bir yerə qoysaq, layihə bu kimi görünəcək.
https://github.com/pskucherov/tcsstat/tree/step3.1 https://github.com/pskucherov/tcsstat/compare/step3.1
- Əgər kimsə bununla qarşılaşırsa, o zaman məsələyə xoş gəlmisiniz . Onlar bu sehri təmir etdikdən sonra gücünü itirəcək və bir növ fərqli olacaq. Ancaq indiki anda (21/03/2023) elə işləyir.
Dividends Xarici Emitent alın
Kimsə metodun əvvəlkinə bənzədiyini düşünə bilər və siz yalnız əməliyyatların adını dəyişdirdiyiniz tək bir üsuldan istifadə edə bilərsiniz. Ancaq təxmin etmədilər! Oradakı adlandırma həm üsullarda, həm də qaytarılan məlumatlarda çox fərqlidir. Və səhifə sayı 0-dan başlayır, sonra 1-dən. Bütün bunlarda çaşqınlıq yaşamamaq üçün iki fərqli üsul yazmaq daha asandır. Qəribədir, çünki işin məntiqi eynidir. Bir üsul hazırlamağa çalışanda uzun müddət tüpürdüm və kod daha az idi. Burada heç bir nümunə olmayacaq.
GetOperationsByCursor
Üçündən ən çox sevdiyim. Ən dəqiq olmasa da, ən adekvatdır. Hesabın yaradılmasının əvvəlindən mümkün olan maksimum tarixə qədər (hesabın bağlanması və ya cari) sorğu veririk. Cavabı alırıq, kursoru götürürük və məlumat olduğu müddətdə yenidən tələb edirik. Və kod yuxarıdakı nümunələrdən daha qısadır.
const timer = async time => { yeni Promise qaytarın (həll et => setTimeout (həll et, vaxt)); } const getOperationsByCursor = async (sdk, accountId, from, to, cursor = ”) => { try { const reqData = { accountId, from, to, limit: 1000, state: sdk.OperationState.OPERATION_STATE_EXECUTED, withoutCommissions, false: olmadanTrades: false, withoutOvernights: false, cursor, }; qayıdış gözləyir sdk.operations.getOperationsByCursor(reqData); } tutmaq (e) { taymeri gözləmək (60000); return await getOperationsByCursor(sdk, accountId, from, to, cursor = ”); } };
İcra ediləcək layihə buradadır: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 İndi biz qəbul əməliyyatlarını əlavə etməyə hazırıq. tətbiqimiz. Düzgün edilərsə, hesabın bütün mövcudluğu üçün broker hesabatları almalısınız. Və çatışmayan məlumatlar üçün, eyni T-3-lər əməliyyatlardan yenidən yüklənir. Ancaq bunu ayrı bir məqaləyə bölmək olar. Qarşılaşacağınız əsas nüanslardan biri əməliyyatları və broker hesabatını yapışdırmaqdır.
- Bu gün tələb olunan tarixlər üçün broker hesabatı və əməliyyatlar almısınızsa, hamısını məlumat bazasına qoyun, onda heç bir problem yoxdur.
- Sabah hesabatdan və əməliyyatlardan məlumatların növbəti hissəsini aldıqda və onları mövcud verilənlər bazası ilə sinxronizasiya etmək qərarına gəldikdə problemlər yaranacaq.
- Emaldan sonra id-nin uyğunsuzluğu və ya dəyişdirilməsi ilə bağlı çoxlu nüanslar
- Sonra birjadankənar bazar üçün id-lər ümumiyyətlə uyğun gəlmir.
- Həmçinin API-nin xüsusiyyətlərinə görə yenidən üst-üstə düşməyən sinxronizasiya alətlərinin nüansları. Amma bu başqa hekayədir.
Əməliyyatlar haqqında məlumat əldə etməyi tətbiqimizə əlavə edək. Əsas sual məlumatların harada işlənəcəyi və saxlanacağı olacaq.
- Bunu özünüz üçün etsəniz, fərqli cihazlardan eyni məlumatları istehlak edəcəksiniz. Sonra serverdə məlumatları emal etməli və saxlamalısınız.
- Bir çox fərqli istifadəçi tərəfindən istehlak edilən çoxlu müxtəlif məlumatlarınız varsa, o zaman nəyin daha vacib olduğuna qərar verməlisiniz: istifadəçilərin sürəti və ya sizin tərəfinizdəki dəmirə qənaət. Sonsuz miqdarda aparat ala bilən hər kəs öz serverindəki hər şeyi hesablayır və onu istifadəçilər üçün çox sürətli edir, telefonlar üçün çox vacib olan batareya və trafik kimi istifadəçi resurslarına qənaət edir.
Öz növbəsində, brauzerdə saymaq prinsipcə ən optimal həll deyil. Buna görə də, bahalı olmayan şey, onu serverimizdə hesab edirik. Qalanını müştərinin öhdəsinə buraxırıq. Mən çox istəyirəm ki, serverdə komissiya götürüb hesablayaq. Ancaq burada “interaktivlik” adlı nüans gəlir. Tutaq ki, minlərlə əməliyyatınız var və onları qəbul etmək beş dəqiqə çəkir. Bu zaman istifadəçi nəyə sahib olacaq? Spinner? Tərəqqi? Infa nə qədər yüklənib? Prosesdə olan istifadəçi artıq bir şey görə bildiyi zaman “aktiv gözləmə”dən istifadə etmək idealdır. Nəticə budur :
- Səhifə yüklənir
- Bütün fakturalar tələb olunur
- Bundan sonra, bütün hesablar üçün icra edilmiş əməliyyatlar üçün komissiya ilə bütün əməliyyatlar tələb olunur. Məlumat alındıqca brauzerdə göstərilir.
Hər dəfə hadisələrdəki məlumatları süzgəcdən keçirməmək üçün hər hesab üçün öz hadisəmizi çəkirik. Bunun kimi:
socket.emit(‘sdk:getOperationsCommissionResult_’ + accountId, { element: data?.items, inProgress: Boolean(nextCursor), });
Başlamaq üçün layihə buradadır: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Davam edir. Bu sətri oxumağınız çox gözəldir!
Maraqlanan məlumatların hesablanması və çıxarılması
Kimin hansı məlumata ehtiyacı olmasından asılıdır. Buna görə də mən sizə dərhal qarşılaşacağınız əsas nüansları deyirəm.
Qiymətlərlə işləmək
Maliyyə ilə işləyən hər kəs bilir ki, pul əməliyyatları yalnız tam ədədlərlə aparılmalıdır. Onluq nöqtədən sonra dəyərlərin qeyri-dəqiqliyi və çox sayda əməliyyatla məcmu xəta səbəbindən. Buna görə bütün qiymətlər aşağıdakı MoneyValue formatında təqdim olunur
sahə | növü | Təsvir |
---|---|---|
Valyuta | simli | Sətir ISO valyuta kodu |
vahidlər | int64 | Cəmin tam hissəsi mənfi ədəd ola bilər |
nano | int32 | Məbləğin kəsr hissəsi mənfi bir ədəd ola bilər |
Onları ayrıca emal edirik, sonra qiymət dəyərinə gətiririk:
kotirovka.vahidlər + kotirovka.nano / 1e9
Fyuçers müqavilələrinin dəyəri
Fyuçerslərin qiyməti ballarla təqdim olunur, valyuta gələcəyi olduqda, məzənnəni bilmək lazımdır. Və əlbəttə ki, ballarda qiymət və qiymət addımı. Siz əməliyyatlardan mənfəət hesablamaq zaman, bu vurmaq bilər, çünki. qiyməti kəmiyyətə vuraraq ümumi məbləği hesablasanız. Burada diqqətli olmaq lazımdır. Hələlik bunun necə getdiyini görəcəyik. Bu valyuta fyuçerslərinə aiddir, başqa yerlərdə bununla bağlı hər şey qaydasındadır.
OTC bazarı
Bu bazarın bir çox özəllikləri var, ona görə də onun üzərində əməliyyatları ayrıca öyrənək.Əməliyyatları sinxronlaşdırmağa başlayanda məlum olacaq ki, alətə düzgün uyğunlaşmaq üçün figi/ticker-i eyni formaya gətirmək lazımdır. Bunu broker hesabatı ilə sinxronlaşdırmağa başlayanda məlum olacaq ki, eyni əməliyyatın ticarət ID-sinin əməliyyatların əvvəlində hərfləri var və onlar broker hesabatında yoxdur. Buna görə də, onları müqayisə etmək olmaz … ahem-ahem … müqayisə ilə! Mən ticarət vaxtını, tickeri və bir ticarət identifikatorunun digərində olduğunu uyğunlaşdırdım. Düzdü, bilmirəm. Kim bununla qarşılaşırsa və kim maraqlanırsa, məsələyə gəlsin və ya yeni işə başlasın.
Alətlər üzərində riyazi əməliyyatlar
Baxmadan bütün siyahı ilə riyazi əməliyyatları yerinə yetirmək mümkün deyil. Yumşaqdan isti əlavə etməmək üçün biz həmişə valyutanı yoxlayırıq və yalnız valyutanın uyğun olduğuna və xalların istədiyiniz valyutaya çevrildiyinə əmin olduğumuz halda əməliyyat edirik. Bank nömrələri ilə işləmək haqqında biliklərlə silahlanaraq, hesabların hər birinə sərf olunan komissiyanı hesablayacağıq. Bunun kimi: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4
Mikroservis hazırdır!
https://github.com/pskucherov/tcsstat Ev tapşırığı olaraq, xidmətin yavaş bağlantı ilə işlədiyini, bağlantılar pozulduqda, İnternet bağlantısı kəsildikdə, broker tərəfindən səhvlər və ya limitlərin müddəti bitdikdə yoxlaya bilərsiniz.
Nəticələr və gələcək üçün planlar
- Əsas əməliyyatlar və Invest API ilə işləmək haqqında məlumat əldə edin
- Vaxt sərf ~ 10 saat
- Çətinlik səviyyəsi ~ kiçik+ / aşağı orta
Mikroservisi təkmilləşdirməyə davam etsəniz, belə bir şeylə nəticələnə bilərsiniz
https://opexbot.info
Bu mənim inkişafımdır, başa düşmək, qaçmaq və öz başına saymaq üçün çox tənbəl olanlar üçün. İstifadəçilərin istəyi ilə ora analitik əlavə etməyi planlaşdırıram. Məqaləni bəyəndinizsə, telegram kanalıma abunə olun .
Полезная статья. Не могу представить, сколько усилий автора потребовалось, чтобы все описать. Благодарю.