Rydym yn datblygu microwasanaeth gan ddefnyddio API Tinkoff Invest i awtomeiddio gweithio gydag adroddiadau broceriaeth a chyfrifo comisiynau.

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

Yr ysgogwyr y tu ôl i ddatblygiad y gwasanaeth ystadegau ar gyfer Tinkoff Investments oedd:

Beth fydd yn cael ei drafod?

  • Dim ond y rhan gymhwysol am ddatblygiad.
  • Gwybodaeth a phrofiad go iawn, sy’n bwysig iawn wrth weithio gydag offerynnau ariannol.
  • Trosolwg o faterion i weithio arnynt

Felly, rwyf am gyfrifo ystadegau masnach a’i wneud mewn ffordd gyfleus. 

Datblygu gwasanaeth ystadegau gam wrth gam: 

  1. Cysylltiad i Tinkoff Invest API
  2. Tynnu data o Tinkoff Invest API mewn porwr
  3. Derbyn adroddiadau broceriaeth a thrafodion
  4. Cyfrifo ac allbwn gwybodaeth o ddiddordeb
  5. Casgliadau a chynlluniau ar gyfer y dyfodol

Cysylltiad i Tinkoff Invest API

I gysylltu â’r API, gallwch chi gymryd unrhyw sdk o’r ddogfennaeth https://github.com/Tinkoff/investAPI#sdk . Neu becyn npm ` tinkoff-sdk-grpc-js `. Mae’n bwysig bod y pecyn yn cael ei ddiweddaru i’r fersiwn diweddaraf gan y datblygwyr. Gosod

npm i tinkoff-sdk-grpc-js

Gwirio

const { createSdk } = angen (‘tinkoff-sdk-grpc-js’);   // Token that can be obtained like this  const TOKEN = ‘YOURAPI’;   // Enw’r cais y gallwch chi ddod o hyd iddo yn y logiau TCS. const appName = ‘tcsstat’;   const sdk = createSdk(TOKEN, appName); (async () => {     console.log(aros sdk.users.getAccounts()); })();

Canlyniad: bydd rhestr o’ch cyfrifon yn cael ei harddangos yn y consol. Er enghraifft, gadewch i ni ddadansoddi’r naws:Rydym yn datblygu microwasanaeth gan ddefnyddio API Tinkoff Invest i awtomeiddio gweithio gydag adroddiadau broceriaeth a chyfrifo comisiynau.

  • Yn y rhestr o gyfrifon mae “banc buddsoddi”, na allwch chi weithio gydag ef gan ddefnyddio’r API
  • Sylwch fod y meysydd yn dod mewn camelCase, tra yn y ddogfennaeth cyflwynir y meysydd hyn yn under_score. 
  • Bydd fel hyn ym mhobman, felly ni allwch gymryd a chopïo maes o’r ddogfennaeth yn unig.

Defnyddiol:

  • Gallwch ddod o hyd i’r cod hwn yng nghangen y prosiect

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

Tynnu data o Tinkoff Invest API mewn porwr

Cymerais next.js a socket.io. Nid yw hwn yn argymhelliad cryf, dewiswch yn ôl eich disgresiwn. 

npx create-next-app@latest npm i socket.io socket.io-client

Rydym yn symud ymlaen ar unwaith i’r cam cyfeillgarwch nesaf + soced + investtapi, a gweler adran Defnyddiol y cam hwn am yr holl fanylion.  Disgrifiaf y manylion: 

  • Ar ochr nodejs (gweinydd), mae ffeil pages/api/investapi.js. Dyma lle rydyn ni’n creu’r gweinydd socket.io ac yn cysylltu ag investapi.
  • Ar ochr y porwr (cleient), rydym yn cysylltu â’r gweinydd trwy soced ac yn gofyn am ddata cyfrif gan y brocer. 
  • Rydym yn derbyn data gan y brocer ar y gweinydd, yna’n ei anfon at y cleient. Pan gânt eu derbyn ar y cleient, cânt eu harddangos yn y porwr. 

Canlyniad:  yn y consol porwr gallwn weld gwybodaeth am gyfrifon. Hynny yw, yn y cam olaf, gwelsom wybodaeth am gyfrifon yn y consol gweinydd (nodejs), yn y cam presennol, fe wnaethom drosglwyddo’r wybodaeth hon i’r cleient (porwr).

Rydym yn datblygu microwasanaeth gan ddefnyddio API Tinkoff Invest i awtomeiddio gweithio gydag adroddiadau broceriaeth a chyfrifo comisiynau.

