Muitas vezes você pode encontrar artigos que são chamados de algo assim: "10 projetos que um programador precisa implementar." Os bots comerciais costumam ser listados nesses artigos. Acredito que desenvolver um bot de negociação é um investimento válido. Então decidi reservar um tempo para escrever um tutorial sobre isso.
Mas em vez de fazer uma análise linha por linha de algum código, decidi que seria melhor desmontar os conceitos com os quais alguém que deseja criar seu próprio bot deve estar familiarizado. O objetivo do meu material é que, após lê-lo, você mesmo escreveria o código.
Portanto, falarei sobre o que é útil saber para desenvolver um bot de negociação e o que é necessário para isso (desde trabalhar com bolsas até implementar uma estratégia de negociação simples). Aqui, tocarei nas questões relacionadas à arquitetura e estrutura interna de bots de negociação simples, com as ideias que os fundamentam. Vou demonstrar exemplos escritos em pseudocódigo. Portanto, você pode ler este guia e imediatamente escrever seu próprio bot na linguagem de programação de sua escolha. Como resultado, você se sentirá confortável usando uma ferramenta com a qual está familiarizado. Você será capaz de se envolver calmamente na programação, e não perder tempo configurando o ambiente de trabalho e se acostumando com uma nova linguagem. Você vai escolher uma arma e eu vou te ensinar como usar esta arma.
Etapa 1. Escolhendo uma arma
Na primeira etapa deste tutorial, você escolherá a linguagem de programação que usará. Você deve decidir esta questão sozinho.
Algumas linguagens, como Python, podem ser preferidas se você planeja equipar seu bot no futuro, por exemplo, com mecanismos de aprendizado de máquina. Mas minha ideia principal é que você possa escolher o idioma mais conveniente para você trabalhar.
Etapa 2. Procurando o campo de batalha

Um tópico importante é frequentemente esquecido em tutoriais sobre como escrever bots de negociação. Diz respeito à escolha da troca. O fato é que para que um bot seja capaz de fazer o que foi criado, ele precisa acessar uma troca onde você pode negociar algo. Escolher uma troca e saber como usá-la é tão importante quanto habilidades de programação.
Portanto, sua primeira etapa será decidir o que exatamente você vai negociar (ações, moedas, criptomoedas) e decidir exatamente onde você vai negociar.
Se falarmos sobre ativos negociados em bolsa, recomendo que você preste atenção às criptomoedas. A razão para essa recomendação não é que eu seja um defensor das tecnologias de blockchain e criptomoedas (estou completamente aberto a esse assunto), mas apenas que os mercados de criptomoedas operam 24 horas por dia, 7 dias por semana.
Os ativos mais “tradicionais” só podem ser negociados em determinados intervalos de tempo e, frequentemente, apenas durante a semana. As bolsas de valores, por exemplo, costumam abrir das 9h às 16h e fecham nos finais de semana. Os mercados FOREX, embora possam operar 24 horas por dia, geralmente estão fechados nos fins de semana.
Nesse sentido, as criptomoedas são as mais adequadas para nós, já que a escolha desse mercado permitirá que nosso bot funcione sem interrupção. Além disso, as criptomoedas são conhecidas por seus altos níveis de volatilidade. Isso significa, em primeiro lugar, que você pode perder muito dinheiro ao negociá-los e, em segundo lugar, que são uma excelente ferramenta para estudar e testar estratégias de negociação.
Já falamos sobre ativos cambiais. Vamos agora discutir os requisitos a serem considerados ao escolher uma troca para a qual um bot será criado. Ou seja, estou falando sobre dois requisitos básicos:
- Você deve ser legalmente capaz de negociar na bolsa selecionada e trabalhar com os instrumentos de negociação que ela oferece. Se falamos sobre criptomoedas, em alguns países é proibido negociar com elas. Considere isso ao escolher instrumentos e uma troca.
- API, . , .
Depois de descobrir que uma determinada troca atende a esses dois requisitos básicos, você pode analisá-la com mais detalhes. Por exemplo, estime o tamanho das comissões, avalie sua confiabilidade e popularidade, observe a qualidade da documentação de sua API.
E, no entanto, o que é tão importante quanto tudo o mais, eu recomendaria avaliar o volume de negociação da bolsa. As bolsas de baixo volume tendem a ficar para trás dos movimentos de preços. Além disso, é mais difícil executar ordens de limite neles (falaremos mais sobre isso abaixo).
Se você decidir escolher criptomoedas, aqui está uma boa lista das principais trocas. Aqui você pode encontrar várias informações sobre eles para ajudá-lo a escolher uma troca.
Etapa 3. Construindo o acampamento

