A n ṣe agbekalẹ microservice kan ni lilo Tinkoff Invest API lati ṣe adaṣe awọn ijabọ alagbata ati iṣiro igbimọ.

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

Awọn iwuri lẹhin idagbasoke ti iṣẹ iṣiro fun Tinkoff Investments ni:

Kí la máa jíròrò?

  • Nikan apakan ti a lo nipa idagbasoke.
  • Imọ ati iriri gidi, eyiti o ṣe pataki pupọ ni ṣiṣẹ pẹlu awọn ohun elo inawo.
  • Akopọ ti awọn oran lati ṣiṣẹ lori

Nitorinaa, Mo fẹ lati ṣe iṣiro awọn iṣiro iṣowo ati ṣe ni ọna ti o rọrun. 

Dagbasoke iṣẹ iṣiro ni igbese nipa igbese: 

  1. Asopọ si Tinkoff Invest API
  2. Yiya data lati Tinkoff Invest API ni ẹrọ aṣawakiri kan
  3. Gbigba awọn ijabọ alagbata ati awọn iṣowo
  4. Iṣiro ati o wu ti alaye ti awọn anfani
  5. Awọn ipari ati awọn ero fun ojo iwaju

Asopọ si Tinkoff Invest API

Lati sopọ si API, o le mu eyikeyi sdk lati inu iwe https://github.com/Tinkoff/investAPI#sdk . Tabi package npm ` tinkoff-sdk-grpc-js `. O ṣe pataki ki package ti ni imudojuiwọn si ẹya tuntun nipasẹ awọn olupilẹṣẹ. Fi sori ẹrọ

npm i tinkoff-sdk-grpc-js

Ṣiṣayẹwo

const {creadSdk} = beere (‘tinkoff-sdk-grpc-js’);   // Àmi ti o le gba bi  const TOKEN = ‘YOURAPI’;   // Orukọ ohun elo nipasẹ eyiti o le rii ninu awọn akọọlẹ TCS. const appName = ‘tcsstat’;   const sdk = ṣẹdaSdk (TOKEN, appName); (async () => {     console.log(duro sdk.users.getAccounts()); })();

Esi: atokọ ti awọn akọọlẹ rẹ yoo han ninu console. Fun apẹẹrẹ, jẹ ki a ṣe itupalẹ awọn nuances:A n ṣe agbekalẹ microservice kan ni lilo Tinkoff Invest API lati ṣe adaṣe awọn ijabọ alagbata ati iṣiro igbimọ.

  • Ninu atokọ ti awọn akọọlẹ “Bank Investment” kan wa, pẹlu eyiti o ko le ṣiṣẹ ni lilo API
  • Jọwọ ṣe akiyesi pe awọn aaye wa ni camelCase, lakoko ti o wa ninu iwe awọn aaye wọnyi ti gbekalẹ ni under_score. 
  • Yoo dabi eyi nibi gbogbo, nitorinaa o ko le gba ati daakọ aaye kan lati inu iwe.

Wulo:

  • O le wa koodu yii ni ẹka iṣẹ akanṣe

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

Yiya data lati Tinkoff Invest API ni ẹrọ aṣawakiri kan

Mo mu next.js ati socket.io. Eyi kii ṣe iṣeduro ti o lagbara, yan ni lakaye rẹ. 

npx ṣẹda-next-app@tuntun npm i socket.io socket.io-client

A tẹsiwaju lẹsẹkẹsẹ si igbesẹ ọrẹ ni atẹle + iho + investapi, ati wo apakan Wulo ti igbesẹ yii fun gbogbo awọn alaye.  Emi yoo ṣe apejuwe awọn alaye: 

  • Ni ẹgbẹ nodejs (olupin), awọn oju-iwe kan wa/api/investapi.js faili. Eyi ni ibiti a ti ṣẹda olupin socket.io ati sopọ si investapi.
  • Ni ẹgbẹ aṣawakiri (alabara), a sopọ si olupin nipasẹ iho kan ati beere data akọọlẹ lati ọdọ alagbata naa. 
  • A gba data lati ọdọ alagbata lori olupin naa, lẹhinna firanṣẹ si alabara. Nigbati wọn ba gba lori alabara, wọn han ni ẹrọ aṣawakiri. 

