Биз брокердик отчеттор менен иштөөнү жана комиссияларды эсептөөнү автоматташтыруу үчүн 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 ала аласыз . Же npm пакети ` tinkoff-sdk-grpc-js `. Пакеттин иштеп чыгуучулар тарабынан акыркы версияга жаңыртылганы маанилүү. Орнотуу

npm i 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 

Пайдалуу:

  • Кантип досторду кийинки жана розеткага бул жерде майда-чүйдөсүнө чейин баяндалган . 
  • Достук коду next+socket+investapi:

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. GetDividendsForeignIssuer
  3. GetOperationsByCursor

Башынан эле билүү маанилүү: 

  • Брокердик отчет Т-3 режиминде түзүлөт, б.а. соодалар иш жүзүндө аткарылгандан кийин ошол жерде көрсөтүлөт. 
  • Демек, акыркы эки күндө бул отчетту талап кылсаңыз, ал үч күндө даяр болот. 
  • Акыркы күндөрү бүтүмдөрдү түзүү үчүн биз операцияларды кабыл алуу ыкмасын колдонобуз, бирок алардын id жана мазмуну брокердик отчет түзүлгөндөн кийин өзгөрүшү мүмкүн экенин унутпаңыз.

GetBrokerReport

Брокердик отчетту алуу үчүн сиз эсептин идентификаторун, отчеттун башталган күнүн жана аяктоо датасын алышыңыз керек, бирок 31 күндөн ашык эмес. _broker_report_request генерациясында API’ге отчетту түзүү өтүнүчүн жөнөтөбүз , жооп катары taskId алыңыз. Андан кийин, бул taskId колдонуу менен, биз _broker_report_response алуудан маалыматтарды алабыз .

Демек, документацияда айтылгандай, чындыгында нюанстар бар. Колуңузга караңыз:

  • TaskID’ди дал ушул даталар үчүн түбөлүккө сакташыңыз керек. 
  • Эгер сиз аны жоготуп алсаңыз, анда суралган даталар үчүн отчет алгач муундун суроо-талабына жооп катары келет, 
  • Анан такыр келбейт.
Келиңиз, код жазууну баштайлы

Учурдагы күндөн кемитүүнү эске алуу менен датаны алуу ыкмасы

const getDateSubDay = (subDay = 5, башталышы = чын) => {     const дата = жаңы Дата();     date.setUTCDate(date.getUTCDate() – subDay);       if (start) {         date.setUTCHours(0, 0, 0, 0);     } else {         date.setUTCHours(23, 59, 59, 999);     }       кайтаруу датасы; };

Отчет түзүү өтүнүчү 

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

Натыйжа:

  • Буйруктун биринчи аткарылышынын натыйжасында биз taskId алабыз. 
  • Отчет брокер тарабынан түзүлө баштайт. Качан даяр экени белгисиз, биз күтөбүз жана мезгил-мезгили менен отчетту күтүү менен taskId тартып турабыз.
  • Неге? Анткени отчет даяр болбосо, ката кетирет. Эгерде отчет брокер тарабынан даяр эмес болсо, анда бул сиздин кодуңуздагы ката. Сураныч, иштетиңиз: 30058|INVALID_ARGUMENT|иш аягына чыга элек, кийинчерээк кайра аракет кылыңыз

Отчетту күтүү жана кабыл алуу коду ушул сыяктуу көрүнөт.

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

Анан ошол эле сыйкыр болот. Биз скриптибизди токтотуп, кайра баштайбыз, бизде taskId жок. Кодду taskId сурамы менен аткарабыз, бирок биз мындан ары taskId албайбыз, бирок ошол замат отчетту алабыз. Magic! Анан дайыма ушундай болсо баары жакшы болмок. Бирок бир айдан кийин такыр маалымат болбойт. Пайдалуу :

  • Бул жерде жана бул жерде бир аз теория баяндалган .
  • Кодексти бириктирип, долбоор ушундай болот.

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

  • Эгер кимдир бирөө бул нерсеге туш болсо, анда маселеге кош келиңиз . Алар бул сыйкырды оңдогондон кийин, ал күчүн жоготуп, кандайдыр бир башкача болот. Бирок азыркы учурда (03/21/2023) дал ушундай иштейт.

GetDividendsForeignIssuer

Кимдир бирөө бул ыкма мурункуга окшош деп ойлошу мүмкүн жана сиз бир гана ыкманы колдоно аласыз, анда сиз операциялардын атын гана өзгөртөсүз. Бирок алар ойлогон эмес!  Ал жердеги ат коюу ыкмалары боюнча да, кайтарылган маалыматтарда да абдан айырмаланат. Ал эми барактардын саны 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) {         wait timer(60000);         return await getOperationsByCursor(sdk, accountId, from, to, cursor = ”);     } };

Иштете турган долбоор бул жерде: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Эми биз кабыл алуу операцияларын кошууга даярбыз биздин колдонмо. Эгер туура аткарылса, анда сиз эсептин бар болушу үчүн брокердик отчетторду алышыңыз керек. Ал эми жетишпеген маалыматтар үчүн, ошол эле Т-3, операциялардан кайра жүктөө. Бирок бул өзүнчө макалага бөлүүгө болот. Сизге жолуга турган негизги нюанстардын бири – операцияларды жана брокердик отчетту клей.

  •  Эгер бүгүн сиз талап кылынган даталар боюнча брокердик отчетту жана бүтүмдөрдү алган болсоңуз, анын баарын маалымат базасына коюңуз, анда эч кандай көйгөйлөр жок. 
  • Эртең сиз отчеттон жана операциялардан маалыматтардын кийинки бөлүгүн алганыңызда жана аларды учурдагы маалымат базасы менен синхрондоштурууну чечкенде көйгөйлөргө туш болосуз. 
  • Иштеп чыккандан кийин дал келбеген же id өзгөртүү жөнүндө көптөгөн нюанстар
  • Андан кийин OTC рыногу үчүн id такыр дал келбейт.
  •  Ошондой эле синхрондоштуруучу аспаптардын нюанстары, алар API өзгөчөлүктөрүнөн улам дал келбейт. Бирок бул башка окуя.