Se a troca for um campo de batalha, agora falaremos sobre o local de onde enviaremos nossas tropas ao campo de batalha. A propósito, talvez seja hora de eu terminar com essas analogias.
Estou falando sobre o servidor aqui. O código do bot deve ser executado em algum servidor, o que permitirá que o bot envie solicitações à API de troca.
Ao testar um bot, é claro, seu computador pode atuar como um servidor. Mas se você precisa de um bot para trabalhar o tempo todo, um computador normal definitivamente não é a melhor escolha.
Tenho duas sugestões aqui:
- A função de servidor pode ser desempenhada pelo Raspberry Pi (esta abordagem é mais interessante).
- O servidor pode ser algum tipo de serviço em nuvem (e essa abordagem é melhor).
Acho que organizar um bot com base em seu próprio servidor Raspberry Pi é uma ideia interessante e moderna, então se você gostar dessa ideia, pode colocá-la em prática.
Mas a maioria dos criadores de bots provavelmente vai optar por um provedor de nuvem como AWS , Azure , GCS ou Digital Ocean .
A maioria dos principais provedores de nuvem tem bons planos gratuitos, então você pode hospedar seu bot com um gratuitamente.
Isso conclui minha conversa sobre servidores. Você deve escolher o que funciona melhor para você. Para um projeto pequeno como o que estamos fazendo, o que for escolhido não terá um grande impacto no resultado final.
Etapa 4. Crie um bot

E agora começa a diversão. Mas, antes de iniciar esta parte do nosso projeto, verifique se o seguinte foi feito:
- Você se cadastrou na bolsa e recebeu as autorizações necessárias para trabalhar com ela.
- Você tem a capacidade de trabalhar com a API do Exchange, você tem uma chave de API.
- Você escolheu hospedagem para o bot.
Se esses problemas forem resolvidos, isso significa que podemos seguir em frente.
▍Bot simples
Meu objetivo é ajudar alguém que, até agora, não sabia absolutamente nada sobre bots, a subir ao nível de criar um bot funcional simples. Portanto, vou lhe dizer como criar um robô comercial simples que você pode expandir e melhorar de acordo com suas necessidades.
Nosso bot terá algumas limitações:
- O bot poderá ficar em apenas um dos dois estados: COMPRAR (comprar) ou VENDER (vender). Ele não colocará constantemente ordens de compra ou venda a preços diferentes. Se a última operação foi uma venda, a próxima operação que o bot tentará realizar é uma compra.
- O bot usará limites fixos para tomar decisões de compra e venda. Um bot mais inteligente pode ser capaz de ajustar independentemente esses valores com base em vários indicadores, mas a estratégia e os limites do nosso bot serão definidos manualmente.
- Ele vai negociar apenas um par de moedas. Por exemplo - BTC / USD.
Essas restrições tornam nossa tarefa mais fácil. O bot será simples, o que significa que será mais fácil de construir e manter. Isso também nos permitirá implantar rapidamente seu código no servidor. Basicamente, estamos falando sobre o princípio KISS aqui.
▍ Mecanismo de tomada de decisão
Aqui está um diagrama simples que dá uma visão geral de como nosso bot está funcionando.

Agora você pode começar a planejar a arquitetura do seu bot.
Para começar, precisamos de uma variável que armazenará informações sobre o estado exato do bot no momento atual. É COMPRAR ou VENDER. Uma variável booleana ou enumeração é uma boa escolha para armazenar tais informações.
Em seguida, você precisa definir limites para operações de compra e venda. Esses valores são expressos em porcentagem e representam o aumento ou diminuição do preço do ativo desde a transação anterior.
Por exemplo, se comprei algo por $ 100 e o preço atual é $ 102, estamos lidando com um aumento de 2% no preço. Se o limite para a operação de VENDA for definido como um aumento de um por cento no preço, o bot, vendo esses 2%, venderá o ativo, pois já obteve um lucro que excede o valor limite que definimos.
Em nosso caso, esses valores serão constantes. Precisamos de 4 desses valores - 2 para cada estado do bot.
▍ Valores limite para a operação BUY (se o bot estiver no estado SELL)
DIP_THRESHOLD: o bot realiza uma operação de compra se o preço diminuiu em um valor maior do que o valor especificadoDIP_THRESHOLD. A lógica por trás disso é implementar uma estratégia de comprar na baixa e vender na alta. Ou seja, o bot tentará comprar um ativo por um preço reduzido, esperando um aumento no preço e a possibilidade de uma venda lucrativa do ativo.UPWARD_TREND_THRESHOLD: o bot compra um ativo se o preço aumentou em um valor superior ao especificado por esta constante. Este movimento contradiz a filosofia compre na baixa e venda na alta. Seu objetivo é identificar uma tendência de alta e não perder uma oportunidade de compra antes que o preço suba ainda mais.
Aqui está uma ilustração que pode ajudá-lo a entender o significado dessas constantes.