Abajade:  ninu console ẹrọ aṣawakiri a le rii alaye nipa awọn akọọlẹ. Iyẹn ni, ni igbesẹ ti o kẹhin, a rii alaye nipa awọn akọọlẹ ninu console olupin (nodejs), ni igbesẹ lọwọlọwọ, a gbe alaye yii si alabara (oluwakiri).

A n ṣe agbekalẹ microservice kan ni lilo Tinkoff Invest API lati ṣe adaṣe awọn ijabọ alagbata ati iṣiro igbimọ.

Bayi jẹ ki a ṣe ki o le yan akọọlẹ kan lati ẹrọ aṣawakiri, ati pe ti ko ba si ami, lẹhinna aṣiṣe kan ranṣẹ si console. Iṣẹ naa rọrun ati pe ko si nkankan titun, nitorinaa Mo fun awọn ọna asopọ nikan lati ṣe

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

Wulo:

  • Bi o ṣe le ṣe awọn ọrẹ ni atẹle ati iho ti wa ni apejuwe ninu awọn alaye nibi
  • Koodu ọrẹ atẹle + iho + investapi:

https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Fun ẹniti eyi ti o wa loke nira, lẹhinna a wa ni ipele yii ki a ṣe pẹlu koodu naa. Ti o ba ni awọn ibeere – beere. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2

Gbigba awọn ijabọ alagbata ati awọn iṣowo

Awọn ọna mẹta wa lati gba awọn ijabọ alagbata ati awọn iṣowo

  1. Iroyin GetBroker
  2. GbaDividendsForeignIfunfun
  3. GetOperationsByCursor

Lati ibẹrẹ akọkọ o ṣe pataki lati mọ: 

  • Iroyin alagbata ti wa ni ipilẹṣẹ ni ipo T-3, i.e. awọn iṣowo ti han nibẹ lẹhin ipaniyan gangan wọn. 
  • Nitorinaa, ti o ba beere ijabọ yii fun ọjọ meji to kọja, yoo ṣetan ni ọjọ mẹta. 
  • Lati ṣe awọn iṣowo fun awọn ọjọ ikẹhin, a lo ọna fun gbigba awọn iṣẹ ṣiṣe, ṣugbọn ranti pe id ati akoonu wọn le yipada lẹhin idasile ti ijabọ alagbata.

Iroyin GetBroker

Lati gba ijabọ alagbata, o nilo lati mu id akọọlẹ, ọjọ ibẹrẹ ati ọjọ ipari ti ijabọ naa, ṣugbọn ko ju awọn ọjọ 31 lọ. A firanṣẹ ibeere kan lati ṣe agbekalẹ ijabọ kan si API ni ipilẹṣẹ _broker_report_request , gba taskId ni esi. Lẹhin iyẹn, lilo taskId yii, a gba data lati gba _broker_report_response. [akọle spoiler = “Nitorina iwe-ipamọ naa sọ pe, ni otitọ awọn nuances wa. Wo ọwọ rẹ:”]

  • O nilo lati fi TaskID pamọ lailai fun awọn ọjọ wọnyi. 
  • Niwọn igba ti o ba padanu rẹ, lẹhinna fun awọn ọjọ ti o beere ijabọ naa yoo kọkọ wa ni idahun si ibeere iran, 
  • Ati lẹhinna kii yoo wa rara.

[/ spoiler] Jẹ ká bẹrẹ kikọ koodu

Ọna fun gbigba ọjọ naa, ni akiyesi iyokuro lati ọjọ lọwọlọwọ

const getDateSubDay = (subDay = 5, ibere = otito) => {     constday = Ọjọ tuntun();     date.setUTCDate (date.getUTCDate () – subDay);       ti o ba jẹ (bẹrẹ) {         date.setUTCHours (0, 0, 0, 0);     } miran {         date.setUTCHours (23, 59, 59, 999);     }       ọjọ ipadabọ; };

