Біз брокерлік есептерді және комиссияны есептеуді автоматтандыру үшін Tinkoff Invest API арқылы микросервис әзірлеп жатырмыз.

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

Tinkoff Investments үшін статистикалық қызметтің дамуының шабыттандырушылары :

Не талқыланады?

  • Даму туралы қолданбалы бөлігі ғана.
  • Қаржы құралдарымен жұмыс істеуде өте маңызды болып табылатын нақты білім мен тәжірибе.
  • Жұмыс істеуге болатын мәселелерге шолу

Сонымен, мен сауда статистикасын есептеп, оны ыңғайлы түрде жасағым келеді. 

Статистика қызметін кезең-кезеңімен әзірлеу: 

  1. Tinkoff Invest API қосылымы
  2. Браузердегі Tinkoff Invest API деректерін салу
  3. Брокерлік есептерді және транзакцияларды қабылдау
  4. Қызықтыратын ақпаратты есептеу және шығару
  5. Қорытындылар мен болашаққа жоспарлар

Tinkoff Invest API қосылымы

API-ге қосылу үшін https://github.com/Tinkoff/investAPI#sdk құжаттамасынан кез келген SDK алуға болады . Немесе ` tinkoff-sdk-grpc-js ` npm бумасы. Пакетті әзірлеушілер соңғы нұсқаға жаңартуы маңызды. Орнату

npm және tinkoff-sdk-grpc-js

Тексеру

const { createSdk } = талап ету(‘tinkoff-sdk-grpc-js’);   // Мынадай алуға болатын таңбалауыш   const TOKEN = ‘YOURAPI’;   // Сізді TCS журналдарында табуға болатын қолданбаның аты. const appName = ‘tcsstat’;   const sdk = createSdk(TOKEN, appName); (async () => {     console.log(wait sdk.users.getAccounts()); })();

Нәтиже: есептік жазбалар тізімі консольде көрсетіледі. Мысалы, нюанстарды талдап көрейік:Біз брокерлік есептерді және комиссияны есептеуді автоматтандыру үшін Tinkoff Invest API арқылы микросервис әзірлеп жатырмыз.

  • Шоттар тізімінде API арқылы жұмыс істей алмайтын «Инвестициялық банк» бар
  • Өрістердің camelCase ішінде келетінін ескеріңіз, ал құжаттамада бұл өрістер under_score түрінде берілген. 
  • Бұл барлық жерде осылай болады, сондықтан сіз құжаттамадан өрісті алып, көшіре алмайсыз.

Пайдалы:

  • Бұл кодты жоба бөлімінде таба аласыз

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

Браузердегі Tinkoff Invest API деректерін салу

Мен next.js және socket.io алдым. Бұл күшті ұсыныс емес, өз қалауыңыз бойынша таңдаңыз. 

npx create-next-app@latest npm және socket.io socket.io-client

Біз бірден келесі+розетка+инвестапи достық қадамына көшеміз және барлық мәліметтерді осы қадамның  Пайдалы бөлімінен қараңыз. Мен егжей-тегжейлерді сипаттаймын: 

  • nodejs (сервер) жағында pages/api/investapi.js файлы бар. Бұл жерде біз socket.io серверін жасап, investapi-ге қосыламыз.
  • Браузер (клиент) жағында біз серверге розетка арқылы қосылып, брокерден тіркелгі деректерін сұраймыз. 
  • Біз сервердегі брокерден деректерді аламыз, содан кейін оны клиентке жібереміз. Олар клиентке қабылданған кезде браузерде көрсетіледі. 

Нәтиже:  браузер консолінде тіркелгілер туралы ақпаратты көре аламыз. Яғни, соңғы қадамда біз сервер консоліндегі (nodejs) тіркелгілер туралы ақпаратты көрдік, ағымдағы қадамда біз бұл ақпаратты клиентке (браузер) жібердік.

Біз брокерлік есептерді және комиссияны есептеуді автоматтандыру үшін Tinkoff Invest API арқылы микросервис әзірлеп жатырмыз.