Se realizarmos a operação SELL no momento marcado na figura com o marcador SELL vermelho, então o bot, ao decidir se realizará a operação BUY, será guiado pelos valores limite
DIP_THRESHOLDe UPWARD_TREND_THRESHOLD.
Se o preço descer abaixo da linha verde inferior ou acima da linha verde superior, realizaremos uma operação de COMPRA. Na situação mostrada na figura, o preço ultrapassou o limite superior. Portanto, nós, orientados pelo valor
UPWARD_TREND_THRESHOLD, realizamos a operação de COMPRA.
▍ Valores limite para a operação SELL (se o bot estiver no estado BUY)
PROFIT_THRESHOLD: o bot vende um ativo se o preço se tornou superior ao preço calculado com base nesse valor, uma vez que o ativo foi anteriormente comprado por um preço inferior. É assim que lucramos. Vendemos o ativo a um preço superior ao preço no momento da compra.STOP_LOSS_THRESHOLD: O ideal é que o bot venda ativos apenas quando a venda for lucrativa para nós. Mas, talvez, tenha havido um forte movimento de queda do mercado. Em tal situação, decidimos sair da negociação antes de sofrer uma perda muito grande e, posteriormente, comprar o ativo por um preço mais baixo. Este limite é usado para fechar a posição com perda. O objetivo desta operação é evitar maiores perdas.
Aqui está uma ilustração.

Isso mostra a situação quando uma compra foi feita onde o marcador BUY está. Depois disso, o preço atinge o limite especificado
PROFIT_THRESHOLDe vendemos o ativo com lucro. É assim que os bots ganham dinheiro.
Agora que temos uma compreensão geral de como funciona um bot, é hora de examinar o pseudocódigo.
▍ Funções úteis para trabalhar com API
A primeira coisa que um bot precisa é a capacidade de trocar dados com a API de troca. Implementamos esses recursos usando várias funções auxiliares:
FUNCTION getBalances():
DO: GET- API
RETURN:
FUNCTION getMarketPrices():
DO: GET- API
RETURN:
FUNCTION placeSellOrder():
DO:
1. (
, ,
50% )
2. POST- API
SELL
RETURN:
FUNCTION placeBuyOrder():
DO:
1. (
, ,
50% )
2. POST- API
BUY
RETURN:
// ,
//
FUNCTION getOperationDetails():
DO: GET- API
RETURN:
O código acima deve ser autoexplicativo, sem muita explicação. Mas, implementando essa funcionalidade, você deve saber exatamente quais dados você precisa transferir para a API ao fazer solicitações POST que iniciam a compra ou venda de algo.
Freqüentemente, por exemplo, ao negociar o par XAU / USD (ouro e dólares americanos), ao executar uma solicitação, você pode especificar quanto ouro precisa comprar ou quantos dólares precisa vender. Ao realizar essas solicitações, é muito importante entender claramente o significado das ações que estão sendo executadas.
▍ Loop de bot principal
Agora que preparamos as funções auxiliares, vamos começar a descrever as ações do bot. Primeiro, precisamos criar um loop infinito que seja executado em intervalos regulares. Suponha que queremos que um bot tente realizar uma operação a cada 30 segundos. Este é o formato de um loop como este:
FUNCTION startBot():
INFINITE LOOP:
attemptToMakeTrade()
sleep(30 seconds)
A seguir, configuraremos as variáveis e constantes sobre as quais falamos acima e escreveremos a lógica do bot que permite tomar decisões. Como resultado, além das funções auxiliares e do loop principal, o código do bot principal será semelhante a este:
bool isNextOperationBuy = True
const UPWARD_TREND_THRESHOLD = 1.50
const DIP_THRESHOLD = -2.25
const PROFIT_THRESHOLD = 1.25
const STOP_LOSS_THRESHOLD = -2.00
float lastOpPrice = 100.00
FUNCTION attemptToMakeTrade():
float currentPrice = getMarketPrice()
float percentageDiff = (currentPrice - lastOpPrice)/lastOpPrice*100
IF isNextOperationBuy:
tryToBuy(percentageDiff)
ELSE:
tryToSell(percentageDiff)
FUNCTION tryToBuy(float percentageDiff):
IF percentageDiff >= UPWARD_TREND_THRESHOLD OR percentageDiff <= DIP_THRESHOLD:
lastOpPrice = placeBuyOrder()
isNextOperationBuy = False
FUNCTION tryToSell(float percentageDiff):
IF percentageDiff >= PROFIT_THRESHOLD OR percentageDiff <= STOP_LOSS_THRESHOLD:
lastOpPrice = placeSellOrder()
isNextOperationBuy = True
Observe que os limites neste código são selecionados aleatoriamente. Você mesmo deve escolher esses valores, de acordo com sua estratégia de negociação.
Combinando o código acima com as funções auxiliares e com o loop principal do bot, que pode ser representado por algo como uma função
main, isso significa que agora temos um bot de trabalho muito simples com os recursos básicos típicos dos bots.
A cada iteração do ciclo, o bot verificará seu estado atual (COMPRA ou VENDA) e tentará realizar uma operação de negociação usando os valores limite que estão embutidos em seu código ao analisar a situação atual. Então, se a operação for concluída, o bot irá atualizar as informações sobre seu estado atual e dados sobre o preço pelo qual a última operação foi realizada.
Etapa 5. Melhorando o bot

