Comment faire une béquille pour Tinkoff Investments de vos propres mains ou des notifications d'action nécessaires pour prendre des bénéfices / stop loss

Il y a un tel courtier - Tinkoff Bank. Et il y a un problème dans le fait que pour le moment ce courtier n'a pas d'ordres de profit / stop loss. Par conséquent, si vous voulez trader plus activement, vous devez béquiller une sorte de solution temporaire, tandis que dans les profondeurs des programmeurs Tinkoff développent une fonctionnalité de tueur, prenez profit / stop loss, et sous la coupe est l'un d'entre eux.
mise à jour: 22/03/2019, le courtier a déployé la version majeure 3.0.0 sur Google Play, dans laquelle le profit / stop loss est toujours apparu.

Pourquoi ai-je décidé d'écrire cet article ici? Il m'a semblé que Tinkoff Bank et ses produits sont très populaires auprès des informaticiens, et peut-être que quelqu'un a le même besoin, mais il n'y a ni envie ni temps de mettre un vélo. Par conséquent, je partage mon.

Pour commencer - sur les opportunités alternatives offertes par le courtier lui-même.
Tout d'abord, Tinkoff a des ordres à cours limité qui sont apparus en février 2019 (ils ont attendu deux ans, pas de blagues!), Mais ils travaillent dans la journée et, pire, dans un petit intervalle d'argent, ce qui crée des désagréments sur le marché volatil. Il est tout simplement impossible de définir des valeurs inférieures (plus) à un certain seuil calculé à partir des devis actuels. Eh bien, il est probablement impossible de demander plusieurs commandes à cours limité (lorsque j'essaie d'enregistrer la première commande, l'application mobile se bloque toujours, mais le site n'a pas une telle fonctionnalité).
Deuxièmement, dans leur application mobile, vous pouvez vous abonner à une modification de prix en définissant un seuil absolu ou un seuil pour une variation en pourcentage (augmentation ou diminution), mais vous pouvez définir un et un seul seuil par actif.

La logique de mon vélo est simple:
1) nous avons des seuils (ci-après - seuils) pour notre sécurité (actif), sur lesquels nous devons avoir une action manuelle de prise de bénéfices / stop loss. Les seuils sont calculés indépendamment, sur la base du prix d'achat de l'actif;
2) nous devons analyser les données du prix actuel de l'actif quelque part;
3) vous envoyer un avis si l'un des seuils a été atteint.
Malgré la description simple, il existe des nuances dans la mise en œuvre :)

1) Alors que mon portefeuille ne comprenait qu'un seul actif, j'ai défini des seuils directement dans le corps du script, et la recherche sur papier n'a pas été faite même une variable, mais simplement une ligne magique. Mauvaise décision, mais suffisante pour tester l'idée. Au fur et à mesure que le portefeuille se diversifiait, j'ai créé un fichier d'où les titres sont chargés, les bourses sur lesquelles ils sont négociés et les valeurs de seuil.

2) Étant donné que mon actif était un titre étranger négocié à la bourse de Saint-Pétersbourg, j'ai d'abord décidé d'analyser les données du site Web de la bourse de Saint-Pétersbourg à partir de la page suivante: spbexchange.ru/ru/market-data/Default.aspx
Le tri à la Bourse de Saint-Pétersbourg a lieu en fonction du volume des transactions et ma sécurité a toujours été en première page. Cela a très bien fonctionné, mais le 8 mars, tout s'est cassé. Pour une raison quelconque, TSLA était déjà à la page 25 et leur paginateur charge les données dynamiquement via JS. Ce problème peut être résolu "de front": analyser toutes les pages jusqu'à ce que nous trouvions notre ressource. Mais cette approche n'est pas très efficace si l'on considère le temps d'exécution de la boucle de script. Au lieu de cela, j'ai décidé d'ajouter l'analyse de tradingview.com. Il n'est pas nécessaire de pelleter de longues listes sur plus de pages. Là, chaque actif a quelque chose comme ce lien:
www.tradingview.com/symbols/NASDAQ-TSLA
Il me semblait que tout devait commencer rapidement et simplement, mais il y avait un problème - les données qui m'intéressaient étaient chargées via JS et les demandes habituelles ne pouvaient pas y faire face.
Ce problème a trois solutions que je connais:
PyQT, sélénium (pilote Web) et l'extension Requests-HTML. Comme j'avais déjà des requêtes dans le projet, il a été décidé d'utiliser sa propre extension.
Malheureusement, cette solution ne fonctionnait pas très stable, j'ai dû chercher des solutions.
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() 

Notez le délai d'expiration, ainsi que les appels à la méthode close (). Ils ne sont pas trouvés dans tous les exemples, mais cela fonctionne mieux avec eux que sans eux.

3) Nous nous inscrivons sur un service qui peut envoyer des SMS (sms.ru), prendre leur API, créer une clé. Jusqu'à 5 SMS par jour - gratuitement. Assez pour moi.
La clé ressemble à ceci:
24A41EA5-EEEE-Priv-5555-094143C2EDDD
et l'envoi de SMS dans les premières versions a été implémenté comme ceci:
 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) 


Au cours du développement, la question suivante s'est posée: que faire si nous avons déjà envoyé un SMS à l'utilisateur pour franchir le seuil? Bien qu'il n'y ait eu aucun contrôle, il a de nouveau envoyé un SMS. À chaque fois. Assez rapidement «mangé» la limite de liberté et a commencé à réfléchir à ce qu'il fallait en faire. J'ai dû ajouter un compteur de SMS envoyés (sms_counter), que nous vérifions avant d'appeler send_message.

  global sms_counter sms_counter = sms_counter + 1 


Une autre question sera posée: excellent, pendant la séance de trading, nous traitons un franchissement de seuil avec un certain actif, et cela nous convient. Que faire pour la prochaine séance de trading? Il a été décidé de réinitialiser le compteur des SMS envoyés. Il y avait trois options: pour stocker des données dans la base de données (mais j'ai actuellement une application sans état), analyser l'heure / la date ou redémarrer le script. Jusqu'à présent, je fais la troisième option, mais à l'avenir, je passerai à la deuxième ou à la première option.

Maintenant, la solution est déjà opérationnelle et peut être téléchargée depuis Github
Pour les utilisateurs qui ne comprennent pas ce qu'est Python et comment le configurer, je suggère d'essayer de lancer une solution packagée pour Windows

Plans de développement:
1) analyser la date / heure, pour réinitialiser le compteur SMS (au lieu de redémarrer le script);
2) maintenant c'est une application sans état, mais j'ai l'intention de visser la base de données;
3) après l'article 2, je veux ajouter le suivi des sauts brusques dans l'augmentation / la baisse des prix, par rapport au cours de clôture de la veille;
4) étendre les opportunités de «communication»: plus de chemins (télégramme, Viber, appels vocaux, autres options) et de fournisseurs (j'ai l'intention d'ajouter smsc.ru, car sms.ru perd parfois de la réactivité, et bien qu'il envoie des SMS, mais le script n'est pas exécuté jusqu'à ce que nous obtenions sms_response).

Source: https://habr.com/ru/post/fr442734/


All Articles