Nawr, gadewch i ni ei wneud fel y gallwch ddewis cyfrif o’r porwr, ac os nad oes tocyn, yna anfonir gwall i’r consol. Mae’r gwaith yn syml a dim byd newydd, felly dim ond dolenni i ymrwymiadau rwy’n eu rhoi

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

Defnyddiol:

  • Disgrifir sut i wneud ffrindiau nesaf a soced yn fanwl yma
  • Cod cyfeillgarwch nesaf+soced+buddsoddi:

https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 I bwy mae’r uchod yn anodd, yna rydym yn aros ar hyn o bryd ac yn delio â’r cod. Os oes gennych gwestiynau – gofynnwch. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2

Derbyn adroddiadau broceriaeth a thrafodion

Mae tri dull o dderbyn adroddiadau broceriaeth a thrafodion

  1. GetBrokerReport
  2. GetDividendsForeignIssuer
  3. GetOperationsByCursor

O’r cychwyn cyntaf mae’n bwysig gwybod: 

  • Cynhyrchir yr adroddiad broceriaeth yn y modd T-3, h.y. crefftau yn cael eu harddangos yno ar ôl eu gweithredu gwirioneddol. 
  • Yn unol â hynny, os byddwch yn gofyn am yr adroddiad hwn am y ddau ddiwrnod diwethaf, bydd yn barod mewn tri diwrnod. 
  • I gael trafodion am y dyddiau diwethaf, rydym yn defnyddio’r dull ar gyfer derbyn trafodion, ond cofiwch y gall eu ID a’u cynnwys newid ar ôl i’r adroddiad broceriaeth gael ei gynhyrchu.

GetBrokerReport

I gael adroddiad broceriaeth, mae angen i chi gymryd id y cyfrif, dyddiad cychwyn a dyddiad gorffen yr adroddiad, ond dim mwy na 31 diwrnod. Rydym yn anfon cais i gynhyrchu adroddiad i’r API yn cynhyrchu _broker_report_request , cael taskId mewn ymateb. Ar ôl hynny, gan ddefnyddio’r taskId hwn, rydym yn cael data o get _broker_report_response.

Felly mae'r ddogfennaeth yn dweud, mewn gwirionedd mae yna arlliwiau. Gwyliwch eich dwylo:

  • Mae angen i chi gadw’r TaskID am byth yn union ar gyfer y dyddiadau hyn. 
  • Oherwydd os byddwch yn ei golli, yna ar gyfer y dyddiadau y gofynnir amdanynt bydd yr adroddiad yn dod gyntaf mewn ymateb i’r cais cynhyrchu, 
  • Ac yna ni fydd yn dod o gwbl.

Gadewch i ni ddechrau ysgrifennu cod

Dull ar gyfer cael y dyddiad, gan gymryd i ystyriaeth y tynnu o’r dyddiad cyfredol

const getDateSubDay = (subDay = 5, start = true) => {     const date = newydd Dyddiad();     date.setUTCDate(date.getUTCDate() – subDay);       os (cychwyn) {         date.setUTCHOurs(0, 0, 0, 0);     } arall {         date.setUTChours(23, 59, 59, 999);     }       dyddiad dychwelyd; };

Adrodd cais cynhyrchu 

const brokerReport = aros (sdk.operations.getBrokerReport)({         GenerationBrokerReportRequest: {             accountId,             o,             i,         }, });

Canlyniad:

  • O ganlyniad i weithredu’r gorchymyn am y tro cyntaf, rydym yn cael y taskId. 
  • Mae’r adroddiad yn dechrau cael ei gynhyrchu ar ochr y brocer. Pan fydd yn barod yn anhysbys, rydym yn aros ac yn tynnu’r dasgId o bryd i’w gilydd gan ragweld yr adroddiad.
  • Pam? Oherwydd os nad yw’r adroddiad yn barod, mae’n taflu gwall. Os nad yw’r adroddiad yn barod ar ochr y brocer, yna mae hwn yn gamgymeriad yn eich cod. Proseswch: 30058|INVALID_ARGUMENT|tasg heb ei chwblhau eto, ceisiwch eto yn nes ymlaen

Mae’r cod ar gyfer aros a derbyn adroddiad yn edrych rhywbeth fel hyn.

amserydd const = amser async => {     dychwelyd Addewid newydd(datrys => setTimeout(datrys, amser)); }   const getBrokerResponseByTaskId = async (taskId, page = 0) => {     ceisiwch {         dychwelyd aros (sdk.operations.getBrokerReport)({             getBrokerReportRequest: {                 taskId,                 tudalen,             },         });     } dal (e) {         consol.log(‘aros’, e);         aros amserydd (10000);         dychwelyd aros am getBrokerResponseByTaskId(taskId, tudalen);     } };

