Es gibt einen russischen Broker - Tinkoff Bank. Hier ist das Problem: Der Broker unterstützt keine Take-Profit- und Stop-Loss-Aufträge. Überhaupt nicht. Wenn Sie sich beim Handeln wohler fühlen möchten, benötigen Sie eine Problemumgehung für diese Situation, bis die Entwickler der Tinkoff Bank diese Aufträge endgültig als Killer-Feature veröffentlichen. In dem Artikel werde ich Ihnen meine Problemumgehung zeigen.
Update: 2019-03-22, veröffentlichte der Broker die Plattform 3.0.0 (ein wichtiges Update) in Google Play. Die Changelog-Funktionen nehmen Gewinn- / Stop-Loss-Aufträge entgegen
Warum habe ich beschlossen, den Artikel hier zu posten? Ich gehe davon aus, dass die Tinkoff Bank und seine Produkte bei IT-Kunden in Russland sehr beliebt sind und wahrscheinlich einige von ihnen denselben Bedarf haben, aber nicht genügend Zeit oder Bereitschaft haben, eine eigene vorübergehende Problemumgehung zu entwickeln. Deshalb teile ich meine Lösung und die Geschichte der Lösung.
Hier sollte ich etwas zu Problemumgehungen sagen, die vom Broker bereitgestellt werden. Erstens hat der Broker Limit Orders. Das Feature wurde im Februar 2019 veröffentlicht (und die Kunden haben fast zwei Jahre darauf gewartet). Sie arbeiten innerhalb eines Handelstages. Sie müssen sie also an jedem Handelstag neu einstellen. Noch ein Fehler: Sie können keine Grenzen setzen, wie Sie möchten. Es gibt eine Preisspanne und Sie können keine Limit-Bestellung mit einem Preis außerhalb der Bandbreite aufgeben. Und dieser Bereich ist extrem eng. In einem volatilen Markt fühlen Sie sich unwohl. Schließlich können Sie nicht zwei multidirektionale Bestellungen erstellen (in meinem Fall führt sogar die erste Limit-Bestellung zu einem sofortigen Absturz der mobilen Broker-App, und die Broker-Site bietet diese Funktion nicht).
Zweitens bietet die mobile App des Brokers eine Funktion: Sie können die Preisänderung des Assets abonnieren. Wenn der Schwellenwert (absolut, im Preis oder relativ, in Prozent) überschritten wird, erhalten Sie eine Benachrichtigung. Sie können jedoch auch hier keine zwei Schwellenwerte für das Asset erstellen.
Meine Problemumgehung ist ganz einfach:
- Wir haben Schwellenwerte für einen Vermögenswert. Wir berechnen die Schwellenwerte selbst. Wenn Schwellenwerte überschritten werden, führen wir eine manuelle Aktion durch: Verkaufen oder Kaufen, um als Ergebnis Gewinn oder Verlust zu erzielen.
- Wir sollten eine Datenquelle erhalten, um den Preis des tatsächlichen Vermögenswerts zu erhalten
- Wenn der Schwellenwert überschritten wird, sollten wir eine Benachrichtigung senden.
Obwohl es einfach genug aussieht, enthält meine Lösung einige Details, die ich teilen und diskutieren möchte.
1. Während mein Wertpapierportfolio über einen Vermögenswert verfügte, wurden im Skript Schwellenwerte definiert, und die Aktiensuche wurde einfach, einfach und überhaupt nicht konfigurierbar durchgeführt. Es war eine schlechte Lösung, aber schnell und zeigte, dass die Idee richtig war. Wenn ich neue Assets im Portfolio habe, habe ich Aktiennamen, Börsen und Schwellenwerte aus einer Datei geladen.
2. Mein erster Vermögenswert war eine ausländische Aktie, und die ausländische Aktie konnte nur an der Börse in Sankt Petersburg gekauft oder verkauft werden. Mein erster Ansturm war es,
die Site der
SPb-Börse zu analysieren.
Es gibt eine absteigende Volumensortierung, daher war das Parsen einfach, da sich mein Asset immer auf der ersten Seite befand. Aber am 8. März war es kaputt. Ich weiß nicht warum, aber TSLA tauchte auf einer 25. Seite auf. Ihr Paginator verwendet JavaScript, um die Daten der Seiten herunterzuladen. Es gibt eine klare Lösung: Laden Sie alle Seiten herunter, analysieren Sie sie und suchen Sie das Asset. Das Herunterladen und Parsen von mehr als 25 Seiten in jeder Schleife erfordert jedoch zu viel Zeit.
Stattdessen habe ich beschlossen, die Website tradeview.com als weitere Datenquelle hinzuzufügen. Es ist nicht erforderlich, viele Seiten zu analysieren, um Ihren Bestand zu finden, da jedes Asset eine eigene Seite hat, wie diese:
www.tradingview.com/symbols/NASDAQ-TSLAIch nahm an, dass jetzt meine Probleme weg sind, aber ich habe mich geirrt. Die Daten auf den Seiten werden nur mit JS geladen und aktualisiert. Anfragen, die ich zum Herunterladen von Seiten verwendet habe, sind fehlgeschlagen.
Für dieses Problem kenne ich drei verschiedene Lösungen:
PyQT, Selen (Webdriver) und eine Erweiterung Requests-HTML. Da ich bereits ein Anforderungsmodul in meinem Projekt habe, habe ich mich für Requests-HTML entschieden.
Für meine starke Enttäuschung war es nicht sehr stabil, bis ich einige Hinweise auf StackOverFlow und so fand.
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()
Achten Sie auf das Timeout sowie auf beide close () -Aufrufe. Den meisten Beispielen fehlen diese Details, und es können einige Probleme auftreten.
3. Wenn wir nun Seiten mit JS-Daten heruntergeladen, analysiert und entschieden haben, ob wir eine Benachrichtigung senden müssen, gibt es nur die Frage: "Wie senden wir eine Benachrichtigung?". In meinem Fall bietet sms.ru eine praktische API und 5 kostenlose SMS pro Tag. Melden Sie sich an einem SMS-Gate an. Erstellen Sie einen API-Schlüssel. Der Schlüssel so etwas:
24A41EA5-EEEE-CCCC-5555-094143C2EDDD
Senden einer SMS-Funktion aus einer früheren Version meiner Lösung:
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)
Es funktioniert gut. Ich bin auf die Frage gestoßen: Was ist, wenn wir bereits eine SMS gesendet haben? In der ersten Version fehlen Überprüfungen, daher wird innerhalb jeder Schleife eine SMS gesendet. Immer wieder.
Ich habe einen SMS-Zähler hinzugefügt, den das Skript überprüft, bevor send_message aufgerufen wird.
global sms_counter sms_counter = sms_counter + 1
Okay, wir haben es verstanden. Aber wenn ein neuer Tag auftaucht, taucht ein neues Problem auf: Wie spült man den SMS-Zähler? Oder eigentlich wann? Ich sehe drei verschiedene Möglichkeiten: Speichern des Zählers in der Datenbank (aber meine Lösung ist derzeit zustandslos), Analysieren von Datum und Uhrzeit, um den Zähler zwischen Handelstagen zu leeren und das Skript irgendwann zwischen zwei Handelstagen neu zu starten. Im Moment habe ich die neueste Variante implementiert, aber in Zukunft kann ich sie ändern.
Meine Lösung funktioniert jetzt. Sie können sie von
GitHub herunterladen.
Für Benutzer, die nicht wissen, wie sie mit Python-Skripten umgehen sollen, biete ich eine Paketlösung
für Windows an (mit freundlicher Genehmigung von PyInstaller).
TODOs:
- Analysieren Sie die Datums- und Uhrzeit, um die SMS-Zähler zu leeren, anstatt das Skript neu zu starten.
- Im Moment ist es die zustandslose Anwendung. Ich möchte eine Datenbank hinzufügen.
- Nach # 2 wäre es schön, einen starken Anstieg oder Rückgang des Preises des Vermögenswerts (im Vergleich zum Schlusskurs des vorherigen Handelstages) zu verfolgen.
- Erweitern Sie Kommunikationspfade (Telegramm, Viber, Sprachanrufe) und Anbieter (aus Gründen der Zuverlässigkeit möchte ich smsc.ru SMS-gate hinzufügen, da sms.ru manchmal hängen bleibt und sms_response nicht zurückgibt, obwohl SMS gesendet wird).