Енді браузерден тіркелгіні таңдай алатындай етіп жасайық, ал егер таңбалауыш болмаса, консольге қате жіберіледі. Жұмыс қарапайым және жаңа ештеңе жоқ, сондықтан мен тек міндеттемелерге сілтемелер беремін

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

Пайдалы:

https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Жоғарыда айтылғандар кімге қиын болса, біз осы кезеңде қалып, кодпен айналысамыз. Сұрақтарыңыз болса – сұраңыз. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2

Брокерлік есептерді және транзакцияларды қабылдау

Брокерлік есептерді және транзакцияларды алудың үш әдісі бар

  1. GetBrokerReport
  2. Дивидендтерді алу шетелдік эмитент
  3. GetOperationsByCursor

Ең басынан бастап білу маңызды: 

  • Брокерлік есеп Т-3 режимінде жасалады, яғни. сауда-саттық олар нақты орындалған соң көрсетіледі. 
  • Тиісінше, соңғы екі күнде бұл есепті сұрасаңыз, ол үш күнде дайын болады. 
  • Соңғы күндерге мәмілелер жасау үшін біз операцияларды қабылдау әдісін қолданамыз, бірақ олардың идентификаторы мен мазмұны брокерлік есеп қалыптастырылғаннан кейін өзгеруі мүмкін екенін есте сақтаңыз.

GetBrokerReport

Брокерлік есепті алу үшін есептік жазбаның идентификаторын, есептің басталу күнін және аяқталу күнін алу керек, бірақ 31 күннен аспауы керек. Біз _broker_report_request генерациясында API-ге есепті жасау үшін сұрау жібереміз , жауап ретінде тапсырма идентификаторын аламыз. Осыдан кейін, осы тапсырма идентификаторын пайдаланып, біз _broker_report_response алудан деректерді аламыз .

Сонымен құжаттамада айтылғандай, шын мәнінде нюанстар бар. Қолдарыңызды бақылаңыз:

  • Тапсырма идентификаторын дәл осы күндер үшін мәңгі сақтауыңыз керек. 
  • Егер сіз оны жоғалтсаңыз, сұралған күндер үшін есеп алдымен генерациялау сұрауына жауап ретінде келеді, 
  • Содан кейін ол мүлдем келмейді.
Код жазуды бастайық

Ағымдағы күннен азайтуды ескере отырып, күнді алу әдісі

const getDateSubDay = (қосалқы күн = 5, бастау = шын) => {     const date = new Date();     date.setUTCDate(date.getUTCDate() – қосалқы күн);       if (start) {         date.setUTCHours(0, 0, 0, 0);     } else {         date.setUTCHours(23, 59, 59, 999);     }       қайтару күні; };

Есепті құру сұрауы 

const brokerReport = күту (sdk.operations.getBrokerReport)({         generBrokerReportRequest: {             accountId,             бастап,             бастап,         }, });

Нәтиже:

  • Команданың бірінші орындалу нәтижесінде біз taskId аламыз. 
  • Есеп брокер тарапынан жасала бастайды. Дайын болған кезде белгісіз, біз есепті күтіп, тапсырма идентификаторын мезгіл-мезгіл шығарып отырамыз.
  • Неліктен? Өйткені есеп дайын болмаса, ол қате жібереді. Егер есеп брокер тарапынан дайын болмаса, бұл сіздің кодыңыздағы қате. Өңдеңіз: 30058|INVALID_ARGUMENT|тапсырма әлі орындалмады, әрекетті кейінірек қайталаңыз

Есепті күту және алу коды келесідей болады.

const таймер = асинхронды уақыт => {     жаңа уәдені қайтару(шешу => setTimeout(шешу, уақыт)); }   const getBrokerResponseByTaskId = синхрондау (taskId, бет = 0) => {     try {         return await (sdk.operations.getBrokerReport)({             getBrokerReportRequest: {                 taskId,                 page,             },         });     } catch (e) {         console.log(‘күту’, e);         күту таймері (10000);         қайтару күтеді getBrokerResponseByTaskId(taskId, бет);     } };