Iroyin iran ìbéèrè 

const brokerReport = duro (sdk.operations.getBrokerReport)({         genereBrokerReportRequest: {             accountId,             lati,             si,         }, });

Abajade:

  • Bi abajade ti ipaniyan akọkọ ti aṣẹ, a gba taskId. 
  • Ijabọ naa bẹrẹ lati ṣe ipilẹṣẹ ni ẹgbẹ alagbata. Nigbati o ba ti ṣetan jẹ aimọ, a duro ati lorekore fa taskId ni ifojusona ijabọ naa.
  • Kí nìdí? Nitori ti ijabọ naa ko ba ṣetan, o jabọ aṣiṣe kan. Ti ijabọ naa ko ba ṣetan ni ẹgbẹ alagbata, lẹhinna eyi jẹ aṣiṣe ninu koodu rẹ. Jọwọ ṣe ilana: 30058|INVALID_ARGUMENT|iṣẹ́ kò tíì parí síbẹ̀, jọ̀wọ́ tún gbìyànjú lẹ́ẹ̀kan sí i

Awọn koodu fun nduro ati gbigba a Iroyin wulẹ nkankan bi yi.

const aago = akoko async => {     pada Ileri tuntun(ipinnu => ṣetoTimeout(ipinnu, akoko)); }   const getBrokerResponseByTaskId = async (taskId, iwe = 0) => {     gbiyanju {         pada await (sdk.operations.getBrokerReport)({             getBrokerReportRequest: {                 taskId,                 page,             },         });     } apeja (e) {         console.log (‘duro’, e);         aago duro (10000);         pada await getBrokerResponseByTaskId(taskId, iwe);     } ;

Nigbana ni idan kanna ṣẹlẹ. A da iwe afọwọkọ wa duro, tun bẹrẹ, a ko ni taskId. A ṣiṣẹ koodu naa pẹlu ibeere taskId, ṣugbọn a ko gba taskId mọ, ṣugbọn ijabọ naa lẹsẹkẹsẹ. Idan! Ati pe ohun gbogbo yoo dara ti o ba jẹ nigbagbogbo bi eyi. Ṣugbọn ni oṣu kan kii yoo si data rara. Wulo :

  • A bit ti yii ti wa ni ilana nibi ati nibi .
  • Fifi koodu naa papọ, apẹrẹ yoo dabi nkan bi eyi.

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

  • Ti ẹnikan ba pade eyi, lẹhinna kaabọ si ọran naa . Lẹhin ti wọn tun idan yii ṣe, yoo padanu agbara rẹ ati pe yoo yatọ bakan. Ṣugbọn ni akoko lọwọlọwọ (03/21/2023) o ṣiṣẹ bii iyẹn.

GbaDividendsForeignIfunfun

Ẹnikan le ro pe ọna naa jẹ iru si ti iṣaaju ati pe o le lo ọna kan ninu eyiti o yi orukọ awọn iṣẹ naa pada nikan. Ṣugbọn wọn ko gboju!  Orukọ ti o wa nibẹ yatọ pupọ mejeeji ni awọn ọna ati ninu alaye ti o pada. Ati kika oju-iwe bẹrẹ lati 0, lẹhinna lati 1. Ni ibere ki o má ba ni idamu ninu gbogbo eyi, o rọrun lati kọ awọn ọna oriṣiriṣi meji. Eyi ti o jẹ ajeji, nitori ọgbọn ti iṣẹ jẹ kanna. Mo tutọ fun igba pipẹ nigbati Mo gbiyanju lati ṣe ọna kan ati pe koodu kekere wa. Ko si awọn apẹẹrẹ nibi.

GetOperationsByCursor

Ayanfẹ mi ti awọn mẹta. Botilẹjẹpe kii ṣe deede julọ, ṣugbọn deede julọ. A ṣe ibeere lati ibẹrẹ ṣiṣẹda akọọlẹ kan si ọjọ ti o pọju ti o ṣeeṣe (tipa akọọlẹ kan tabi ọkan lọwọlọwọ). A gba idahun, mu kọsọ ki o tun beere niwọn igba ti data ba wa.  Ati pe koodu naa jẹ ṣoki diẹ sii ju ninu awọn apẹẹrẹ loke.

const aago = akoko async => {     pada Ileri tuntun(ipinnu => ṣetoTimeout(ipinnu, akoko)); }   const getOperationsByCursor = async (sdk, accountId, lati, to, cursor = ”) => {     gbiyanju {         const reqData = {             accountId,             lati,             si,             limit: 1000,             state: sdk.OperationState.OPERATION_STATE_EXECUTED,             laisi Igbimọ: eke,             laiTrades: eke,             laiOvernights: eke,             kọsọ,         };           pada await sdk.operations.getOperationsByCursor (reqData);     } apeja (e) {         aago duro (60000);         pada await getOperationsByCursor(sdk, accountId, lati, si, kọsọ = ”);     } ;

Ilana lati ṣiṣẹ wa nibi: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Bayi a ti ṣetan lati ṣafikun awọn iṣẹ gbigba si ohun elo wa. Ti o ba ṣe ni deede, lẹhinna o nilo lati gba awọn ijabọ alagbata fun gbogbo aye ti akọọlẹ naa. Ati fun data ti o padanu, awọn T-3 kanna, tun gbejade lati awọn iṣẹ ṣiṣe. Ṣugbọn eyi le pin si nkan lọtọ. Ninu awọn nuances akọkọ ti iwọ yoo ba pade ni lati lẹ pọ awọn iṣẹ ṣiṣe ati ijabọ alagbata kan.

  •  Ti o ba jẹ pe loni o gba ijabọ alagbata ati awọn iṣowo fun awọn ọjọ ti a beere, fi gbogbo rẹ sinu ibi ipamọ data, lẹhinna ko si awọn iṣoro. 
  • Iwọ yoo ni awọn iṣoro ni ọla nigbati o ba gba apakan atẹle ti data lati ijabọ ati awọn iṣẹ ṣiṣe ati pinnu lati muuṣiṣẹpọ wọn pẹlu data data ti o wa. 
  • Pupọ awọn nuances nipa aiṣedeede tabi iyipada id lẹhin sisẹ
  • Lẹhinna fun ọja OTC, id ko baramu rara.
  •  Bakannaa awọn nuances ti awọn ohun elo mimuuṣiṣẹpọ, eyiti ko tun ṣe deede, nitori awọn ẹya ara ẹrọ ti API. Ṣugbọn iyẹn jẹ itan miiran.

Jẹ ki a ṣafikun alaye gbigba nipa awọn iṣẹ ṣiṣe si ohun elo wa. Ibeere akọkọ yoo jẹ ibi ti data yoo ti ṣiṣẹ ati ti o fipamọ.

  •  Ti o ba ṣe fun ara rẹ, iwọ yoo jẹ data kanna lati awọn ẹrọ oriṣiriṣi. Lẹhinna o nilo lati ṣe ilana ati tọju data lori olupin naa.
  • Ti o ba ni ọpọlọpọ awọn oriṣiriṣi data ti o jẹ nipasẹ ọpọlọpọ awọn olumulo ti o yatọ, lẹhinna o nilo lati pinnu ohun ti o ṣe pataki julọ: iyara awọn olumulo tabi fifipamọ irin ni ẹgbẹ rẹ. Ẹnikẹni ti o le ni iye ailopin ti ohun elo ka ohun gbogbo lori olupin rẹ ati jẹ ki o yara pupọ fun awọn olumulo, fifipamọ awọn orisun olumulo, bii batiri ati ijabọ, eyiti o ṣe pataki pupọ lori awọn foonu.

Ni ọna, kika ni ẹrọ aṣawakiri kii ṣe ojutu ti o dara julọ ni ipilẹ. Nitorina, ohun ti kii ṣe gbowolori, a ṣe akiyesi rẹ lori olupin wa. A fi awọn iyokù si awọn ose. Mo fẹ gaan lati mu ati ṣe iṣiro igbimọ lori olupin naa. Sugbon nibi ba wa ni nuance ti a npe ni “ibaraenisepo”. Jẹ ki a sọ pe o ni ẹgbẹẹgbẹrun awọn iṣẹ ṣiṣe ati pe o gba to iṣẹju marun lati gba wọn. Kini olumulo yoo ni ni akoko yii? Spinner? Ilọsiwaju? Infa nipa melo ni a gbejade? O jẹ apẹrẹ lati lo “idaduro ti nṣiṣe lọwọ” nigbati olumulo ninu ilana le ti rii ohunkan tẹlẹ. Eyi ni Abajade:A n ṣe agbekalẹ microservice kan ni lilo Tinkoff Invest API lati ṣe adaṣe awọn ijabọ alagbata ati iṣiro igbimọ.

  • Ikojọpọ oju-iwe
  • Gbogbo awọn risiti ni a beere
  • Lẹhin iyẹn, gbogbo awọn iṣowo pẹlu awọn igbimọ fun awọn iṣowo ti a ṣe ni a beere fun gbogbo awọn akọọlẹ. Bi data ṣe gba, o ti wa ni jigbe ni ẹrọ aṣawakiri.

Ni ibere ki o má ba ṣe àlẹmọ data ni awọn iṣẹlẹ ni igba kọọkan, a fa iṣẹlẹ ti ara wa fun akọọlẹ kọọkan. Bi eleyi:

socket.emit (‘sdk:getOperationsCommissionResult_’+ accountId, {                 awọn ohun kan: data?.awọn nkan,                 inProgress: Boolean(nextCursor), });

Ilana lati ṣe ifilọlẹ wa nibi: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Gbigbe siwaju. O jẹ nla pe o ti ka laini yii! 

Iṣiro ati o wu ti alaye ti awọn anfani

Da lori ẹniti o nilo alaye wo. Nitorinaa, Mo sọ fun ọ lẹsẹkẹsẹ awọn nuances akọkọ ti iwọ yoo ba pade.

Ṣiṣẹ pẹlu awọn idiyele 

Gbogbo eniyan ti o ṣiṣẹ pẹlu inawo mọ pe awọn iṣowo owo yẹ ki o ṣee ṣe pẹlu awọn nọmba gbogbo nikan. Nitori aiṣedeede ti awọn iye lẹhin aaye eleemewa ati aṣiṣe akopọ pẹlu nọmba nla ti awọn iṣẹ. Ti o ni idi ti gbogbo awọn idiyele ti gbekalẹ ni ọna kika MoneyValue atẹleA n ṣe agbekalẹ microservice kan ni lilo Tinkoff Invest API lati ṣe adaṣe awọn ijabọ alagbata ati iṣiro igbimọ.

aayeiruApejuwe
owookunOkun ISO koodu owo
awọn ẹyaint64Odidi apa apao, le jẹ nọmba odi
nanoint32Apa kan ti iye, le jẹ nọmba odi

A ṣe ilana wọn lọtọ, lẹhinna mu wọn wa si iye idiyele:

quote.units + quote.nano / 1e9

Awọn iye owo ti ojo iwaju siwe

Iye owo awọn ọjọ iwaju ni a gbekalẹ ni awọn aaye, nigbati o ba ni ọjọ iwaju owo, o nilo lati mọ oṣuwọn naa. Ati pe dajudaju idiyele ni awọn aaye ati igbesẹ idiyele. Nigbati o ba ṣe iṣiro èrè lati awọn iṣowo, eyi le iyaworan, nitori. ti o ba ṣe iṣiro iye lapapọ nipa isodipupo iye owo nipasẹ opoiye. Nibi o nilo lati ṣọra. Fun bayi, a yoo rii bi o ṣe lọ. Eyi kan si awọn ọjọ iwaju owo, ni awọn aye miiran ohun gbogbo dara pẹlu eyi.A n ṣe agbekalẹ microservice kan ni lilo Tinkoff Invest API lati ṣe adaṣe awọn ijabọ alagbata ati iṣiro igbimọ.A n ṣe agbekalẹ microservice kan ni lilo Tinkoff Invest API lati ṣe adaṣe awọn ijabọ alagbata ati iṣiro igbimọ.

OTC oja

Ọja yii ni ọpọlọpọ awọn ẹya ara ẹrọ, nitorinaa jẹ ki a ṣe iwadi awọn iṣẹ lori rẹ lọtọ Nigbati o ba bẹrẹ mimuuṣiṣẹpọ awọn iṣẹ, yoo jẹ pe o nilo lati mu figi / ami si fọọmu kanna lati le baamu ohun elo naa ni deede. Nigbati o ba bẹrẹ mimuuṣiṣẹpọ eyi pẹlu ijabọ alagbata, yoo jade pe ID iṣowo ti idunadura kanna ni awọn lẹta ni ibẹrẹ ni awọn iṣowo ati pe wọn ko si ninu ijabọ alagbata. Nitorina, wọn ko le ṣe afiwe … ahem-ahem … ni afiwe! Mo ti baamu akoko iṣowo, tika ati ibaramu ti iṣowoId kan wa ninu omiiran. Otọ, Emi ko mọ. Ẹnikẹni ti o ba pade eyi ati ẹniti o bikita nipa rẹ, wa si ọrọ naa tabi bẹrẹ tuntun kan.A n ṣe agbekalẹ microservice kan ni lilo Tinkoff Invest API lati ṣe adaṣe awọn ijabọ alagbata ati iṣiro igbimọ.

Mathematiki mosi lori irinṣẹ

Ko ṣee ṣe, laisi wiwo, lati ṣe awọn iṣẹ ṣiṣe mathematiki pẹlu gbogbo atokọ naa. Ni ibere ki o má ba fi gbona si asọ, a nigbagbogbo ṣayẹwo owo ati ilana nikan ti a ba ni idaniloju pe awọn ibaamu owo, ati awọn ojuami ti wa ni iyipada si owo ti o fẹ. Ni ihamọra pẹlu imọ nipa ṣiṣẹ pẹlu awọn nọmba banki, a yoo ṣe iṣiro igbimọ ti o lo lori awọn akọọlẹ kọọkan. Bii eyi: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4A n ṣe agbekalẹ microservice kan ni lilo Tinkoff Invest API lati ṣe adaṣe awọn ijabọ alagbata ati iṣiro igbimọ.   

Microservice ti šetan!

https://github.com/pskucherov/tcsstat Gẹgẹbi iṣẹ amurele, o le ṣayẹwo boya iṣẹ naa ba ṣiṣẹ pẹlu asopọ ti o lọra, nigbati awọn asopọ ba bajẹ, nigbati Intanẹẹti ti ge-asopo, nigbati awọn aṣiṣe tabi awọn opin ipari ni apakan ti alagbata naa. 

Awọn ipari ati awọn ero fun ojo iwaju

  • Kọ ẹkọ nipa awọn iṣẹ ipilẹ ati ṣiṣẹ pẹlu API Invest
  • Akoko ti a lo ~ 10 wakati
  • Ipele iṣoro ~ junior + / arin kekere 

Ti o ba tẹsiwaju lati ṣatunṣe microservice, o le pari pẹlu nkan bii eyi

https://opexbot.info

  Eyi ni idagbasoke mi, fun awọn ti o jẹ ọlẹ lati ni oye, ṣiṣe ati ka lori ara wọn. Mo gbero lati ṣafikun awọn atupale nibẹ ni ibeere ti awọn olumulo. Ti o ba fẹran nkan naa, lẹhinna ṣe alabapin si ikanni telegram mi . A n ṣe agbekalẹ microservice kan ni lilo Tinkoff Invest API lati ṣe adaṣe awọn ijabọ alagbata ati iṣiro igbimọ.

Pavel
Rate author
Add a comment

  1. Isakiiev

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

    Reply