टिंकॉफ गुंतवणूकीसाठी सांख्यिकी सेवेच्या विकासामागील प्रेरणादायी होते:
- हॅब्रेवरील लेख “टिंकॉफ गुंतवणूक काय म्हणत नाहीत”
- प्लॅटफॉर्म वापरकर्त्यांच्या इच्छांचे विश्लेषण
- कमिशनच्या गणनेबद्दल एक लेख .
- काय चर्चा होणार?
- टप्प्याटप्प्याने सांख्यिकी सेवा विकसित करणे:
- Tinkoff Invest API ला कनेक्शन
- Tinkoff Invest API वरून ब्राउझरमध्ये डेटा काढणे
- ब्रोकरेज अहवाल आणि व्यवहार प्राप्त करणे
- GetBrokerReport
- वर्तमान तारखेपासून वजाबाकी लक्षात घेऊन तारीख मिळविण्याची पद्धत
- अहवाल निर्मिती विनंती
- परिणाम:
- GetDivendsForeignIssuer
- GetOperationsByCursor
- स्वारस्य असलेल्या माहितीची गणना आणि आउटपुट
- किंमतीसह कार्य करणे
- फ्युचर्स कॉन्ट्रॅक्टची किंमत
- ओटीसी मार्केट
- साधनांवर गणितीय क्रिया
- मायक्रो सर्व्हिस तयार आहे!
- भविष्यासाठी निष्कर्ष आणि योजना
- https://opexbot.info
काय चर्चा होणार?
- विकासाबद्दल फक्त लागू केलेला भाग.
- वास्तविक ज्ञान आणि अनुभव, जे आर्थिक साधनांसह कार्य करताना खूप महत्वाचे आहेत.
- कार्य करण्यासाठी समस्यांचे विहंगावलोकन
म्हणून, मला व्यापार आकडेवारीची गणना करायची आहे आणि ते सोयीस्कर पद्धतीने करायचे आहे.
टप्प्याटप्प्याने सांख्यिकी सेवा विकसित करणे:
- Tinkoff Invest API ला कनेक्शन
- Tinkoff Invest API वरून ब्राउझरमध्ये डेटा काढणे
- ब्रोकरेज अहवाल आणि व्यवहार प्राप्त करणे
- स्वारस्य असलेल्या माहितीची गणना आणि आउटपुट
- भविष्यासाठी निष्कर्ष आणि योजना
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(await sdk.users.getAccounts()); })();
परिणाम: कन्सोलमध्ये तुमच्या खात्यांची सूची प्रदर्शित केली जाईल. उदाहरणार्थ, बारीकसारीक गोष्टींचे विश्लेषण करूया:
- खात्यांच्या सूचीमध्ये एक “गुंतवणूक बँक” आहे, ज्यासह तुम्ही API वापरून कार्य करू शकत नाही
- कृपया लक्षात घ्या की फील्ड कॅमलकेसमध्ये येतात, तर दस्तऐवजीकरणामध्ये हे फील्ड अंडर_स्कोअरमध्ये सादर केले जातात.
- हे सर्वत्र असे असेल, म्हणून तुम्ही कागदपत्रांमधून फील्ड घेऊ आणि कॉपी करू शकत नाही.
उपयुक्त:
- हा कोड तुम्हाला प्रकल्प शाखेत मिळेल
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 i socket.io socket.io-client
आम्ही ताबडतोब पुढील+सॉकेट+इन्व्हेस्टापी मैत्रीच्या पायरीवर जाऊ आणि सर्व तपशीलांसाठी या पायरीचा उपयुक्त विभाग पहा. मी तपशीलवार वर्णन करेन:
- nodejs (सर्व्हर) बाजूला, एक pages/api/investapi.js फाइल आहे. इथेच आम्ही socket.io सर्व्हर तयार करतो आणि गुंतवणूकापीशी कनेक्ट करतो.
- ब्राउझर (क्लायंट) बाजूला, आम्ही सॉकेटद्वारे सर्व्हरशी कनेक्ट करतो आणि ब्रोकरकडून खाते डेटाची विनंती करतो.
- आम्ही ब्रोकरकडून सर्व्हरवर डेटा प्राप्त करतो, नंतर तो क्लायंटला पाठवतो. जेव्हा ते क्लायंटवर प्राप्त होतात, तेव्हा ते ब्राउझरमध्ये प्रदर्शित केले जातात.
परिणाम: ब्राउझर कन्सोलमध्ये आम्ही खात्यांबद्दल माहिती पाहू शकतो. म्हणजेच, शेवटच्या चरणात, आम्ही सर्व्हर कन्सोल (नोडेज) मधील खात्यांबद्दल माहिती पाहिली, वर्तमान चरणात, आम्ही ही माहिती क्लायंट (ब्राउझर) वर हस्तांतरित केली.
आता आपण ते बनवूया जेणेकरून आपण ब्राउझरमधून खाते निवडू शकता आणि टोकन नसल्यास, कन्सोलवर एक त्रुटी पाठविली जाईल. काम सोपे आहे आणि नवीन काही नाही, म्हणून मी फक्त कमिटच्या लिंक देतो
- https://github.com/pskucherov/tcsstat/commit/7e1ac57061e5e971588479015b06d8814d6609a9
- 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
ब्रोकरेज अहवाल आणि व्यवहार प्राप्त करणे
ब्रोकरेज अहवाल आणि व्यवहार प्राप्त करण्यासाठी तीन पद्धती आहेत
अगदी सुरुवातीपासूनच हे जाणून घेणे महत्त्वाचे आहे:
- ब्रोकरेज अहवाल T-3 मोडमध्ये तयार केला जातो, म्हणजे. व्यवहार त्यांच्या प्रत्यक्ष अंमलबजावणीनंतर तेथे प्रदर्शित केले जातात.
- त्यानुसार गेल्या दोन दिवसांपासून हा अहवाल मागवल्यास तीन दिवसांत तो तयार होईल.
- शेवटच्या दिवसांचे व्यवहार मिळविण्यासाठी, आम्ही व्यवहार प्राप्त करण्याच्या पद्धतीचा वापर करतो, परंतु लक्षात ठेवा की ब्रोकरेज अहवाल तयार झाल्यानंतर त्यांचा आयडी आणि सामग्री बदलू शकते.
GetBrokerReport
ब्रोकरेज अहवाल मिळविण्यासाठी, तुम्हाला खाते आयडी, अहवालाची प्रारंभ तारीख आणि समाप्ती तारीख घेणे आवश्यक आहे, परंतु 31 दिवसांपेक्षा जास्त नाही. आम्ही generate _broker_report_request मध्ये API ला अहवाल तयार करण्याची विनंती पाठवतो , प्रतिसादात टास्कआयडी मिळवा. त्यानंतर, हा टास्कआयडी वापरून, आम्हाला get _broker_report_response वरून डेटा मिळतो.
- या तारखांसाठी तुम्हाला TaskID कायमचा जतन करणे आवश्यक आहे.
- आपण ते गमावल्यास, नंतर विनंती केलेल्या तारखांसाठी अहवाल प्रथम जनरेशन विनंतीला प्रतिसाद म्हणून येईल,
- आणि मग ते अजिबात येणार नाही.
वर्तमान तारखेपासून वजाबाकी लक्षात घेऊन तारीख मिळविण्याची पद्धत
const getDateSubDay = (subDay = 5, start = true) => { const date = new Date(); date.setUTCDate(date.getUTCDate() – उपदिन); जर (प्रारंभ) { date.setUTCHours(0, 0, 0, 0); } इतर { date.setUTCHours(23, 59, 59, 999); } परतीची तारीख; };
अहवाल निर्मिती विनंती
const brokerReport = प्रतीक्षा करा (sdk.operations.getBrokerReport)({ generateBrokerReportRequest: { accountId, from, to, }, });
परिणाम:
- कमांडच्या प्रथम अंमलबजावणीच्या परिणामी, आम्हाला टास्कआयडी मिळेल.
- ब्रोकरच्या बाजूने अहवाल तयार होऊ लागतो. जेव्हा ते तयार होते तेव्हा अज्ञात असते, आम्ही प्रतीक्षा करतो आणि वेळोवेळी अहवालाच्या अपेक्षेने टास्कआयडी खेचतो.
- का? कारण अहवाल तयार नसेल तर त्यात त्रुटी निघून जातात. ब्रोकरच्या बाजूने अहवाल तयार नसल्यास, ही तुमच्या कोडमधील त्रुटी आहे. कृपया प्रक्रिया करा: 30058|INVALID_ARGUMENT|कार्य अद्याप पूर्ण झाले नाही, कृपया नंतर पुन्हा प्रयत्न करा
प्रतिक्षा आणि अहवाल प्राप्त करण्याचा कोड यासारखा दिसतो.
const timer = async time => { नवीन वचन परत करा(resolve => setTimeout(resolve, time)); } const getBrokerResponseByTaskId = async (taskId, पृष्ठ = 0) => { प्रयत्न करा { return await (sdk.operations.getBrokerReport)({ getBrokerReportRequest: { taskId, पृष्ठ, }, }); } पकड (e) { console.log(‘wait’, e); प्रतीक्षा टाइमर (10000); getBrokerResponseByTaskId(taskId, पृष्ठ); } };
मग तीच जादू घडते. आम्ही आमची स्क्रिप्ट थांबवतो, ती पुन्हा सुरू करतो, आमच्याकडे टास्कआयडी नाही. आम्ही टास्कआयडी विनंतीसह कोड कार्यान्वित करतो, परंतु आम्हाला यापुढे टास्कआयडी मिळत नाही, परंतु लगेच अहवाल मिळतो. जादू! आणि हे नेहमी असे असेल तर सर्वकाही ठीक होईल. पण एका महिन्यात अजिबात डेटा मिळणार नाही. उपयुक्त :
https://github.com/pskucherov/tcsstat/tree/step3.1 https://github.com/pskucherov/tcsstat/compare/step3.1
- जर कोणी हे पाहत असेल तर अंकात स्वागत आहे . त्यांनी ही जादू दुरुस्त केल्यानंतर, ते त्याची शक्ती गमावेल आणि काहीसे वेगळे होईल. परंतु सध्याच्या क्षणी (03/21/2023) ते असेच कार्य करते.
GetDivendsForeignIssuer
कोणीतरी विचार करू शकतो की पद्धत मागील पद्धतीसारखीच आहे आणि आपण एक पद्धत वापरू शकता ज्यामध्ये आपण केवळ ऑपरेशनचे नाव बदलू शकता. पण त्यांना अंदाज आला नाही! तेथील नामकरण पद्धती आणि परत केलेल्या माहितीमध्ये खूप भिन्न आहे. आणि पृष्ठ संख्या 0 पासून सुरू होते, नंतर 1 पासून. या सर्व गोष्टींमध्ये गोंधळ होऊ नये म्हणून, दोन भिन्न पद्धती लिहिणे सोपे आहे. जे विचित्र आहे, कारण कामाचे तर्क समान आहे. जेव्हा मी एक पद्धत बनवण्याचा प्रयत्न केला आणि कोड कमी होता तेव्हा मी बराच वेळ थुंकलो. येथे उदाहरणे मिळणार नाहीत.
GetOperationsByCursor
तिघांपैकी माझे आवडते. जरी सर्वात अचूक नसले तरी सर्वात पुरेसे आहे. आम्ही खाते तयार करण्याच्या सुरुवातीपासून जास्तीत जास्त संभाव्य तारखेपर्यंत (खाते बंद करणे किंवा वर्तमान एक) विनंती करतो. आम्हाला उत्तर मिळते, कर्सर घ्या आणि जोपर्यंत डेटा आहे तोपर्यंत पुन्हा विनंती करा. आणि कोड वरील उदाहरणांपेक्षा अधिक संक्षिप्त आहे.
const timer = async time => { नवीन वचन परत करा(resolve => setTimeout(resolve, time)); } const getOperationsByCursor = async (sdk, accountId, from, to, cursor = ”) => { प्रयत्न करा { const reqData = { accountId, from, to, limit: 1000, state: sdk.OperationState.OPERATION_STATE_EXECUTED, आयोगाशिवाय, खोटे: व्यापाराशिवाय: खोटे, रात्रभर: असत्य, कर्सर, }; परतीची प्रतीक्षा करा sdk.operations.getOperationsByCursor(reqData); } पकडणे (ई) { प्रतीक्षा टाइमर(60000); रिटर्न प्रतीक्षा getOperationsByCursor(sdk, accountId, from, to, cursor = ”); } };
चालवण्यासाठी मसुदा येथे आहे: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 आता आम्ही यामध्ये रिसीव्हिंग ऑपरेशन्स जोडण्यासाठी तयार आहोत आमचा अर्ज. योग्यरित्या केले असल्यास, तुम्हाला खात्याच्या संपूर्ण अस्तित्वासाठी ब्रोकरेज अहवाल प्राप्त करणे आवश्यक आहे. आणि गहाळ डेटासाठी, तेच T-3, ऑपरेशन्समधून रीलोड करा. परंतु हे एका स्वतंत्र लेखात वेगळे केले जाऊ शकते. गोंद ऑपरेशन्स आणि ब्रोकरेज अहवाल हे मुख्य बारकावे तुम्हाला भेटतील.
- जर आज तुम्हाला आवश्यक तारखांसाठी ब्रोकरेज अहवाल आणि व्यवहार प्राप्त झाले तर ते सर्व डेटाबेसमध्ये ठेवा, नंतर कोणतीही समस्या नाही.
- जेव्हा तुम्हाला अहवाल आणि ऑपरेशन्समधून डेटाचा पुढील भाग प्राप्त होईल आणि ते विद्यमान डेटाबेससह सिंक्रोनाइझ करण्याचा निर्णय घ्याल तेव्हा तुम्हाला उद्या समस्या असतील.
- प्रक्रिया केल्यानंतर आयडी न जुळणे किंवा बदलणे याबद्दल बरेच बारकावे
- मग ओटीसी मार्केटसाठी, आयडी अजिबात जुळत नाही.
- तसेच सिंक्रोनाइझिंग इन्स्ट्रुमेंट्सच्या बारकावे, जे पुन्हा एपीआयच्या वैशिष्ट्यांमुळे जुळत नाहीत. पण ती दुसरी कथा आहे.
चला आमच्या ऍप्लिकेशनमध्ये ऑपरेशन्सबद्दल माहिती मिळवूया. डेटावर प्रक्रिया आणि साठवणूक कोठे केली जाईल हा मुख्य प्रश्न असेल.
- तुम्ही ते स्वतःसाठी केल्यास, तुम्ही वेगवेगळ्या डिव्हाइसेसवरून समान डेटा वापराल. मग तुम्हाला सर्व्हरवर डेटावर प्रक्रिया करणे आणि संग्रहित करणे आवश्यक आहे.
- जर तुमच्याकडे बर्याच वेगवेगळ्या वापरकर्त्यांद्वारे भरपूर भिन्न डेटा वापरला गेला असेल, तर तुम्हाला अधिक महत्त्वाचे काय आहे हे ठरविणे आवश्यक आहे: वापरकर्त्यांचा वेग किंवा तुमच्या बाजूला लोखंडाची बचत. ज्याला अपरिमित हार्डवेअर परवडेल तो त्याच्या सर्व्हरवर सर्व काही मोजतो आणि वापरकर्त्यांसाठी ते सुपर फास्ट बनवतो, वापरकर्ता संसाधने जतन करतो, जसे की बॅटरी आणि ट्रॅफिक, जे फोनवर खूप महत्वाचे आहे.
या बदल्यात, ब्राउझरमध्ये मोजणे हे तत्त्वतः सर्वात इष्टतम उपाय नाही. म्हणून, जे महाग नाही ते आम्ही आमच्या सर्व्हरवर विचार करतो. आम्ही उर्वरित क्लायंटवर सोडतो. मला खरोखर सर्व्हरवरील कमिशन घ्यायचे आहे आणि मोजायचे आहे. पण इथे “इंटरएक्टिव्हिटी” नावाची सूक्ष्मता येते. समजा तुमच्याकडे हजारो ऑपरेशन्स आहेत आणि ती प्राप्त करण्यासाठी पाच मिनिटे लागतात. यावेळी वापरकर्त्याकडे काय असेल? स्पिनर? प्रगती? किती अपलोड केले याबद्दल माहिती द्या? जेव्हा प्रक्रियेतील वापरकर्ता आधीच काहीतरी पाहू शकतो तेव्हा “सक्रिय प्रतीक्षा” वापरणे आदर्श आहे. हा निकाल आहे:
- पृष्ठ लोड होत आहे
- सर्व पावत्या मागितल्या आहेत
- त्यानंतर, अंमलात आणलेल्या व्यवहारांसाठी कमिशनसह सर्व व्यवहार सर्व खात्यांसाठी विनंती केली जातात. डेटा प्राप्त होताच, तो ब्राउझरमध्ये प्रस्तुत केला जातो.
प्रत्येक वेळी इव्हेंटमधील डेटा फिल्टर न करण्यासाठी, आम्ही प्रत्येक खात्यासाठी आमचा स्वतःचा इव्हेंट काढतो. याप्रमाणे:
socket.emit(‘sdk:getOperationsCommissionResult_’ + accountId, { आयटम: डेटा?. आयटम, प्रगती: बुलियन(नेक्स्ट कर्सर), });
लॉन्च करण्यासाठी मसुदा येथे आहे: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 पुढे जात आहे. तुम्ही ही ओळ वाचली हे छान आहे!
स्वारस्य असलेल्या माहितीची गणना आणि आउटपुट
कोणाला कोणती माहिती हवी आहे यावर अवलंबून आहे. म्हणून, मी तुम्हाला ताबडतोब मुख्य बारकावे सांगतो ज्याचा तुम्हाला सामना करावा लागेल.
किंमतीसह कार्य करणे
फायनान्समध्ये काम करणार्या प्रत्येकाला हे माहीत आहे की पैशाचे व्यवहार फक्त पूर्ण संख्येनेच केले पाहिजेत. दशांश बिंदूनंतरच्या मूल्यांच्या अयोग्यतेमुळे आणि मोठ्या संख्येने ऑपरेशन्ससह संचयी त्रुटी. म्हणूनच सर्व किंमती खालील मनीव्हॅल्यू फॉरमॅटमध्ये सादर केल्या आहेत
फील्ड | प्रकार | वर्णन |
---|---|---|
चलन | स्ट्रिंग | स्ट्रिंग ISO चलन कोड |
युनिट्स | int64 | बेरीजचा पूर्णांक भाग, ऋण संख्या असू शकते |
नॅनो | int32 | रकमेचा अंशात्मक भाग, ऋण संख्या असू शकतो |
आम्ही त्यांच्यावर स्वतंत्रपणे प्रक्रिया करतो, नंतर त्यांना किंमत मूल्यावर आणतो:
quotation.units + quotation.nano / 1e9
फ्युचर्स कॉन्ट्रॅक्टची किंमत
फ्युचर्सची किंमत पॉइंट्समध्ये सादर केली जाते, जेव्हा तुमच्याकडे चलन भविष्य असेल तेव्हा तुम्हाला दर माहित असणे आवश्यक आहे. आणि अर्थातच गुणांमध्ये किंमत आणि किंमत पायरी. आपण व्यवहार पासून नफा गणना तेव्हा, हे शूट करू शकता, कारण. जर तुम्ही किंमतीला प्रमाणाने गुणाकार करून एकूण रक्कम मोजली. येथे आपण सावध असणे आवश्यक आहे. आत्तासाठी, ते कसे होते ते आपण पाहू. हे चलन फ्युचर्सवर लागू होते, इतर ठिकाणी यासह सर्व काही ठीक आहे.
ओटीसी मार्केट
या मार्केटमध्ये बरीच वैशिष्ठ्ये आहेत, म्हणून त्यावरील ऑपरेशन्सचा स्वतंत्रपणे अभ्यास करूया. जेव्हा तुम्ही ऑपरेशन्स सिंक्रोनाइझ करणे सुरू करता तेव्हा असे दिसून येईल की इन्स्ट्रुमेंट योग्यरित्या जुळण्यासाठी तुम्हाला फिगी / टिकर समान स्वरूपात आणणे आवश्यक आहे. जेव्हा तुम्ही हे ब्रोकरेज अहवालासोबत सिंक्रोनाइझ करणे सुरू कराल, तेव्हा असे दिसून येईल की समान व्यवहाराच्या ट्रेडआयडीला व्यवहाराच्या सुरुवातीला अक्षरे आहेत आणि ती ब्रोकरेज अहवालात नाहीत. त्यामुळे त्यांची तुलना करता येत नाही… अहेम-अहेम… तुलनेने! मी ट्रेड टाइम, टिकर आणि एक ट्रेडआयडी दुसर्यामध्ये आहे हे जुळवले. बरोबर, मला माहीत नाही. ज्याला याचा सामना करावा लागतो आणि ज्याला त्याची काळजी आहे, या समस्येवर या किंवा नवीन सुरू करा.
साधनांवर गणितीय क्रिया
संपूर्ण यादीसह गणितीय क्रिया न पाहता, अशक्य आहे. उबदार ते मऊ जोडू नये म्हणून, आम्ही नेहमी चलन तपासतो आणि चलन जुळत असल्याची खात्री असल्यासच प्रक्रिया करतो आणि गुण इच्छित चलनात रूपांतरित केले जातात. बँक क्रमांकांसह कार्य करण्याच्या ज्ञानासह, आम्ही प्रत्येक खात्यावर खर्च केलेल्या कमिशनची गणना करू. याप्रमाणे: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4
मायक्रो सर्व्हिस तयार आहे!
https://github.com/pskucherov/tcsstat गृहपाठ म्हणून, सेवा धीमे कनेक्शनसह कार्य करते का, कनेक्शन तुटलेले असताना, इंटरनेट डिस्कनेक्ट केल्यावर, ब्रोकरच्या बाजूने त्रुटी किंवा कालबाह्य मर्यादा असताना तुम्ही तपासू शकता.
भविष्यासाठी निष्कर्ष आणि योजना
- मूलभूत ऑपरेशन्स आणि इन्व्हेस्ट API सह काम करण्याबद्दल जाणून घेतले
- वेळ ~ 10 तास घालवला
- अडचण पातळी ~ कनिष्ठ + / निम्न मध्यम
तुम्ही मायक्रोसर्व्हिस रिफाइन करत राहिल्यास, तुम्हाला असे काहीतरी मिळू शकते
https://opexbot.info
हा माझा विकास आहे, ज्यांना समजण्यात खूप आळशी आहेत, धावत आहेत आणि स्वतःच मोजतात. मी वापरकर्त्यांच्या विनंतीनुसार तेथे विश्लेषणे जोडण्याची योजना आखत आहे. जर तुम्हाला लेख आवडला असेल तर माझ्या टेलिग्राम चॅनेलची सदस्यता घ्या .
Полезная статья. Не могу представить, сколько усилий автора потребовалось, чтобы все описать. Благодарю.