Содан кейін дәл осындай сиқыр пайда болады. Біз сценарийімізді тоқтатамыз, оны қайтадан бастаймыз, бізде тапсырма идентификаторы жоқ. Біз кодты taskId сұрауымен орындаймыз, бірақ біз енді taskId емес, бірден есепті аламыз. Сиқырлы! Әрқашан осылай болса бәрі жақсы болар еді. Бірақ бір айдан кейін деректер мүлдем болмайды. Пайдалы :

  • Мұнда және осы жерде біраз теория келтірілген .
  • Кодты біріктіріп, жоба келесідей болады.

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

  • Егер біреу бұған тап болса, мәселеге қош келдіңіз . Олар бұл сиқырды жөндегеннен кейін ол өз күшін жоғалтады және қандай да бір түрде басқаша болады. Бірақ қазіргі уақытта (21.03.2023) ол дәл осылай жұмыс істейді.

Дивидендтерді алу шетелдік эмитент

Біреу әдіс алдыңғыға ұқсас деп ойлауы мүмкін және сіз тек операциялардың атын өзгертетін жалғыз әдісті пайдалана аласыз. Бірақ олар ойламады!  Ондағы атау әдістерде де, қайтарылған ақпаратта да өте әртүрлі. Ал беттер саны 0-ден, содан кейін 1-ден басталады. Осының бәрінде шатастырмау үшін екі түрлі әдісті жазу оңайырақ. Бұл біртүрлі, өйткені жұмыс логикасы бірдей. Мен бір әдісті жасауға тырысқанда ұзақ уақыт түкірдім және код аз болды. Мұнда мысалдар болмайды.

GetOperationsByCursor

Менің үшеуінің сүйіктісі. Ең дәл емес, бірақ ең барабар. Біз тіркелгіні жасаудың басынан бастап максималды мүмкін күнге дейін (шотты жабу немесе ағымдағы) сұрау жасаймыз. Біз жауап аламыз, курсорды алып, деректер болғанша қайта сұраймыз.  Ал код жоғарыдағы мысалдарға қарағанда қысқарақ.

const таймер = асинхронды уақыт => {     жаңа уәдені қайтару(шешу => setTimeout(шешу, уақыт)); }   const getOperationsByCursor = синхронды (SDK, accountId, бастап, дейін, курсор = ”) => {     try {         const reqData = {             accountId,             бастап,             дейін,             шегі: 1000,             күй: sdk.OperationState.OPERATION_STATE_EXECUTED,             комиссиясыз, қате:             withoutTrades: false,             withoutOvernights: false,             курсор,         };           return await sdk.operations.getOperationsByCursor(reqData);     } catch (e) {         күту таймері (60000);         return await getOperationsByCursor(sdk, accountId, бастап, дейін, курсор = ”);     } };

Орындалатын жоба мына жерде: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Енді біз қабылдау операцияларын қосуға дайынбыз. біздің қосымшамыз. Егер дұрыс орындалса, онда сіз шоттың бар болуы үшін брокерлік есептерді алуыңыз керек. Ал жетіспейтін деректер үшін, сол T-3, операциялардан қайта жүктеңіз. Бірақ мұны бөлек мақалаға бөлуге болады. Сіз кездесетін негізгі нюанстардың бірі – операцияларды және брокерлік есептерді желімдеу.

  •  Егер бүгін сіз брокерлік есеп пен қажетті күндерге транзакцияларды алсаңыз, оның барлығын дерекқорға қойыңыз, онда ешқандай проблемалар жоқ. 
  • Есеп пен әрекеттерден деректердің келесі бөлігін алған кезде және оларды бар дерекқормен синхрондауды шешкен кезде ертең сізде проблемалар болады. 
  • Өңдеуден кейін сәйкес келмеу немесе өзгерту туралы көптеген нюанстар
  • Содан кейін биржадан тыс нарық үшін идентификаторлар мүлдем сәйкес келмейді.
  •  Сондай-ақ API ерекшеліктеріне байланысты қайта сәйкес келмейтін синхрондау құралдарының нюанстары. Бірақ бұл басқа әңгіме.