Yna mae’r un hud yn digwydd. Rydyn ni’n atal ein sgript, yn ei gychwyn eto, nid oes gennym ni taskId. Rydym yn gweithredu’r cod gyda’r cais taskId, ond nid ydym yn cael y taskId mwyach, ond yr adroddiad ar unwaith. Hud! A byddai popeth yn iawn pe bai bob amser fel hyn. Ond mewn mis ni fydd unrhyw ddata o gwbl. Defnyddiol :

  • Amlinellir ychydig o ddamcaniaeth yma ac yma .
  • O roi’r cod at ei gilydd, bydd y drafft yn edrych rhywbeth fel hyn.

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

  • Os daw rhywun ar draws hyn, yna croeso i’r mater . Ar ôl iddynt atgyweirio’r hud hwn, bydd yn colli ei bŵer a bydd yn wahanol rywsut. Ond ar hyn o bryd (03/21/2023) mae’n gweithio yn union fel hynny.

GetDividendsForeignIssuer

Efallai y bydd rhywun yn meddwl bod y dull yn debyg i’r un blaenorol a gallwch ddefnyddio un dull lle rydych chi’n newid enw’r gweithrediadau yn unig. Ond wnaethon nhw ddim dyfalu!  Mae’r enwi yno yn wahanol iawn yn y dulliau ac yn y wybodaeth a ddychwelwyd. Ac mae’r cyfrif tudalennau yn dechrau o 0, yna o 1. Er mwyn peidio â chael eich drysu yn hyn i gyd, mae’n haws ysgrifennu dau ddull gwahanol. Sydd yn rhyfedd, oherwydd yr un yw rhesymeg y gwaith. Yr wyf yn poeri am amser hir pan fyddaf yn ceisio gwneud un dull ac roedd llai o cod. Ni fydd enghreifftiau yma.

GetOperationsByCursor

Fy ffefryn o’r tri. Er nad yw’r mwyaf cywir, ond y mwyaf digonol. Rydym yn gwneud cais o ddechrau creu cyfrif i’r dyddiad mwyaf posibl (cau cyfrif neu’r un cyfredol). Rydyn ni’n cael yr ateb, yn cymryd y cyrchwr ac yn ail-wneud cais cyn belled â bod data.  Ac mae’r cod yn fwy cryno nag yn yr enghreifftiau uchod.

amserydd const = amser async => {     dychwelyd Addewid newydd(datrys => setTimeout(datrys, amser)); }   const getOperationsByCursor = async (sdk, accountId, from, to, cursor = ”) => {     try {         const reqData = {             accountId,             o,             i,             terfyn: 1000,             cyflwr: sdk.OperationState.OPERATION_STATE_EXECUTED,             withoutCommissions: false,             hebTrades: ffug,             hebOvernights: ffug,             cyrchwr,         };           dychwelyd yn aros sdk.operations.getOperationsByCursor(reqData);     } dal (e) {         aros amserydd(60000);         dychwelyd aros am getOperationsByCursor(sdk, accountId, o, i, cyrchwr = ”);     } };

Mae’r drafft i’w redeg yma: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Nawr rydym yn barod i ychwanegu gweithrediadau derbyn at ein cais. Os caiff ei wneud yn gywir, yna mae angen i chi gael adroddiadau broceriaeth ar gyfer bodolaeth gyfan y cyfrif. Ac ar gyfer y data coll, yr un T-3s hynny, ail-lwytho o weithrediadau. Ond gellir rhannu hyn yn erthygl ar wahân. O’r prif arlliwiau y byddwch yn dod ar eu traws yw gludo gweithrediadau ac adroddiad broceriaeth.

  •  Os cawsoch heddiw adroddiad broceriaeth a thrafodion ar gyfer y dyddiadau gofynnol, rhowch y cyfan yn y gronfa ddata, yna nid oes unrhyw broblemau. 
  • Fe gewch chi broblemau yfory pan fyddwch chi’n derbyn y rhan nesaf o ddata o’r adroddiad a’r gweithrediadau ac yn penderfynu eu cydamseru â’r gronfa ddata bresennol. 
  • Llawer o arlliwiau ynglŷn â diffyg cyfatebiaeth neu newid id ar ôl prosesu
  • Yna ar gyfer y farchnad OTC, nid yw’r ID yn cyfateb o gwbl.
  •  Yn ogystal â naws cydamseru offerynnau, nad ydynt eto’n cyd-fynd, oherwydd hynodion yr API. Ond stori arall yw honno.

