Yr ysgogwyr y tu ôl i ddatblygiad y gwasanaeth ystadegau ar gyfer Tinkoff Investments oedd:
- erthygl ar Habré “Yr hyn nad yw Tinkoff Investments yn ei ddweud”
- dadansoddiad o ddymuniadau defnyddwyr y platfform
- erthygl am gyfrifo comisiynau .
- Beth fydd yn cael ei drafod?
- Datblygu gwasanaeth ystadegau gam wrth gam:
- Cysylltiad i Tinkoff Invest API
- Tynnu data o Tinkoff Invest API mewn porwr
- Derbyn adroddiadau broceriaeth a thrafodion
- GetBrokerReport
- Dull ar gyfer cael y dyddiad, gan gymryd i ystyriaeth y tynnu o’r dyddiad cyfredol
- Adrodd cais cynhyrchu
- Canlyniad:
- GetDividendsForeignIssuer
- GetOperationsByCursor
- Cyfrifo ac allbwn gwybodaeth o ddiddordeb
- Gweithio gyda phrisiau
- Cost cytundebau dyfodol
- Farchnad OTC
- Gweithrediadau mathemategol ar offer
- Mae microwasanaeth yn barod!
- Casgliadau a chynlluniau ar gyfer y dyfodol
- https://opexbot.info
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:
- Cysylltiad i Tinkoff Invest API
- Tynnu data o Tinkoff Invest API mewn porwr
- Derbyn adroddiadau broceriaeth a thrafodion
- Cyfrifo ac allbwn gwybodaeth o ddiddordeb
- 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:
- 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).
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
- https://github.com/pskucherov/tcsstat/commit/7e1ac57061e5e971588479015b06d8814d6609a9
- 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
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.
- 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.
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:
- 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 canlynol
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.
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.
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…step4
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 .
Полезная статья. Не могу представить, сколько усилий автора потребовалось, чтобы все описать. Благодарю.