Қолданбамызға операциялар туралы ақпарат алуды қосамыз. Негізгі мәселе деректердің қай жерде өңделетіні және сақталатыны болады.

  •  Егер сіз мұны өзіңіз үшін жасасаңыз, әртүрлі құрылғылардан бірдей деректерді тұтынасыз. Содан кейін серверде деректерді өңдеу және сақтау керек.
  • Егер сізде көптеген әртүрлі пайдаланушылар тұтынатын әртүрлі деректер көп болса, онда сіз не маңыздырақ екенін шешуіңіз керек: пайдаланушылардың жылдамдығы немесе сіздің тарапыңыздағы темірді үнемдеу. Аппараттық құралдардың шексіз көлеміне кім қол жеткізе алады, ол өз серверіндегі барлығын есептейді және оны пайдаланушылар үшін өте жылдам етеді, телефондар үшін өте маңызды батарея мен трафик сияқты пайдаланушы ресурстарын үнемдейді.

Өз кезегінде, браузерде санау принцип бойынша ең оңтайлы шешім емес. Сондықтан, қымбат емес, біз оны серверде қарастырамыз. Қалғанын клиентке қалдырамыз. Мен сервердегі комиссияны алып, есептегім келеді. Бірақ мұнда «интерактивтілік» деп аталатын нюанс келеді. Сізде мыңдаған операциялар бар делік және оларды қабылдауға бес минут кетеді. Бұл уақытта пайдаланушыда не болады? Спиннер? Прогресс? Инфа қанша жүктеп салынғаны туралы? Процестегі пайдаланушы бірдеңені көріп тұрған кезде «белсенді күтуді» пайдалану өте қолайлы. Міне, нәтиже:Біз брокерлік есептерді және комиссияны есептеуді автоматтандыру үшін Tinkoff Invest API арқылы микросервис әзірлеп жатырмыз.

  • Бет жүктелуде
  • Барлық шот-фактуралар сұралады
  • Осыдан кейін барлық шоттар бойынша орындалған транзакциялар үшін комиссиялары бар барлық операциялар сұралады. Деректер қабылданған кезде ол браузерде көрсетіледі.

Оқиғалардағы деректерді әр уақытта сүзбеу үшін біз әрбір тіркелгі үшін өз оқиғамызды тартамыз. Бұл сияқты:

socket.emit(‘sdk:getOperationsCommissionResult_’ + accountId, {                 элементтер: data?.items,                 inProgress: логикалық (келесі курсор), });

Іске қосу жобасы мына жерде: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Жалғастыру. Бұл жолды оқығаныңыз өте жақсы! 

Қызықтыратын ақпаратты есептеу және шығару

Кімге қандай ақпарат керек екеніне байланысты. Сондықтан мен сізге бірден кездесетін негізгі нюанстарды айтамын.

Бағалармен жұмыс 

Қаржымен жұмыс істейтін әрбір адам ақша операцияларын тек бүтін сандармен орындау керектігін біледі. Ондық үтірден кейінгі мәндердің дәл болмауына және операциялардың үлкен санымен жинақталған қатеге байланысты. Сондықтан барлық бағалар келесі MoneyValue пішімінде ұсынылғанБіз брокерлік есептерді және комиссияны есептеуді автоматтандыру үшін Tinkoff Invest API арқылы микросервис әзірлеп жатырмыз.

өрістүріСипаттама
валютажолЖолдық ISO валюта коды
бірлікint64Қосындының бүтін бөлігі теріс сан болуы мүмкін
наноint32Соманың бөлшек бөлігі теріс сан болуы мүмкін

Біз оларды бөлек өңдейміз, содан кейін оларды баға мәніне келтіреміз:

дәйексөз.бірліктер + тырнақша.нано / 1e9