Gadewch i ni ychwanegu cael gwybodaeth am weithrediadau i’n cais. Y prif gwestiwn fydd lle bydd y data’n cael ei brosesu a’i storio.

  •  Os gwnewch hynny drosoch eich hun, byddwch yn defnyddio’r un data o wahanol ddyfeisiau. Yna mae angen i chi brosesu a storio data ar y gweinydd.
  • Os oes gennych lawer o wahanol ddata a ddefnyddir gan lawer o wahanol ddefnyddwyr, yna mae angen i chi benderfynu beth sy’n bwysicach: cyflymder y defnyddwyr neu arbed haearn ar eich ochr chi. Mae pwy bynnag sy’n gallu fforddio swm anfeidrol o galedwedd yn cyfrif popeth ar ei weinydd ac yn ei wneud yn hynod gyflym i ddefnyddwyr, gan arbed adnoddau defnyddwyr, megis batri a thraffig, sy’n bwysig iawn ar ffonau.

Yn ei dro, nid cyfrif yn y porwr yw’r ateb mwyaf optimaidd mewn egwyddor. Felly, yr hyn nad yw’n ddrud, rydym yn ei ystyried ar ein gweinydd. Rydyn ni’n gadael y gweddill i’r cleient. Rwyf wir eisiau cymryd a chyfrifo’r comisiwn ar y gweinydd. Ond yma daw’r naws o’r enw “rhyngweithedd”. Gadewch i ni ddweud bod gennych filoedd o lawdriniaethau ac mae’n cymryd pum munud i’w derbyn. Beth fydd gan y defnyddiwr ar yr adeg hon? Troellwr? Cynnydd? Infa faint gafodd ei uwchlwytho? Mae’n ddelfrydol defnyddio “aros gweithredol” pan allai’r defnyddiwr yn y broses weld rhywbeth eisoes. Dyma’r Canlyniad:Rydym yn datblygu microwasanaeth gan ddefnyddio API Tinkoff Invest i awtomeiddio gweithio gydag adroddiadau broceriaeth a chyfrifo comisiynau.

  • Llwytho tudalen
  • Gofynnir am bob anfoneb
  • Ar ôl hynny, gofynnir am bob trafodiad gyda chomisiynau ar gyfer trafodion a gyflawnwyd ar gyfer pob cyfrif. Wrth i ddata gael ei dderbyn, mae’n cael ei rendro yn y porwr.

Er mwyn peidio â hidlo’r data yn y digwyddiadau bob tro, rydym yn tynnu ein digwyddiad ein hunain ar gyfer pob cyfrif. Fel hyn:

socket.emit(‘sdk:getOperationsCommissionResult_’ + accountId, {                 eitemau: data?.itemau,                 ynProgress: Boolean(Cwrsor nesaf), });

Mae’r drafft i’w lansio yma: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Symud ymlaen. Mae’n wych eich bod chi wedi darllen y llinell hon! 

Cyfrifo ac allbwn gwybodaeth o ddiddordeb

Yn dibynnu ar bwy sydd angen pa wybodaeth. Felly, dywedaf wrthych ar unwaith y prif arlliwiau y byddwch yn dod ar eu traws.

Gweithio gyda phrisiau 

Mae pawb sy’n gweithio gyda chyllid yn gwybod mai dim ond gyda rhifau cyfan y dylid cyflawni trafodion arian. Oherwydd anghywirdeb gwerthoedd ar ôl y pwynt degol a’r gwall cronnol gyda nifer fawr o weithrediadau. Dyna pam y cyflwynir yr holl brisiau yn y fformat MoneyValue canlynolRydym yn datblygu microwasanaeth gan ddefnyddio API Tinkoff Invest i awtomeiddio gweithio gydag adroddiadau broceriaeth a chyfrifo comisiynau.

maes math Disgrifiad
arian cyfred llinyn Llinyn cod arian cyfred ISO
unedau int64 Gall rhan gyfanrif o’r swm fod yn rhif negyddol
nano int32 Rhan ffracsiynol o’r swm, gall fod yn rhif negyddol

Rydyn ni’n eu prosesu ar wahân, yna’n dod â nhw i’r gwerth pris:

quotation.units + dyfyniad.nano/1e9

Cost cytundebau dyfodol

