Инспиратори за развој статистичког сервиса за Тинкофф Инвестментс били су:
- чланак на Хабреу „Шта Тинкофф Инвестментс не говоре“
- анализа жеља корисника платформе
- чланак о обрачуну провизија .
- О чему ће се расправљати?
- Развијање статистичког сервиса корак по корак:
- Веза са Тинкофф Инвест АПИ-јем
- Цртање података из Тинкофф Инвест АПИ-ја у претраживачу
- Пријем брокерских извештаја и трансакција
- ГетБрокерРепорт
- Метода за добијање датума, узимајући у обзир одузимање од текућег датума
- Захтев за генерисање извештаја
- резултат:
- ГетДивидендсФореигнИссуер
- ГетОператионсБиЦурсор
- Прорачун и излаз информација од интереса
- Рад са ценама
- Трошкови фјучерс уговора
- ОТЦ тржиште
- Математичке операције над алатима
- Микросервис је спреман!
- Закључци и планови за будућност
- хттпс://опекбот.инфо
О чему ће се расправљати?
- Само примењени део о развоју.
- Право знање и искуство, који су веома важни у раду са финансијским инструментима.
- Преглед проблема на којима треба радити
Дакле, желим да израчунам трговинску статистику и да то урадим на погодан начин.
Развијање статистичког сервиса корак по корак:
- Веза са Тинкофф Инвест АПИ-јем
- Цртање података из Тинкофф Инвест АПИ-ја у претраживачу
- Пријем брокерских извештаја и трансакција
- Прорачун и излаз информација од интереса
- Закључци и планови за будућност
Веза са Тинкофф Инвест АПИ-јем
Да бисте се повезали са АПИ-јем, можете узети било који сдк из документације хттпс://гитхуб.цом/Тинкофф/инвестАПИ#сдк . Или нпм пакет ` тинкофф-сдк-грпц-јс` . Важно је да програмери ажурирају пакет на најновију верзију. Инсталирај
нпм и тинкофф-сдк-грпц-јс
Проверавам
цонст { цреатеСдк } = рекуире(‘тинкофф-сдк-грпц-јс’); // Токен који се може добити овако цонст ТОКЕН = ‘ИОУРАПИ’; // Назив апликације по којој се можете наћи у ТЦС евиденцијама. цонст аппНаме = ‘тцсстат’; цонст сдк = цреатеСдк(ТОКЕН, име апликације); (асинц () => { цонсоле.лог(аваит сдк.усерс.гетАццоунтс()); })();
Резултат: листа ваших налога ће бити приказана на конзоли. На пример, хајде да анализирамо нијансе:
- На листи рачуна налази се „Инвестициона банка“ са којом не можете радити користећи АПИ
- Имајте на уму да поља долазе у цамелЦасе-у, док су у документацији ова поља приказана у ундер_сцоре.
- Тако ће бити свуда, тако да не можете само узети и копирати поље из документације.
Корисно:
- Овај код можете пронаћи у грани пројекта
хттпс://гитхуб.цом/пскуцхеров/тцсстат/трее/степ1 хттпс://гитхуб.цом/пскуцхеров/тцсстат/цомпаре/степ1
Цртање података из Тинкофф Инвест АПИ-ја у претраживачу
Узео сам нект.јс и соцкет.ио. Ово није јака препорука, бирајте по свом нахођењу.
нпк цреате-нект-апп@латест нпм и соцкет.ио соцкет.ио-цлиент
Одмах прелазимо на корак пријатељства нект+соцкет+инвестапи и погледајте одељак Корисно овог корака за све детаље. Описаћу детаље:
- На страни нодејс (сервер) налази се датотека пагес/апи/инвестапи.јс. Овде креирамо соцкет.ио сервер и повезујемо се на инвестапи.
- На страни претраживача (клијента) повезујемо се са сервером преко утичнице и тражимо податке о рачуну од брокера.
- Добијамо податке од брокера на серверу, а затим их шаљемо клијенту. Када се добију на клијенту, приказују се у претраживачу.
Резултат: у конзоли претраживача можемо видети информације о налозима. То јест, у последњем кораку смо видели информације о налозима у конзоли сервера (нодејс), у тренутном кораку смо пренели ове информације клијенту (претраживачу).
Сада направимо тако да можете да изаберете налог из претраживача, а ако нема токена, онда се грешка шаље на конзолу. Рад је једноставан и ништа ново, па дајем само линкове до урезивања
- хттпс://гитхуб.цом/пскуцхеров/тцсстат/цоммит/7е1ац57061е5е971588479015б06д8814д6609а9
- хттпс://гитхуб.цом/пскуцхеров/тцсстат/цоммит/б28ац973а57494ф5232589б4цб6б9фб13б8аф759
Корисно:
- Овде је детаљно описано како да стекнете пријатеље и утичницу .
- Шифра пријатељства нект+соцкет+инвестапи:
хттпс: //гитхуб.цом/пскуцхеров/тцсстат/цоммит/а443а4ац1бб4ф0аа898ф638128755фе7391ее381 Коме је горе наведено тешко, остајемо у овој фази и бавимо се кодом. Ако имате питања – питајте. хттпс://гитхуб.цом/пскуцхеров/тцсстат/трее/степ2 хттпс://гитхуб.цом/пскуцхеров/тцсстат/цомпаре/степ1…степ2
Пријем брокерских извештаја и трансакција
Постоје три начина за примање брокерских извештаја и трансакција
Од самог почетка важно је знати:
- Брокерски извештај се генерише у Т-3 режиму, тј. трговине се тамо приказују након њиховог стварног извршења.
- Сходно томе, ако затражите овај извештај за последња два дана, биће готов за три дана.
- Да бисмо добили трансакције за последње дане, користимо метод за примање трансакција, али имајте на уму да се њихов ИД и садржај могу променити након генерисања брокерског извештаја.
ГетБрокерРепорт
Да бисте добили брокерски извештај, потребно је да узмете ИД рачуна, датум почетка и датум завршетка извештаја, али не више од 31 дан. Шаљемо захтев за генерисање извештаја АПИ-ју у генерисању _брокер_репорт_рекуест , добијамо таскИд као одговор. Након тога, користећи овај таскИд, добијамо податке из гет _брокер_репорт_респонсе. [споилер титле=”Тако документација каже, у стварности постоје нијансе. Пазите руке:”]
- Морате да сачувате ТаскИД заувек тачно за ове датуме.
- Пошто ако га изгубите, онда ће за тражене датуме извештај прво доћи као одговор на захтев за генерисање,
- А онда уопште неће доћи.
[/споилер] Хајде да почнемо да пишемо код
Метода за добијање датума, узимајући у обзир одузимање од текућег датума
цонст гетДатеСубДаи = (субДаи = 5, старт = труе) => { цонст дате = нев Дате(); дате.сетУТЦДате(дате.гетУТЦДате() – субДаи); иф (старт) { дате.сетУТЦХоурс(0, 0, 0, 0); } елсе { дате.сетУТЦХоурс(23, 59, 59, 999); } датум повратка; };
Захтев за генерисање извештаја
цонст брокерРепорт = аваит (сдк.оператионс.гетБрокерРепорт)({ генератеБрокерРепортРекуест: { аццоунтИд, фром, то, }, });
резултат:
- Као резултат првог извршавања команде, добијамо таскИд.
- Извештај почиње да се генерише на страни брокера. Када је спреман није познато, чекамо и периодично повлачимо таскИд у ишчекивању извештаја.
- Зашто? Јер ако извештај није спреман, исписује грешку. Ако извештај није спреман на страни брокера, онда је ово грешка у вашем коду. Обрадите: 30058|ИНВАЛИД_АРГУМЕНТ|задатак још није завршен, покушајте поново касније
Код за чекање и пријем извештаја изгледа отприлике овако.
цонст тимер = асинц тиме => { ретурн нев Промисе(ресолве => сетТимеоут(ресолве, тиме)); } цонст гетБрокерРеспонсеБиТаскИд = асинц (таскИд, страница = 0) => { три { ретурн аваит (сдк.оператионс.гетБрокерРепорт)({ гетБрокерРепортРекуест: { таскИд, паге, }, }); } цатцх (е) { цонсоле.лог(‘ваит’, е); чекати тајмер(10000); ретурн аваит гетБрокерРеспонсеБиТаскИд(таскИд, паге); } };
Онда се дешава иста магија. Заустављамо нашу скрипту, покрећемо је поново, немамо таскИд. Извршавамо код са захтевом таскИд, али више не добијамо таскИд, већ одмах извештај. Магиц! И све би било у реду да је увек овако. Али за месец дана неће бити никаквих података. Корисно :
хттпс://гитхуб.цом/пскуцхеров/тцсстат/трее/степ3.1 хттпс://гитхуб.цом/пскуцхеров/тцсстат/цомпаре/степ3.1
- Ако неко наиђе на ово, добродошли у тему . Након што поправе ову магију, она ће изгубити снагу и биће некако другачија. Али у овом тренутку (21.03.2023.) то функционише баш тако.
ГетДивидендсФореигнИссуер
Неко би могао помислити да је метод сличан претходном и да можете користити један метод у коме мењате само назив операција. Али нису погодили! Тамо је именовање веома различито и у методама и у враћеним информацијама. А број страница почиње од 0, па од 1. Да се не бисте забунили у свему овоме, лакше је написати две различите методе. Што је чудно, јер логика рада је иста. Дуго сам пљунуо када сам покушао да направим једну методу и било је мање кода. Овде неће бити примера.
ГетОператионсБиЦурсор
Мој омиљени од три. Иако не најтачнији, али најадекватнији. Захтевамо од почетка креирања налога до максималног могућег датума (затварање налога или тренутног). Добијамо одговор, узимамо курсор и поново тражимо све док постоје подаци. И код је сажетији него у горњим примерима.
цонст тимер = асинц тиме => { ретурн нев Промисе(ресолве => сетТимеоут(ресолве, тиме)); } цонст гетОператионсБиЦурсор = асинц (сдк, аццоунтИд, фром, то, цурсор = ”) => { три { цонст рекДата = { аццоунтИд, фром, то, лимит: 1000, стате: сдк.ОператионСтате.ОПЕРАТИОН_СТАТЕ_ЕКСЕЦУТЕД, витхоутЦоммиссионс: фалсе, безтрговина: фалсе, витхоутОвернигхтс: фалсе, курсор, }; ретурн аваит сдк.оператионс.гетОператионсБиЦурсор(рекДата); } цатцх (е) { тајмер чекања (60000); ретурн аваит гетОператионсБиЦурсор(сдк, аццоунтИд, фром, то, цурсор = ”); } };
Нацрт за покретање је овде: хттпс: //гитхуб.цом/пскуцхеров/тцсстат/трее/степ3.3 хттпс: //гитхуб.цом/пскуцхеров/тцсстат/цомпаре/степ3.3 Сада смо спремни да додамо операције пријема у наша апликација. Ако се уради исправно, онда морате да добијете брокерске извештаје за целокупно постојање налога. А за податке који недостају, те исте Т-3, поново учитајте из операција. Али ово се може одвојити у посебан чланак. Од главних нијанси са којима ћете се сусрести је лепљење операција и брокерски извештај.
- Ако сте данас добили брокерски извештај и трансакције за тражене датуме, све то ставите у базу података, онда нема проблема.
- Сутра ћете имати проблема када добијете следећи део података из извештаја и операција и одлучите да их синхронизујете са постојећом базом података.
- Много нијанси о неусклађеним или промјени ИД-а након обраде
- Онда за ОТЦ тржиште, ИД-ови се уопште не поклапају.
- Као и нијансе синхронизационих инструмената, који се опет не поклапају, због посебности АПИ-ја. Али то је друга прича.
Хајде да додамо добијање информација о операцијама нашој апликацији. Главно питање ће бити где ће се подаци обрађивати и чувати.
- Ако то урадите за себе, потрошићете исте податке са различитих уређаја. Затим морате обрадити и чувати податке на серверу.
- Ако имате много различитих података које троши много различитих корисника, онда морате да одлучите шта је важније: брзина корисника или уштеда гвожђа на вашој страни. Ко може да приушти бесконачну количину хардвера, броји све на свом серверу и чини га супер брзим за кориснике, штедећи корисничке ресурсе, попут батерије и саобраћаја, што је веома важно на телефонима.
Заузврат, бројање у претраживачу у принципу није најоптималније решење. Дакле, оно што није скупо сматрамо на нашем серверу. Остало препуштамо клијенту. Заиста желим да узмем и израчунам провизију на серверу. Али овде долази до нијансе која се зове „интерактивност“. Рецимо да имате хиљаде операција и потребно вам је пет минута да их примите. Шта ће корисник имати у овом тренутку? Спиннер? Напредак? Инфа о томе колико је постављено? Идеално је користити „активно чекање“ када корисник у процесу већ може нешто да види. Ево резултата:
- Страница се учитава
- Све фактуре су тражене
- Након тога се траже све трансакције са провизијама за извршене трансакције за све рачуне. Како се подаци примају, они се приказују у претраживачу.
Да не бисмо сваки пут филтрирали податке у догађајима, повлачимо сопствени догађај за сваки налог. Овако:
соцкет.емит(‘сдк:гетОператионсЦоммиссионРесулт_’ + аццоунтИд, { итемс: дата?.итемс, инПрогресс: Боолеан(нектЦурсор), });
Нацрт за покретање је овде: хттпс: //гитхуб.цом/пскуцхеров/тцсстат/трее/степ3 хттпс ://гитхуб.цом/пскуцхеров/тцсстат/цомпаре/степ2…степ3 Идемо даље. Дивно је што сте прочитали овај ред!
Прорачун и излаз информација од интереса
Зависи коме су потребне информације. Стога вам одмах кажем главне нијансе са којима ћете се сусрести.
Рад са ценама
Сви који се баве финансијама знају да трансакције новца треба обављати само целим бројевима. Због нетачности вредности после децималног зареза и кумулативне грешке са великим бројем операција. Због тога су све цене представљене у следећем формату МонеиВалуе
поље | тип | Опис |
---|---|---|
валута | низ | Низ ИСО кода валуте |
јединице | инт64 | Целобројни део збира, може бити негативан број |
нано | инт32 | Разломак износа, може бити негативан број |
Обрађујемо их посебно, а затим их доводимо до вредности цене:
цитат.јединице + цитат.нано / 1е9
Трошкови фјучерс уговора
Цена фјучерса је представљена у поенима, када имате валутну будућност, морате знати курс. И наравно цена у поенима и корак цене. Када израчунате профит од трансакција, ово може пуцати, јер. ако укупан износ израчунате множењем цене са количином. Овде треба бити опрезан. За сада, видећемо како ће бити. Ово се односи на валутне фјучерсе, на другим местима је све у реду са овим.
ОТЦ тржиште
Ово тржиште има доста специфичности, па хајде да проучимо операције на њему одвојено.Када почнете да синхронизујете операције, испоставиће се да је потребно да доведете слику/тикер у исту форму како бисте правилно ускладили инструмент. Када почнете да синхронизујете ово са брокерским извештајем, испоставиће се да традеИД исте трансакције има слова на почетку у трансакцијама и да их нема у брокерском извештају. Према томе, не могу се поредити … ахм-хем … поређењем! Упарио сам време трговине, ознаку и подударање да је један традеИд садржан у другом. Добро, не знам. Ко наиђе на ово и коме је стало до тога, дођите у питање или започните нови.
Математичке операције над алатима
Немогуће је, без гледања, извршити математичке операције са читавом листом. Да не бисмо додали топло меко, увек проверавамо валуту и обрађујемо само ако смо сигурни да се валута поклапа, а бодови се конвертују у жељену валуту. Наоружани знањем о раду са банковним бројевима, израчунаћемо провизију потрошену на сваком од рачуна. Овако: хттпс: //гитхуб.цом/пскуцхеров/тцсстат/трее/степ4 хттпс ://гитхуб.цом/пскуцхеров/тцсстат/цомпаре/степ3…степ4
Микросервис је спреман!
хттпс: //гитхуб.цом/пскуцхеров/тцсстат Као домаћи задатак, можете проверити да ли сервис ради са спором везом, када су везе прекинуте, када је интернет прекинут, када су грешке или истекли лимити од стране брокера.
Закључци и планови за будућност
- Научио о основним операцијама и раду са Инвест АПИ-јем
- Утрошено време ~ 10 сати
- Ниво тежине ~ јуниор+ / низак средњи
Ако наставите да усавршавате микросервис, можда ћете завршити са нечим оваквим
хттпс://опекбот.инфо
Ово је мој развој, за оне који су превише лењи да сами разумеју, трче и рачунају. Планирам да тамо додам аналитику на захтев корисника. Ако вам се допао чланак, претплатите се на мој телеграм канал .
Полезная статья. Не могу представить, сколько усилий автора потребовалось, чтобы все описать. Благодарю.