Existe um corretor desse tipo - o Tinkoff Bank. E há um problema no fato de que, no momento, esse corretor não possui ordens de lucro / stop loss. Portanto, se você deseja negociar de forma mais ativa, precisa criar algum tipo de solução temporária, enquanto nas profundezas dos programadores de Tinkoff estão desenvolvendo um recurso matador, obtém lucro / stop loss e, sob esse corte, é um deles.
atualização: 22/03/2019, O corretor lançou a versão principal 3.0.0 no Google Play, na qual o lucro / stop loss ainda aparecia.
Por que eu decidi escrever este artigo aqui? Pareceu-me que o Tinkoff Bank e seus produtos são bastante populares entre as pessoas de TI, e talvez alguém tenha a mesma necessidade, mas não há desejo ou tempo para andar de bicicleta. Portanto, eu compartilho o meu.
Para começar - sobre as oportunidades alternativas oferecidas pelo próprio corretor.
Primeiro, Tinkoff tem pedidos limitados que apareceram em fevereiro de 2019 (eles esperaram dois anos, sem brincadeiras!), Mas eles trabalham em um dia e, pior ainda, em um pequeno intervalo de dinheiro, o que cria inconvenientes no mercado volátil. É simplesmente impossível definir valores menores (mais) que um determinado limite calculado a partir das cotações atuais. Bem, provavelmente é impossível definir mais de um pedido limite (quando tento salvar o primeiro pedido, o aplicativo móvel sempre falha, mas o site não possui essa funcionalidade).
Segundo, dentro do aplicativo móvel, você pode assinar uma alteração de preço definindo um limite absoluto ou limite para uma alteração percentual (aumentar ou diminuir), mas é possível definir um e apenas um limite por ativo.
A lógica da minha bicicleta é simples:
1) temos limiares (doravante - limiares) para nossa segurança (ativo), nos quais devemos ter uma ação manual de realizar lucro / parar perda. Os limites são calculados independentemente, com base no preço de compra do ativo;
2) precisamos analisar os dados do preço atual do ativo de algum lugar;
3) envie a si mesmo um aviso se um dos limites tiver sido atingido.
Apesar da descrição direta, há nuances na implementação :)
1) Embora meu portfólio consistisse em um ativo, registrei os limites diretamente no corpo do script, e a pesquisa em papel foi feita não apenas uma variável, mas simplesmente uma linha mágica. Má decisão, mas o suficiente para testar a ideia. Como a carteira diversificou, criei um arquivo de onde os títulos são carregados, as trocas nas quais são negociados e os valores-limite.
2) Como meu ativo era uma garantia estrangeira negociada na Bolsa de São Petersburgo, primeiro decidi analisar os dados do site da Bolsa de São Petersburgo na seguinte página:
spbexchange.ru/ru/market-data/Default.aspxA classificação na Bolsa de Valores de São Petersburgo ocorre de acordo com o volume de negociações, e minha segurança sempre esteve na primeira página. Funcionou muito bem, mas no dia 8 de março tudo quebrou. Por alguma razão, o TSLA já estava na página 25 e o paginador carrega os dados dinamicamente através do JS. Esse problema pode ser resolvido "de frente": analisando todas as páginas até encontrarmos nosso ativo. Mas essa abordagem não é muito eficaz, se considerarmos o tempo de execução do loop de script. Em vez disso, decidi adicionar a análise do tradingview.com. Não há necessidade de vasculhar listas longas em mais páginas. Lá, cada ativo tem algo como este link:
www.tradingview.com/symbols/NASDAQ-TSLAPareceu-me que tudo deveria começar de forma rápida e simples, mas havia um problema - os dados de interesse para mim são carregados por meio do JS e os Pedidos habituais não conseguiam lidar com isso.
Esse problema tem três soluções que eu conheço:
PyQT, selênio (webdriver) e a extensão Solicitações-HTML. Como eu já tinha solicitações no projeto, foi decidido usar sua própria extensão.
Infelizmente, esta solução não funcionou muito estável, tive que procurar soluções.
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()
Observe o tempo limite, bem como as chamadas para o método close (). Eles não são encontrados em todos os exemplos, mas funciona melhor com eles do que sem eles.
3) Registramos um serviço que pode enviar SMS (sms.ru), pegar sua API, criar uma chave. Até 5 SMS por dia - gratuitamente. O suficiente para mim.
A chave fica assim:
24A41EA5-EEEE-Priv-5555-094143C2EDDD
e o envio de SMS nas primeiras versões foi implementado assim:
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 o desenvolvimento, surgiu a seguinte pergunta: o que fazer se já tivermos enviado um SMS ao usuário sobre a ultrapassagem do limite? Embora não houvesse cheques, ele enviou o SMS novamente. Toda vez. Rapidamente "comeu" o limite gratuito e começou a pensar no que fazer com ele. Eu tive que adicionar um contador de SMS enviado (sms_counter), que verificamos antes de chamar send_message.
global sms_counter sms_counter = sms_counter + 1
Outra pergunta será rastreada: excelente, durante o pregão, processamos uma passagem de limiar com um determinado ativo, e isso nos convém. O que fazer para a próxima sessão de negociação? Foi decidido redefinir o contador do SMS enviado. Havia três opções: armazenar dados no banco de dados (mas atualmente tenho um aplicativo sem estado), analisar hora / data ou reiniciar o script. Até agora, estou fazendo a terceira opção, mas no futuro passarei para a segunda ou primeira opção.
Agora a solução já está operacional e pode ser baixada no
GithubPara usuários que não entendem o que é Python e como configurá-lo, sugiro tentar iniciar uma
solução empacotada
para WindowsPlanos para um maior desenvolvimento:
1) analisar data / hora, para redefinir o contador de SMS (em vez de reiniciar o script);
2) agora é um aplicativo sem estado, mas pretendo danificar o banco de dados;
3) após o item 2, quero adicionar o rastreamento de saltos acentuados no aumento / diminuição do preço, em relação ao preço de fechamento do dia anterior;
4) expandir as oportunidades de "comunicação": mais caminhos (Telegram, Viber, chamadas de voz, outras opções) e provedores (pretendo adicionar smsc.ru, pois o sms.ru às vezes perde a capacidade de resposta e, embora envie SMS, mas o script não é executado até chegarmos a sms_response).