Cyflwynir pris dyfodol mewn pwyntiau, pan fydd gennych ddyfodol arian cyfred, mae angen i chi wybod y gyfradd. Ac wrth gwrs y pris mewn pwyntiau a’r cam pris. Pan fyddwch yn cyfrifo’r elw o drafodion, gall hyn saethu, oherwydd. os ydych chi’n cyfrifo’r cyfanswm trwy luosi’r pris â’r swm. Yma mae angen i chi fod yn ofalus. Am y tro, byddwn yn gweld sut mae’n mynd. Mae hyn yn berthnasol i ddyfodol arian cyfred, mewn mannau eraill mae popeth yn iawn gyda hyn.Rydym yn datblygu microwasanaeth gan ddefnyddio API Tinkoff Invest i awtomeiddio gweithio gydag adroddiadau broceriaeth a chyfrifo comisiynau. Rydym yn datblygu microwasanaeth gan ddefnyddio API Tinkoff Invest i awtomeiddio gweithio gydag adroddiadau broceriaeth a chyfrifo comisiynau.

Farchnad OTC

Mae gan y farchnad hon lawer o hynodion, felly gadewch i ni astudio gweithrediadau arno ar wahân.Pan fyddwch chi’n dechrau cydamseru gweithrediadau, bydd yn troi allan bod angen i chi ddod â ffigys / ticiwr i’r un ffurf er mwyn cyfateb yn gywir i’r offeryn. Pan fyddwch chi’n dechrau cydamseru hyn â’r adroddiad broceriaeth, bydd yn troi allan bod gan tradeID yr un trafodiad lythyrau ar y dechrau yn y trafodion ac nid ydynt yn yr adroddiad broceriaeth. Felly, ni ellir eu cymharu … ahem-ahem … o’u cymharu! Fe wnes i gyfateb yr amser masnach, ticiwr a chyfateb bod un tradeId wedi’i gynnwys mewn un arall. Reit, dydw i ddim yn gwybod. Pwy bynnag sy’n dod ar draws hyn a phwy sy’n poeni amdano, dewch i’r mater neu dechreuwch un newydd.Rydym yn datblygu microwasanaeth gan ddefnyddio API Tinkoff Invest i awtomeiddio gweithio gydag adroddiadau broceriaeth a chyfrifo comisiynau.

Gweithrediadau mathemategol ar offer

Mae’n amhosibl, heb edrych, i berfformio gweithrediadau mathemategol gyda’r rhestr gyfan. Er mwyn peidio ag ychwanegu cynnes i feddal, rydym bob amser yn gwirio’r arian cyfred a’r broses dim ond os ydym yn siŵr bod yr arian cyfred yn cyfateb, a bod y pwyntiau’n cael eu trosi i’r arian cyfred a ddymunir. Gyda gwybodaeth am weithio gyda rhifau banc, byddwn yn cyfrifo’r comisiwn a wariwyd ar bob un o’r cyfrifon. Fel hyn: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4Rydym yn datblygu microwasanaeth gan ddefnyddio API Tinkoff Invest i awtomeiddio gweithio gydag adroddiadau broceriaeth a chyfrifo comisiynau.    

Mae microwasanaeth yn barod!

https://github.com/pskucherov/tcsstat Fel gwaith cartref, gallwch wirio a yw’r gwasanaeth yn gweithio gyda chysylltiad araf, pan fydd cysylltiadau’n cael eu torri, pan fydd y Rhyngrwyd wedi’i ddatgysylltu, pan fydd gwallau neu derfynau sydd wedi dod i ben ar ran y brocer. 

Casgliadau a chynlluniau ar gyfer y dyfodol

  • Wedi dysgu am weithrediadau sylfaenol a gweithio gyda’r API Buddsoddi
  • Amser a dreulir ~ 10 awr
  • Lefel anhawster ~ iau+ / canol isel 

Os byddwch yn parhau i fireinio’r microwasanaeth, efallai y bydd gennych rywbeth fel hyn yn y pen draw

https://opexbot.info

  Dyma fy natblygiad i, ar gyfer y rhai sy’n rhy ddiog i ddeall, rhedeg a chyfrif ar eu pen eu hunain. Rwy’n bwriadu ychwanegu dadansoddeg yno ar gais defnyddwyr. Os oeddech chi’n hoffi’r erthygl, yna tanysgrifiwch i’m sianel telegram . Rydym yn datblygu microwasanaeth gan ddefnyddio API Tinkoff Invest i awtomeiddio gweithio gydag adroddiadau broceriaeth a chyfrifo comisiynau.

Pavel
Rate author
Add a comment

  1. Isakiiev

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

    Reply