Келгиле, биздин тиркемеге операциялар жөнүндө маалыматты кошолу. Негизги суроо маалыматтар кайда иштетилет жана сакталат.

  •  Эгер сиз муну өзүңүз үчүн кылсаңыз, ар кандай түзмөктөрдөн бир эле маалыматты керектейсиз. Андан кийин серверде маалыматтарды иштеп чыгуу жана сактоо керек.
  • Эгерде сизде көптөгөн ар кандай колдонуучулар керектеген ар кандай маалыматтар болсо, анда эмне маанилүүрөөк экенин чечишиңиз керек: колдонуучулардын ылдамдыгы же сиз тарапта темирди үнөмдөө. Кимде ким чексиз сандагы жабдыктарды сатып алса, анын сервериндеги бардыгын эсептейт жана аны колдонуучулар үчүн супер тез кылат, телефондор үчүн абдан маанилүү болгон батарея жана трафик сыяктуу колдонуучунун ресурстарын үнөмдөйт.

Өз кезегинде, браузерде эсептөө принцип боюнча эң оптималдуу чечим эмес. Ошондуктан, эмне кымбат эмес, биз аны серверибизде карайбыз. Калганын кардарга калтырабыз. Мен чындап эле сервердеги комиссияны алып, эсептегим келет. Бирок бул жерде “интерактивдүүлүк” деп аталган нюанс келет. Айталы, сизде миңдеген операциялар бар жана аларды кабыл алууга беш мүнөт кетет. Бул учурда колдонуучу эмнеге ээ болот? Spinner? Прогресс? Инфа канча жүктөлгөн? Процесстеги колдонуучу бир нерсени көрө алган учурда “активдүү күтүүнү” колдонуу идеалдуу. Бул жерде жыйынтык:Биз брокердик отчеттор менен иштөөнү жана комиссияларды эсептөөнү автоматташтыруу үчүн Tinkoff Invest API аркылуу микросервисти иштеп чыгуудабыз.

  • Барак жүктөө
  • Бардык эсеп-фактуралар суралат
  • Андан кийин, аткарылган транзакциялар үчүн комиссиялар менен бардык операциялар бардык эсептер боюнча суралат. Маалыматтар алынганда, ал браузерде көрсөтүлөт.

Окуялардагы маалыматтарды ар бир жолу чыпкалабоо үчүн, биз ар бир каттоо эсеби үчүн өзүбүздүн окуябызды тартабыз. Бул сыяктуу:

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

Ишке киргизиле турган долбоор бул жерде: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Улантуу. Бул сапты окуганыңыз абдан жакшы! 

Кызыккан маалыматты эсептөө жана чыгаруу

Кимге кандай маалымат керек экенине жараша болот. Ошондуктан, мен дароо сизге жолуга турган негизги нюанстарды айтып берем.

Баалар менен иштөө 

Каржы менен иштеген ар бир адам акча операцияларын бүтүн сандар менен гана жүргүзүү керектигин билет. Ондук чекиттен кийинки маанилердин так эместигинен жана көп сандагы операциялардын топтолгон катасынан. Ошондуктан бардык баалар төмөнкү MoneyValue форматында берилгенБиз брокердик отчеттор менен иштөөнү жана комиссияларды эсептөөнү автоматташтыруу үчүн Tinkoff Invest API аркылуу микросервисти иштеп чыгуудабыз.

талаатүрүDescription
валютасапСап ISO валюта коду
бирдиктерint64сумманын бүтүн бөлүгү, терс сан болушу мүмкүн
наноint32сумманын бөлчөк бөлүгү, терс сан болушу мүмкүн

Биз аларды өз-өзүнчө иштетип, андан кийин баанын маанисине келтиребиз:

цитата.бирдиктер + цитата.нано / 1e9

Фьючерстик келишимдердин наркы

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

OTC базары

Бул рыноктун көптөгөн өзгөчөлүктөрү бар, ошондуктан ал боюнча операцияларды өзүнчө изилдеп көрөлү.Операцияларды синхрондоштурууну баштаганда, инструментке туура дал келүү үчүн figi/tickerди бир формага алып келүү керек экени белгилүү болот. Сиз муну брокердик отчет менен синхрондоштурууну баштаганда, ошол эле транзакциянын соода идентификаторунда бүтүмдөрдүн башында тамгалар бар жана алар брокердик отчетто жок экени белгилүү болот. Ошондуктан, аларды салыштырууга болбойт … ахем-ахем … салыштыруу менен! Мен соода убактысын, тикерди жана бир соода идентификаторунун башкасында камтылганына дал келдим. Туура, мен билбейм. Ким бул нерсеге туш болсо жана ага кызыкдар болсо, маселеге келиңиз же жаңысын баштаңыз.Биз брокердик отчеттор менен иштөөнү жана комиссияларды эсептөөнү автоматташтыруу үчүн 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