Existe un corredor de ese tipo: Tinkoff Bank. Y hay un problema en el hecho de que en este momento este corredor no tiene 贸rdenes de tomar ganancias / detener p茅rdidas. Por lo tanto, si desea comerciar m谩s activamente, entonces necesita crear alg煤n tipo de soluci贸n temporal, mientras que en las profundidades de los programadores de Tinkoff se desarrolla una caracter铆stica asesina para tomar ganancias / detener p茅rdidas, y debajo del corte es una de ellas.
actualizaci贸n: 22/03/2019, El corredor lanz贸 la versi贸n principal 3.0.0 en Google Play, en la que todav铆a aparec铆a tomar ganancias / detener p茅rdidas.
驴Por qu茅 decid铆 escribir este art铆culo aqu铆? Me pareci贸 que Tinkoff Bank y sus productos son bastante populares entre las personas de TI, y tal vez alguien tiene la misma necesidad, pero no hay deseo ni tiempo para montar una bicicleta. Por lo tanto, comparto mi.
Para empezar, acerca de las oportunidades alternativas proporcionadas por el corredor mismo.
Primero, Tinkoff tiene 贸rdenes limitadas que aparecieron en febrero de 2019 (隆esperaron dos a帽os, no es broma!), Pero funcionan dentro de un d铆a y, lo que es peor, en un peque帽o intervalo de dinero, lo que crea inconvenientes en el vol谩til mercado. Es simplemente imposible establecer valores menores (m谩s) que un cierto umbral calculado a partir de las cotizaciones actuales. Bueno, probablemente sea imposible solicitar m谩s de una orden de l铆mite (cuando trato de guardar la primera orden, la aplicaci贸n m贸vil siempre falla, pero el sitio no tiene esa funcionalidad).
En segundo lugar, dentro de su aplicaci贸n m贸vil, puede suscribirse a un cambio de precio estableciendo un umbral absoluto o umbral para un cambio porcentual (aumento o disminuci贸n), pero puede establecer uno y solo un umbral por activo.
La l贸gica de mi bicicleta es simple:
1) tenemos umbrales (en adelante, umbrales) para nuestra seguridad (activo), en los cuales debemos tener una acci贸n de toma de ganancias / stop loss manual. Los umbrales se calculan de forma independiente, en funci贸n del precio de compra del activo;
2) necesitamos analizar los datos del precio actual del activo desde alg煤n lugar;
3) env铆ese un aviso si se ha alcanzado uno de los umbrales.
A pesar de la descripci贸n directa, hay matices en la implementaci贸n :)
1) Si bien mi cartera constaba de un activo, establec铆 umbrales directamente en el cuerpo del gui贸n, y la b煤squeda en papel no se hizo ni siquiera una variable, sino simplemente una l铆nea m谩gica. Mala decisi贸n, pero suficiente para probar la idea. A medida que la cartera se diversific贸, hice un archivo donde se cargan los valores, los intercambios en los que se negocian y los valores umbral.
2) Dado que mi activo era una seguridad extranjera que cotiza en la Bolsa de San Petersburgo, primero decid铆 analizar los datos del sitio web de la Bolsa de San Petersburgo desde la siguiente p谩gina:
spbexchange.ru/ru/market-data/Default.aspxLa clasificaci贸n en la Bolsa de Valores de San Petersburgo se realiza de acuerdo con el volumen de negociaci贸n, y mi seguridad siempre estuvo en la primera p谩gina. Funcion贸 muy bien, pero el 8 de marzo todo se rompi贸. Por alguna raz贸n, TSLA ya estaba en la p谩gina 25, y su paginador carga los datos din谩micamente a trav茅s de JS. Este problema se puede resolver "de frente": analizando todas las p谩ginas hasta que encontremos nuestro activo. Pero este enfoque no es muy efectivo si consideramos el tiempo de ejecuci贸n del bucle de script. En cambio, decid铆 agregar el an谩lisis de tradingview.com. No hay necesidad de palear largas listas en m谩s p谩ginas. All铆, cada activo tiene algo como este enlace:
www.tradingview.com/symbols/NASDAQ-TSLAMe pareci贸 que todo deber铆a comenzar de forma r谩pida y sencilla, pero hab铆a un problema: los datos que me interesan se cargan a trav茅s de JS y las solicitudes habituales no pod铆an hacer frente.
Este problema tiene tres soluciones que conozco:
PyQT, selenium (webdriver) y la extensi贸n Requests-HTML. Como ya ten铆a Solicitudes en el proyecto, se decidi贸 usar su propia extensi贸n.
Desafortunadamente, esta soluci贸n no funcion贸 muy estable, tuve que buscar soluciones.
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()
Tenga en cuenta el tiempo de espera, as铆 como las llamadas al m茅todo close (). No se encuentran en todos los ejemplos, pero funciona mejor con ellos que sin ellos.
3) Nos registramos en un servicio que puede enviar SMS (sms.ru), tomar su API, crear una clave. Hasta 5 SMS por d铆a, sin cargo. Suficiente para mi
La clave se ve as铆:
24A41EA5-EEEE-Priv-5555-094143C2EDDD
y el env铆o de SMS en las primeras versiones se implement贸 as铆:
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)
Durante el desarrollo, surgi贸 la siguiente pregunta: 驴qu茅 hacer si ya hemos enviado un SMS al usuario acerca de cruzar el umbral? Si bien no hubo controles, envi贸 SMS nuevamente. Todo el tiempo R谩pidamente "comi贸" el l铆mite libre y comenz贸 a pensar qu茅 hacer con 茅l. Tuve que agregar un contador de SMS enviados (sms_counter), que verificamos antes de llamar a send_message.
global sms_counter sms_counter = sms_counter + 1
Se seguir谩 otra pregunta: excelente, durante la sesi贸n de negociaci贸n procesamos un cruce de umbral con un determinado activo, y esto nos conviene. 驴Qu茅 hacer para la pr贸xima sesi贸n de negociaci贸n? Se decidi贸 restablecer el contador de SMS enviados. Hab铆a tres opciones: almacenar datos en la base de datos (pero actualmente tengo una aplicaci贸n sin estado), analizar hora / fecha o reiniciar el script. Hasta ahora estoy haciendo la tercera opci贸n, pero en el futuro pasar茅 a la segunda o primera opci贸n.
Ahora la soluci贸n ya est谩 operativa y se puede descargar desde
GithubPara los usuarios que no entienden qu茅 es Python y c贸mo configurarlo, sugiero intentar lanzar una
soluci贸n empaquetada
para WindowsPlanes para un mayor desarrollo:
1) analizar fecha / hora, para restablecer el contador de SMS (en lugar de reiniciar el script);
2) ahora es una aplicaci贸n sin estado, pero tengo la intenci贸n de atornillar la base de datos;
3) despu茅s del 铆tem 2, quiero agregar el seguimiento de saltos bruscos en el aumento / disminuci贸n del precio, en relaci贸n con el precio de cierre del d铆a anterior;
4) ampliar las oportunidades de "comunicaci贸n": m谩s rutas (Telegram, Viber, llamadas de voz, otras opciones) y proveedores (tengo la intenci贸n de agregar smsc.ru, ya que sms.ru a veces pierde capacidad de respuesta, y aunque env铆a SMS, pero el script no se ejecuta m谩s hasta que obtengamos sms_response).