A arquitetura básica do nosso bot está pronta. Mas provavelmente podemos melhorá-lo um pouco equipando-o com alguns recursos adicionais.
▍Revistas
Quando comecei a criar uma das variantes deste bot, era muito importante para mim que o bot registrasse constantemente informações sobre suas ações, enviando-as para o terminal e para um arquivo de log separado.
Cada etapa do programa deve ter sido acompanhada aproximadamente pelos seguintes registros:
[BALANCE] USD Balance = 22.15$
[BUY] Bought 0.002 BTC for 22.15 USD
[PRICE] Last Operation Price updated to 11,171.40 (BTC/USD)
[ERROR] Could not perform SELL operation - Insufficient balance
O que vai para o arquivo de log é a hora marcada. Como resultado, se eu me conectar ao servidor uma vez por dia e vir, por exemplo, uma mensagem de erro, posso descobrir exatamente quando o erro ocorreu e o que o bot estava fazendo todo esse tempo.
Equipar um bot com esses recursos significa escrever uma função que pode ser nomeada
createLog. Esta função deve ser chamada a cada etapa do loop principal do bot. Esta é a aparência desta função:
FUNCTION createLog(string msg):
DO:
1. msg
2. msg ,
▍Identificação de tendências
O principal objetivo do nosso bot é comprar ativos baratos e vendê-los, obtendo lucro. Mas em seu código existem duas constantes, simbolizando dois valores de limiar, que contradizem parcialmente esse objetivo. Este
UPWARD_TREND_THRESHOLDe STOP_LOSS_THRESHOLD.
Esses valores têm como objetivo limitar as perdas com a venda do ativo quando o preço cair e organizar a compra do ativo quando o preço subir. A questão aqui é que com a ajuda deles tentamos prever tendências, os preços, quando aparecem, vão além dos limites da estratégia usual, mas podem nos prejudicar ou nos dar dinheiro. Tanto isso como outro prevêem algumas ações de nossa parte.
A forma como a análise de preços funciona agora nos limita muito. A análise de preços, realizada pela comparação de um par de indicadores, está longe de ser um mecanismo de identificação de tendências.
Mas nós, felizmente, podemos, sem muitos problemas, tornar nosso sistema de detecção de tendências mais confiável.
Precisamos apenas organizar a observação de mais valores de preços do que antes. E antes, armazenávamos apenas informações sobre um indicador de preço - sobre o valor do ativo no momento da última operação (
lastOpPrice). Por exemplo, você pode armazenar informações sobre os preços das últimas 10 ou 20 iterações do ciclo do bot e compará-los com o preço atual, e não apenas lastOpPrice. É provável que isso permita uma melhor identificação das tendências, uma vez que, com essa abordagem, podemos capturar as flutuações de preços de curto prazo, em vez de flutuações que ocorrem por um longo tempo.
▍Banco de dados?
Um simples bot realmente não precisa de um banco de dados. Afinal, ele opera com quantidades muito pequenas de dados e armazena todas as informações de que precisa na memória.
Mas o que acontece se, por exemplo, o bot for interrompido de forma anormal? Como ele pode saber, sem intervenção humana, qual era o significado
lastOpPrice?
Para eliminar a necessidade de intervenção manual no código do bot quando ele é reiniciado, podemos precisar de algum banco de dados simples no qual possamos armazenar alguns indicadores como
lastOpPrice.
Com essa abordagem, o bot, quando iniciado, não pode usar os valores que estão codificados no código. Em vez disso, ele acessa os dados armazenados e continua de onde parou.
Dependendo de quão simples você acha que esse "banco de dados" deve ser, você pode até decidir usar arquivos .txt ou .json regulares, já que, em qualquer caso, estamos falando em armazenar muito conjunto de dados limitado.
▍ Painel de controle

