Ada Broker Rusia - Tinkoff Bank. Sekarang inilah masalahnya: broker tidak mendukung take profit dan stop loss order. Sama sekali. Jika Anda ingin merasa lebih nyaman saat berdagang, maka Anda perlu beberapa solusi untuk situasi ini, sampai pengembang Tinkoff Bank akhirnya merilis pesanan tersebut sebagai fitur pembunuh. Dalam artikel ini, saya akan menunjukkan solusi untuk Anda.
pembaruan: 2019-03-22, platform Broker yang diterbitkan 3.0.0 (pembaruan utama) di Google Play. Fitur changelog menerima pesanan untung / rugi
Mengapa saya memutuskan untuk mengirim artikel di sini? Saya memiliki asumsi, bahwa Tinkoff Bank dan produknya cukup populer di kalangan kerumunan TI di Rusia dan mungkin beberapa dari mereka memiliki kebutuhan yang sama tetapi tidak memiliki cukup waktu atau kemauan untuk mengembangkan solusi sementara sendiri. Itu sebabnya saya membagikan solusi dan sejarah solusi saya.
Di sini saya harus mengatakan sesuatu tentang penyelesaian, yang disediakan oleh broker. Pertama, broker memiliki limit order. Fitur ini dirilis pada Februari 2019 (dan klien menunggu selama hampir dua tahun). Mereka menampilkan bekerja dalam satu hari perdagangan. Jadi, Anda perlu setiap hari perdagangan mengaturnya kembali. Satu cacat lagi: Anda tidak dapat menetapkan batas seperti yang Anda inginkan. Ada beberapa kisaran harga dan Anda tidak dapat membuat batas pesanan dengan harga di luar kisaran. Dan kisaran ini sangat sempit. Di pasar yang fluktuatif, itu membuat Anda merasa tidak nyaman. Akhirnya, Anda tidak dapat membuat dua pesanan multidireksional (dalam kasus saya, bahkan pesanan batas pertama menyebabkan crash instan aplikasi seluler broker dan situs broker tidak menyediakan fitur ini).
Kedua, aplikasi seluler broker menyediakan fitur: Anda dapat berlangganan perubahan harga aset. Jika ambang (absolut, harga, atau relatif, dalam persentase) dilewati, Anda akan mendapatkan pemberitahuan. Tetapi sekali lagi, Anda tidak dapat membuat dua ambang batas untuk aset.
Solusi saya cukup sederhana:
- kami memiliki ambang batas untuk suatu aset. Kami menghitung ambang sendiri. Jika ambang batas dilewati, kami membuat tindakan manual: menjual atau membeli untuk mendapatkan, sebagai akibatnya, untung atau rugi.
- kita harus mendapatkan sumber data, untuk mendapatkan harga aset yang sebenarnya
- jika ambang dilewati, kami harus mengirim pemberitahuan.
Meskipun terlihat cukup sederhana, ada beberapa detail dalam solusi saya yang ingin saya bagikan dan diskusikan.
1. Meskipun portofolio sekuritas saya memiliki satu aset, ambang batas didefinisikan dalam skrip, dan pencarian saham dibuat sederhana, sederhana dan tidak dapat dikonfigurasi sama sekali. Itu adalah solusi yang buruk, tetapi cepat dan menunjukkan bahwa ide itu benar. Ketika saya mendapatkan aset baru dalam portofolio saya membuat memuat nama, pertukaran, ambang batas dari file.
2. Aset pertama saya adalah saham asing, dan saham asing hanya bisa dibeli atau dijual di bursa Saint-Petersburg. Serbuan pertama saya adalah mengurai situs
pertukaran SPb .
Ada semacam volume yang menurun, jadi mudah untuk diuraikan, karena aset saya selalu ada di halaman pertama. Tapi 8 Maret itu rusak. Saya tidak tahu mengapa, tetapi TSLA muncul di halaman ke-25. Paginator mereka menggunakan JavaScript untuk mengunduh data halaman. Ada solusi langsung: unduh dan parsing semua halaman dan temukan asetnya. Tetapi perlu banyak waktu untuk mengunduh dan mengurai 25+ halaman dalam setiap loop.
Alih-alih, saya memutuskan untuk menambahkan sebagai sumber data lain situs tradingview.com. Tidak perlu menguraikan banyak halaman untuk menemukan stok Anda, karena setiap aset memiliki halamannya sendiri, seperti ini:
www.tradingview.com/symbols/NASDAQ-TSLASaya berasumsi, bahwa sekarang masalah saya sudah hilang, tetapi saya salah. Data pada halaman memuat dan memperbarui hanya dengan JS. Jadi, Permintaan yang saya gunakan untuk mengunduh halaman gagal.
Untuk masalah ini saya tahu tiga solusi berbeda:
PyQT, selenium (webdriver) dan ekstensi Permintaan-HTML. Karena saya sudah memiliki modul Permintaan di proyek saya, saya memutuskan untuk menggunakan Permintaan-HTML.
Untuk kekecewaan saya yang kuat, itu tidak terlalu stabil, sampai saya menemukan beberapa petunjuk tentang StackOverFlow dan semacamnya.
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()
Perhatikan batas waktu, juga untuk kedua panggilan dekat (). Sebagian besar contoh tidak memiliki perincian ini, dan bisa menimbulkan beberapa masalah.
3. Sekarang, ketika kita telah mengunduh halaman dengan data JS, menguraikannya dan memutuskan, apakah kita perlu mengirim pemberitahuan, hanya ada pertanyaan: 'Bagaimana cara kita mengirim pemberitahuan?'. Dalam kasus saya, sms.ru menawarkan API yang nyaman dan 5 SMS gratis per hari. Mendaftar di gerbang SMS. Buat kunci API. Kuncinya kira-kira seperti ini:
24A41EA5-EEEE-CCCC-5555-094143C2EDDD
Mengirim fungsi SMS dari versi solusi saya sebelumnya:
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)
Ini bekerja dengan baik. Saya menemukan pertanyaan: bagaimana jika kami sudah mengirim SMS. Versi pertama tidak memiliki pemeriksaan apa pun, sehingga mengirim SMS dalam setiap loop. Lagi dan lagi.
Saya menambahkan penghitung SMS, yang diperiksa skrip sebelum menelepon send_message.
global sms_counter sms_counter = sms_counter + 1
Oke, kita mengerti. Tetapi ketika hari baru muncul, timbul masalah baru: bagaimana cara menyiram SMS counter? Atau, sebenarnya kapan? Saya melihat tiga cara berbeda: menyimpan penghitung di DB (tapi solusi saya, untuk saat ini, adalah stateless), parse tanggal / waktu untuk menyiram penghitung antara hari perdagangan dan restart skrip di beberapa titik antara dua hari perdagangan. Untuk saat ini, saya menerapkan varian terbaru, tetapi di masa depan, saya dapat mengubahnya.
Solusi saya sekarang berfungsi, Anda dapat mengunduhnya dari
GitHub .
Untuk pengguna, yang tidak tahu cara menangani skrip Python, saya menawarkan
solusi paket untuk Windows (milik PyInstaller).
TODO:
- parse waktu tanggal untuk menyiram penghitung SMS alih-alih memulai kembali skrip;
- untuk sekarang ini adalah aplikasi stateless, saya ingin menambahkan DB;
- setelah # 2, akan lebih baik untuk melacak kenaikan besar atau penurunan harga aset (relatif terhadap harga penutupan hari perdagangan sebelumnya);
- perluas jalur komunikasi (Telegram, Viber, panggilan suara) dan penyedia (untuk tujuan keandalan, saya ingin menambahkan smsc.ru SMS-gate, karena sms.ru terkadang macet dan tidak mengembalikan sms_response, meskipun SMS dikirim).