Es gibt einen solchen Makler - die Tinkoff Bank. Und es gibt ein Problem in der Tatsache, dass dieser Broker derzeit keine Gewinn- / Stop-Loss-Aufträge hat. Wenn Sie also aktiver handeln möchten, müssen Sie eine vorübergehende Lösung finden, während Programmierer in den Tiefen von Tinkoff eine Killer-Funktion entwickeln, die Gewinn / Stop-Loss mit sich bringt, und unter der Kürzung ist eine davon.
Update: 22.03.2019, Der Broker hat die Hauptversion 3.0.0 auf Google Play eingeführt, in der immer noch Gewinnmitnahmen / Stop-Loss angezeigt werden.
Warum habe ich beschlossen, diesen Artikel hier zu schreiben? Es schien mir, dass die Tinkoff Bank und ihre Produkte bei IT-Mitarbeitern sehr beliebt sind, und vielleicht hat jemand das gleiche Bedürfnis, aber es gibt keinen Wunsch oder keine Zeit, ein Fahrrad anzulegen. Deshalb teile ich meine.
Zunächst - über die alternativen Möglichkeiten, die der Broker selbst bietet.
Erstens hat Tinkoff Limit Orders, die im Februar 2019 erschienen sind (sie haben zwei Jahre gewartet, keine Witze!), Aber sie arbeiten innerhalb eines Tages und, schlimmer noch, in einem kleinen Geldintervall, was zu Unannehmlichkeiten auf dem volatilen Markt führt. Es ist einfach unmöglich, Werte festzulegen, die kleiner (mehr) als ein bestimmter Schwellenwert sind, der aus aktuellen Anführungszeichen berechnet wird. Nun, es ist wahrscheinlich unmöglich, mehr als eine Limit-Bestellung anzufordern (wenn ich versuche, die erste Bestellung zu speichern, stürzt die mobile Anwendung immer ab, aber die Website verfügt nicht über solche Funktionen).
Zweitens können Sie in ihrer mobilen Anwendung eine Preisänderung abonnieren, indem Sie einen absoluten Schwellenwert oder Schwellenwert für eine prozentuale Änderung (Erhöhung oder Verringerung) festlegen. Sie können jedoch nur einen Schwellenwert pro Asset festlegen.
Die Logik meines Fahrrads ist einfach:
1) Wir haben Schwellenwerte (im Folgenden - Schwellenwerte) für unser Wertpapier (Vermögenswert), für die wir eine manuelle Gewinn- / Stop-Loss-Aktion durchführen müssen. Schwellenwerte werden unabhängig vom Kaufpreis des Vermögenswerts berechnet.
2) Wir müssen die Daten des aktuellen Preises des Vermögenswerts von irgendwoher analysieren.
3) Senden Sie sich eine Benachrichtigung, wenn einer der Schwellenwerte erreicht wurde.
Trotz der einfachen Beschreibung gibt es Nuancen in der Implementierung :)
1) Während mein Portfolio aus einem Asset bestand, habe ich Schwellenwerte direkt im Hauptteil des Skripts festgelegt, und die Papiersuche wurde nicht einmal als Variable, sondern lediglich als magische Linie durchgeführt. Schlechte Entscheidung, aber genug, um die Idee zu testen. Als sich das Portfolio diversifizierte, erstellte ich eine Datei, in der die Wertpapiere geladen wurden, an den Börsen, an denen sie gehandelt werden, und Schwellenwerte.
2) Da es sich bei meinem Vermögenswert um ein ausländisches Wertpapier handelt, das an der St. Petersburg Exchange gehandelt wird, habe ich mich zunächst entschlossen, Daten von der St. Petersburg Exchange-Website auf der folgenden Seite zu
analysieren :
spbexchange.ru/ru/market-data/Default.aspxDie Sortierung an der St. Petersburg Stock Exchange erfolgt nach dem Handelsvolumen, und meine Sicherheit war immer auf der ersten Seite. Es hat super funktioniert, aber am 8. März ist alles kaputt gegangen. Aus irgendeinem Grund befand sich TSLA bereits auf Seite 25, und der Paginator lädt die Daten dynamisch über JS. Dieses Problem kann "frontal" gelöst werden: Analysieren Sie alle Seiten, bis wir unser Asset gefunden haben. Dieser Ansatz ist jedoch nicht sehr effektiv, wenn wir die Ausführungszeit der Skriptschleife berücksichtigen. Stattdessen habe ich beschlossen, das Parsen von tradeview.com hinzuzufügen. Es ist nicht erforderlich, lange Listen auf mehr Seiten zu schaufeln. Dort hat jedes Asset so etwas wie diesen Link:
www.tradingview.com/symbols/NASDAQ-TSLAEs schien mir, dass alles schnell und einfach beginnen sollte, aber es gab ein Problem - die für mich interessanten Daten werden über JS geladen und die üblichen Anfragen konnten damit nicht fertig werden.
Dieses Problem hat drei mir bekannte Lösungen:
PyQT, Selen (Webdriver) und die Requests-HTML-Erweiterung. Da ich bereits Anfragen im Projekt hatte, wurde beschlossen, eine eigene Erweiterung zu verwenden.
Leider funktionierte diese Lösung nicht sehr stabil, ich musste nach Lösungen suchen.
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()
Beachten Sie das Timeout sowie die Aufrufe der Methode close (). Sie sind nicht in allen Beispielen zu finden, aber es funktioniert besser mit ihnen als ohne sie.
3) Wir registrieren uns bei einem Dienst, der SMS (sms.ru) senden, deren API übernehmen und einen Schlüssel erstellen kann. Bis zu 5 SMS pro Tag - kostenlos. Genug für mich.
Der Schlüssel sieht so aus:
24A41EA5-EEEE-Priv-5555-094143C2EDDD
Das Senden von SMS in den ersten Versionen wurde folgendermaßen implementiert:
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)
Während der Entwicklung stellte sich folgende Frage: Was tun, wenn wir dem Benutzer bereits eine SMS über das Überschreiten des Schwellenwerts gesendet haben? Es gab zwar keine Schecks, aber es wurde erneut eine SMS gesendet. Jedes Mal. Ziemlich schnell „aß“ man das freie Limit und begann zu überlegen, was man damit anfangen sollte. Ich musste einen Zähler für gesendete SMS (sms_counter) hinzufügen, den wir überprüfen, bevor wir send_message aufrufen.
global sms_counter sms_counter = sms_counter + 1
Eine weitere Frage wird gestellt: Hervorragend, während der Handelssitzung verarbeiten wir eine Schwellenüberschreitung mit einem bestimmten Vermögenswert, und dies passt zu uns. Was tun für die nächste Handelssitzung? Es wurde beschlossen, den Zähler der gesendeten SMS zurückzusetzen. Es gab drei Möglichkeiten: Daten in der Datenbank zu speichern (aber ich habe derzeit eine zustandslose Anwendung), Zeit / Datum zu analysieren oder das Skript neu zu starten. Bisher mache ich die dritte Option, aber in Zukunft werde ich zur zweiten oder ersten Option übergehen.
Jetzt ist die Lösung bereits betriebsbereit und kann von
Github heruntergeladen werden
Für Benutzer, die nicht verstehen, was Python ist und wie es konfiguriert wird, empfehle ich, eine Paketlösung
für Windows zu starten
Pläne für die weitere Entwicklung:
1) Datum / Uhrzeit analysieren, um den SMS-Zähler zurückzusetzen (anstatt das Skript neu zu starten);
2) Jetzt ist es eine zustandslose Anwendung, aber ich beabsichtige, die Datenbank zu verschrauben.
3) Nach Punkt 2 möchte ich die Verfolgung starker Sprünge bei Preiserhöhungen / -senkungen im Vergleich zum Schlusskurs des Vortages hinzufügen.
4) Erweitern Sie die Kommunikationsmöglichkeiten: mehr Pfade (Telegramm, Viber, Sprachanrufe, andere Optionen) und Anbieter (ich beabsichtige, smsc.ru hinzuzufügen, da sms.ru manchmal die Reaktionsfähigkeit verliert und zwar SMS sendet, das Skript jedoch nicht ausgeführt wird weiter bis wir sms_response bekommen).