هناك مثل هذا الوسيط - بنك تينكوف. وهناك مشكلة في حقيقة أن هذا الوسيط لا يتلقى في الوقت الحالي أوامر الربح / وقف الخسارة. لذلك ، إذا كنت تريد التداول بشكل أكثر فاعلية ، فأنت بحاجة إلى حل نوع ما من الحلول المؤقتة ، بينما في أعماق مبرمجي Tinkoff يطورون ميزة قاتلة ، جني الأرباح / وقف الخسارة ، وتحت الحد من ذلك.
التحديث: 03/22/2019 ، طرح الوسيط الإصدار الرئيسي 3.0.0 على Google Play ، والذي لا يزال يظهر فيه جني الأرباح / وقف الخسارة.
لماذا قررت أن أكتب هذا المقال هنا؟ يبدو لي أن Tinkoff Bank ومنتجاته تحظى بشعبية كبيرة بين موظفي تكنولوجيا المعلومات ، وربما يكون لدى شخص ما نفس الحاجة ، لكن لا توجد رغبة أو وقت لركوب الدراجة. لذلك ، أشارك بلدي.
بادئ ذي بدء - حول الفرص البديلة التي يوفرها الوسيط نفسه.
أولاً ، لدى Tinkoff الطلبات المحددة التي ظهرت في فبراير 2019 (لقد انتظرت عامين ، لا توجد نكات!) ، لكنها تعمل في غضون يوم واحد ، والأسوأ من ذلك ، في فترة نقود صغيرة ، مما يخلق إزعاجًا في السوق المتقلبة. من المستحيل ببساطة تعيين قيم أقل (أكثر) من عتبة معينة محسوبة من علامات الاقتباس الحالية. حسنًا ، ربما يكون من المستحيل طلب أكثر من طلب محدد (عندما أحاول حفظ الطلب الأول ، يتعطل تطبيق الهاتف المحمول دائمًا ، لكن الموقع لا يتمتع بهذه الوظيفة).
ثانياً ، داخل تطبيقات الأجهزة المحمولة الخاصة بهم ، يمكنك الاشتراك في تغيير السعر عن طريق تحديد عتبة أو عتبة مطلقة لتغير النسبة المئوية (الزيادة أو النقصان) ، ولكن يمكنك تعيين عتبة واحدة فقط لكل أصل.
منطق دراجتي بسيط:
1) لدينا عتبات (من الآن فصاعدا - عتبات) لأماننا (الأصول) ، والتي يجب أن يكون لدينا إجراء جني الأرباح / وقف الخسارة. يتم حساب العتبات بشكل مستقل ، بناءً على سعر شراء الأصل ؛
2) نحتاج إلى تحليل بيانات السعر الحالي للأصل من مكان ما ؛
3) أرسل لنفسك إشعارًا إذا تم الوصول إلى أحد العتبات.
على الرغم من الوصف المباشر ، هناك فروق دقيقة في التنفيذ :)
1) على الرغم من أن ملفي يتكون من مادة عرض واحدة ، إلا أنني وضعت عتبات مباشرة في نص البرنامج النصي ، ولم يتم إجراء البحث الورقي حتى بشكل متغير ، ولكن ببساطة عبارة عن خط سحري. قرار سيء ، ولكن يكفي لاختبار الفكرة. نظرًا لتنويع الحافظة ، قمت بعمل ملف يتم فيه تحميل الأوراق المالية والبورصات التي يتم تداولها فيها وقيم العتبة.
2) نظرًا لأن الأصل الخاص بي كان
ضمانًا خارجيًا يتم تداوله في بورصة سانت بطرسبرغ ، فقد قررت أولاً تحليل البيانات من موقع بورصة سانت بطرسبرغ من الصفحة التالية:
spbexchange.ru/ru/market-data/Default.aspxيتم الفرز في بورصة سانت بطرسبرغ وفقًا لحجم التداول ، وكان أماني دائمًا في الصفحة الأولى. كان الأمر رائعًا ، لكن في الثامن من مارس (آذار) حطم كل شيء. لسبب ما ، كان TSLA موجودًا بالفعل في الصفحة 25 ، ويحمّل ترقيم الصفحات البيانات ديناميكيًا عبر JS. يمكن حل هذه المشكلة "وجهاً لوجه": تحليل جميع الصفحات حتى نكتشف أصلنا. ولكن هذا النهج ليس فعالًا جدًا ، إذا أخذنا في الاعتبار وقت تنفيذ حلقة البرنامج النصي. بدلاً من ذلك ، قررت إضافة تحليل من tradingview.com. ليست هناك حاجة لمجرفة القوائم الطويلة على المزيد من الصفحات. هناك ، كل أصل لديه شيء مثل هذا الرابط:
www.tradingview.com/symbols/NASDAQ-TSLAيبدو لي أن كل شيء يجب أن يبدأ بسرعة وبساطة ، ولكن كانت هناك مشكلة - يتم تحميل البيانات التي تهمني من خلال JS ولم تتمكن الطلبات المعتادة من التعامل معها.
هذه المشكلة لها ثلاثة حلول أعرفها:
PyQT ، السيلينيوم (webdriver) وملحق طلبات HTML. نظرًا لأنني تلقيت بالفعل طلبات في المشروع ، فقد تقرر استخدام امتداده الخاص.
لسوء الحظ ، لم يعمل هذا الحل بشكل مستقر للغاية ، واضطررت إلى البحث عن حلول.
session = HTMLSession() r = session.get(url) my = r.html.render(timeout=30) selector = 'span.tv-symbol-header-quote__value.tv-symbol-header-quote__value--large.js-symbol-last' price = r.html.find(selector)[0].text r.close() session.close()
لاحظ انتهاء المهلة ، وكذلك استدعاءات أسلوب الإغلاق (). لم يتم العثور عليها في جميع الأمثلة ، لكنها تعمل بشكل أفضل معهم من دونها.
3) نقوم بالتسجيل في خدمة يمكنها إرسال الرسائل القصيرة (sms.ru) ، واتخاذ API الخاصة بهم ، وإنشاء مفتاح. حتى 5 رسائل نصية في اليوم - مجانًا. يكفي لي.
المفتاح يشبه هذا:
24A41EA5-EEEE-Priv-5555-094143C2EDDD
وقد تم تنفيذ إرسال الرسائل القصيرة في الإصدارات الأولى مثل هذا:
def send_message(mymessage): sms_url = 'https://sms.ru/sms/send?api_id=key&to=number&msg=message&json=1' sms_url = sms_url.replace('key', mykey) sms_url = sms_url.replace('number', mynumber) sms_url = sms_url.replace('message', mymessage) sms_response = requests.get(sms_url)
أثناء التطوير ، نشأ السؤال التالي: ماذا تفعل إذا أرسلنا بالفعل رسالة نصية قصيرة للمستخدم عن عبور العتبة؟ على الرغم من عدم وجود شيكات ، إلا أنها أرسلت رسالة قصيرة ثانية. كل مرة بسرعة "أكل" الحد الحر وبدأت في التفكير فيما يجب القيام به. اضطررت إلى إضافة عداد للرسائل القصيرة المرسلة (sms_counter) ، والتي نتحقق منها قبل الاتصال بـ send_message.
global sms_counter sms_counter = sms_counter + 1
سيتم طرح سؤال آخر: ممتاز ، خلال جلسة التداول ، نعالج عتبة واحدة مع أحد الأصول ، وهذا يناسبنا. ماذا تفعل لجلسة التداول القادمة؟ تقرر إعادة تعيين عداد الرسائل القصيرة المرسلة. كانت هناك ثلاثة خيارات: لتخزين البيانات في قاعدة البيانات (لكن لدي حاليًا تطبيق بدون جنسية) ، أو تحليل الوقت / التاريخ أو إعادة تشغيل البرنامج النصي. أقوم حتى الآن بالخيار الثالث ، لكن في المستقبل سأنتقل إلى الخيار الثاني أو الأول.
الآن الحل قيد التشغيل بالفعل ، ويمكن تنزيله من
Githubبالنسبة إلى المستخدمين الذين لا يفهمون ماهية Python وكيفية تهيئته ، أقترح محاولة بدء تشغيل
حل مُحزم
لنظام Windowsخطط لمزيد من التطوير:
1) تحليل التاريخ / الوقت ، لإعادة تعيين عداد الرسائل القصيرة (بدلاً من إعادة تشغيل البرنامج النصي) ؛
2) الآن هو تطبيق عديم الجنسية ، لكنني أنوي أن المسمار قاعدة البيانات ؛
3) بعد البند 2 ، أريد أن أضيف تتبع القفزات الحادة في زيادة / انخفاض الأسعار ، نسبةً إلى سعر الإغلاق في اليوم السابق ؛
4) توسيع فرص "الاتصال": المزيد من المسارات (Telegram و Viber والمكالمات الصوتية وخيارات أخرى) ومقدمو الخدمات (أنوي إضافة smsc.ru ، لأن sms.ru يفقد الاستجابة في بعض الأحيان ، وعلى الرغم من أنه يرسل رسائل نصية قصيرة ، إلا أنه لم يتم تنفيذ البرنامج النصي كذلك حتى نحصل على sms_response).