Фьючерстік келісімшарттардың құны

Фьючерстердің бағасы ұпаймен көрсетіледі, валюталық болашақ болған кезде сіз бағамды білуіңіз керек. Және, әрине, ұпайлардағы баға және баға қадамы. Сіз транзакциялардан пайданы есептегенде, бұл түсіруге болады, өйткені. егер сіз бағаны санға көбейту арқылы жалпы соманы есептесеңіз. Бұл жерде абай болу керек. Әзірге оның қалай болатынын көреміз. Бұл валюталық фьючерстерге қатысты, басқа жерлерде мұнымен бәрі жақсы.Біз брокерлік есептерді және комиссияны есептеуді автоматтандыру үшін Tinkoff Invest API арқылы микросервис әзірлеп жатырмыз.Біз брокерлік есептерді және комиссияны есептеуді автоматтандыру үшін Tinkoff Invest API арқылы микросервис әзірлеп жатырмыз.

ОТС нарығы

Бұл нарықтың көптеген ерекшеліктері бар, сондықтан ол бойынша операцияларды бөлек зерттейік.Амалдарды синхрондауды бастағанда, құралды дұрыс сәйкестендіру үшін фиги/тикерді бір пішінге келтіру керек екені белгілі болады. Мұны брокерлік есеппен синхрондауды бастағанда, сол транзакцияның сауда идентификаторының транзакциялардың басында әріптері бар және олар брокерлік есепте жоқ екені белгілі болады. Сондықтан оларды салыстыруға болмайды … ахем-ахем … салыстыру арқылы! Мен сауда уақытын, тикерді және бір сауда идентификаторының екіншісінде бар екенін сәйкестендірдім. Дұрыс, білмеймін. Кімде-кім бұл мәселеге тап болса және оны қызықтыратын болса, мәселеге келіңіз немесе жаңасын бастаңыз.Біз брокерлік есептерді және комиссияны есептеуді автоматтандыру үшін Tinkoff Invest API арқылы микросервис әзірлеп жатырмыз.

Құралдардағы математикалық амалдар

Бүкіл тізіммен математикалық операцияларды іздемей орындау мүмкін емес. Жұмсаққа жылу қоспау үшін біз әрқашан валютаны тексереміз және валютаның сәйкес келетініне және ұпайлар қажетті валютаға айырбасталатынына сенімді болған жағдайда ғана өңдейміз. Банк нөмірлерімен жұмыс істеу туралы біліммен қаруланған біз әрбір шотқа жұмсалған комиссияны есептейміз. Мынадай: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4Біз брокерлік есептерді және комиссияны есептеуді автоматтандыру үшін Tinkoff Invest API арқылы микросервис әзірлеп жатырмыз.   

Микросервис дайын!

https://github.com/pskucherov/tcsstat Үй тапсырмасы ретінде қызметтің баяу қосылыммен жұмыс істейтінін, қосылымдар үзілгенін, Интернет ажыратылғанын, қателер немесе брокер тарапынан шектеулердің мерзімі өткенін тексеруге болады. 

Қорытындылар мен болашаққа жоспарлар

  • Негізгі операциялар және Invest API-мен жұмыс істеу туралы білді
  • Уақыт ~ 10 сағат
  • Қиындық деңгейі ~ кіші+ / төменгі орта 

Микросервисті жетілдіруді жалғастырсаңыз, сізде осындай нәрсе болуы мүмкін

https://opexbot.info

  Түсінуге, жүгіруге, өз бетімен санауға еріншектер үшін бұл менің дамуым. Мен пайдаланушылардың сұрауы бойынша аналитиканы қосуды жоспарлап отырмын. Егер сізге мақала ұнаса, менің телеграм каналыма жазылыңыз . Біз брокерлік есептерді және комиссияны есептеуді автоматтандыру үшін Tinkoff Invest API арқылы микросервис әзірлеп жатырмыз.

Pavel
Rate author
Add a comment

  1. Isakiiev

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

    Reply