Se você deseja organizar a visualização da atividade do bot, bem como gerenciá-la sem editar seu código, você pode querer conectar o bot a algum tipo de painel de controle.
Isso exigirá que o bot tenha sua própria API de servidor para gerenciar sua funcionalidade.
Essa abordagem, por exemplo, facilita a alteração dos limites.
Existem muitos modelos de painel disponíveis, o que significa que se você decidir fazer algo assim, não precisa nem criar um do zero. Dê uma olhada em Start Bootstrap e Creative Tim , por exemplo .
▍ Estratégias de teste em dados históricos
Muitas bolsas oferecem aos clientes acesso a dados históricos de preços. Além disso, se você precisar desses dados, geralmente é fácil obtê-los.
Seu uso é muito útil para testar estratégias de negociação antes de aplicá-las. Isso permite que uma simulação seja executada usando dados históricos e dinheiro falso. Isso permite que você saiba o desempenho dos limites e, se necessário, altere esses valores.
▍ Informações adicionais sobre limites e reivindicações
Há várias coisas a se ter em mente ao fazer pedidos.
Primeiro, você precisa saber que existem dois tipos de ordens: limite e mercado. Se você não sabe nada sobre isso, definitivamente deveria ler literatura especial. Vou explicar essas idéias em apenas algumas palavras.
As ordens de mercado são ordens executadas ao preço de mercado atual. Na maioria dos casos, isso significa sua implementação imediata.
Já as ordens limitadas são aquelas colocadas a indicar um preço abaixo do mercado (no caso de ordens de compra), ou acima do mercado (no caso de ordens de venda). Ao mesmo tempo, não há garantias de que essas ordens sejam executadas, pois o preço pode não atingir o valor especificado.
A força das ordens limitadas é que elas permitem, antecipando os movimentos do mercado, colocar ordens onde, na opinião do trader, o preço pode ser.
Além disso, geralmente são aplicadas comissões mais baixas a essas ordens do que às de mercado. Isso se deve ao fato de que o que se chama de "taxa do tomador" costuma ser aplicado às ordens de mercado e o que costuma ser chamado de "taxa do fabricante" para limitar os pedidos.
As razões pelas quais essas comissões são nomeadas dessa forma são porque quem coloca uma ordem de mercado está simplesmente “pegando” o preço de mercado atual. E as ordens limitadas estão fora dos preços de mercado, elas adicionam liquidez ao mercado e, como resultado, “criam um mercado”, pelo qual seus criadores são recompensados com comissões mais baixas.
Observe que o bot que estamos considerando aqui é mais adequado para trabalhar com ordens de mercado.
E, concluindo a conversa sobre comissões, quero ressaltar que na hora de definir o valor
PROFIT_THRESHOLD, as comissões também devem ser levadas em consideração.
Para obter lucro, o bot deve primeiro executar a operação BUY e, em seguida, a operação SELL. Isso significa que a comissão será cobrada duas vezes.
Como resultado, o bot precisa ser configurado de forma que o lucro recebido das vendas cubra pelo menos as comissões. Caso contrário, o bot negociará com prejuízo.
Pensemos nisso partindo do pressuposto da utilização de comissões que independem do valor da aplicação e do tipo de operação. Portanto, a comissão de compra de um ativo por $ 100,00 é de $ 0,50. Se esse ativo for vendido por $ 100,75 e a mesma comissão for cobrada, o lucro bruto será de 0,75%. Mas, na verdade, estamos lidando com uma perda líquida de 0,25%.
Agora imagine que seu bot sempre fecha negociações com perda líquida. Em tal situação, você pode perder muito dinheiro rapidamente.
Resultado
Meu principal objetivo era revelar os conceitos que você precisa saber sobre o desenvolvimento de bots de negociação. Tentei descrever tudo de uma forma que fosse compreensível até para quem nunca havia negociado na bolsa antes. Ao mesmo tempo, não vinculei a narração a nenhuma linguagem de programação específica.
Presumi que os leitores deste material estão cientes de como fazer solicitações HTTP usando sua linguagem de programação de escolha. Portanto, não entrei em detalhes de programação, focando em outras coisas.
Eu disse a você tudo o que queria sobre o desenvolvimento de bots comerciais. Espero que agora você possa criar seu próprio bot.
Você usa bots de negociação?
