A partir daqui, podemos começar a determinar como será nossa arquitetura.
Primeiro, precisamos de uma variável para indicar o estado em que o Bot está atualmente. Isto ou é COMPRAR ou VENDER. Um booleano ou enumero deve se encaixar bem neste propósito.
Então precisamos definir nossos limites de compra e venda. Estes indicam a diminuição ou aumento percentual no preço desde a última vez que fizemos uma operação.
Por exemplo, se eu comprei o ativo a 100$, e seu preço agora é de 102$, temos um aumento de 2%. Se tivermos um limite de SELL definido para um aumento de 1%, nosso bot então venderá, pois ele teve um lucro acima do nosso limite.
No nosso caso, esses limites serão constantes. Precisamos de 4 deles, dois para cada estado:
BUY Thresholds (If the Bot is in SELL State)
-
DIP_THRESHOLD
: Compra o activo se o seu preço diminuiu mais do que o limiar. A idéia disto é seguir a estratégia “comprar baixo, vender alto”, onde você tenta comprar um ativo quando ele é subvalorizado, esperando que seu valor aumente para que você possa vender. -
UPWARD_TREND_THRESHOLD
: Compra o ativo se o seu preço aumentou mais do que o limite. Isto vai contra a filosofia “comprar baixo, vender alto”, mas visa identificar quando o preço está subindo e não queremos perder uma oportunidade de comprar antes que ele suba ainda mais.
Aqui está uma ilustração que pode ajudar:
O acima deve ser auto-explicativo, mas você precisa ter certeza de estar ciente de quais moedas o API POST
pedidos pedem ao fazer uma operação de compra ou venda.
Muitas vezes, quando você está negociando USD por Ouro, por exemplo, você pode especificar quanto Ouro comprar, ou quanto USD vender. Obter as moedas certas é muito importante.
Ciclo de Loop do Bot
Agora temos as nossas funções de ajuda, vamos começar a definir o fluxo de trabalho do bot. A primeira coisa que precisamos é de um loop infinito com algum tempo de sono. Digamos que queremos que o bot tente fazer uma operação a cada 30 segundos. Eis o que isso pode parecer:
Então, vamos definir as variáveis e constantes de que falamos, bem como o fluxo de tomada de decisão. Funções de ajuda API à parte, nosso código acabaria algo assim:
>
>
Nota: Os valores para os limiares aqui são apenas valores arbitrários. Você deve escolher o seu de acordo com a sua própria estratégia.
Se o acima mencionado estiver emparelhado com as funções de ajuda e a função de loop, que também poderia ser main
, devemos ter agora os pilares básicos de um bot funcional.
Em cada iteração, o nosso bot irá verificar o seu estado actual (COMPRAR ou VENDER) e tentar fazer uma troca com base nos limiares codificados. Ele então atualizará o estado BUY/SELL e o último preço para uma operação.
Então ele faz tudo de novo.
Passo 5: Polindo o Bot
A arquitectura básica do nosso bot está pronta, mas provavelmente ainda há algumas coisas que podemos querer considerar adicionar.
Logs
Quando eu construí uma variação deste bot, uma coisa que era essencial para mim era ter um registro constante das ações do bot tanto para o terminal quanto para um arquivo de log separado.
A cada passo, eu criava logs como:
USD Balance = 22.15$
Bought 0.002 BTC for 22.15 USD
Last Operation Price updated to 11,171.40 (BTC/USD)
Could not perform SELL operation - Insufficient balance
Os logs que iam para o arquivo também teriam um timestamp adicionado a eles, então quando eu acessava o servidor após um dia inteiro e encontrava um erro, por exemplo, eu podia rastreá-lo exatamente até onde aconteceu, assim como descobrir tudo o resto que o bot fez pelo caminho.
Isso deveria ser uma questão de configurar uma função createLog
que é chamada a cada passo. Algo assim:
Identificando Tendências
O objetivo principal do nosso bot deve ser comprar a um preço baixo e vender com lucro. No entanto, temos dois limiares que contradizem esta ideia:UPWARD_TREND_THRESHOLD
e STOP_LOSS_THRESHOLD
.
Estes limiares supostamente dizem-nos quando devemos vender com prejuízo ou comprar com um aumento de preço. A idéia é que tentamos identificar tendências que estão fora da estratégia geral mas que podem ser prejudiciais ou benéficas para nós, então devemos agir.
No entanto, a forma como eu estruturei acima é bastante limitada. Uma imagem estática de um preço está longe de ser uma indicação de uma tendência.
Felizmente, sem muita confusão, você pode tornar isso um pouco mais confiável.
Tudo o que você precisa fazer é também acompanhar mais preços do que apenas lastOpPrice
. Você poderia, por exemplo, acompanhar o preço de 10 ou 20 iterações atrás, e comparar isso com o preço atual ao invés de lastOpPrice
. Isto seria provavelmente melhor na identificação de uma tendência porque verifica mudanças rápidas de preço em vez de uma mudança que ocorreu durante um longo período de tempo.
Base de dados?
Enquanto está a correr, este simples bot não precisa de uma base de dados, uma vez que está a manusear muito poucos dados e pode manter toda a informação na memória.
No entanto, o que acontece quando o bot falha, por exemplo? Como ele poderia determinar o lastOpPrice
sem você verificá-lo manualmente?
Para evitar trabalho manual na sua extremidade, você pode querer manter algum tipo de base de dados leve para manter o controle de algumas coisas, como lastOpPrice
.
Desta forma, quando o bot inicia, ao invés de usar os valores padrão, ele irá realmente verificar seus valores armazenados e continuar a partir daí.
Dependente de quão simples você quer fazer isso, você pode até considerar um “banco de dados” de arquivos .txt
ou json
, já que você pode estar armazenando apenas alguns valores de qualquer forma.
Dashboard
Se quiser facilitar a visualização das operações do seu bot, assim como geri-lo sem ter de entrar e mexer manualmente no código, pode querer considerar ligar o seu bot a um painel de instrumentos.
Isso exigiria que seu bot fosse conectado a um servidor web/API próprio que lhe permitisse controlar sua funcionalidade.
Dessa forma, você poderia alterar os limites mais facilmente, por exemplo.
Existem muitos modelos de dashboard gratuitos disponíveis para que você não tenha que fazer o seu próprio. Confira Start Bootstrap e Creative Tim para alguns exemplos.
Testing Strategies on Past Data
Muitas trocas lhe oferecerão acesso a dados de preços passados, assim como você pode obter esses dados facilmente em outro lugar, se você precisar.
Isso é muito útil se você quiser testar sua estratégia antes de colocá-la em ação. Você pode executar uma simulação do seu bot com dados passados e “dinheiro falso” para ver quão bem os seus limites definidos teriam funcionado e ajustá-los para o negócio real.
Pontos adicionais em Limites e Ordens
Há algumas coisas que você precisa ter cuidado ao colocar ordens.
Primeiro, você deve entender que há dois tipos de ordens: ordens de limite e ordens de mercado. Você deve realmente ler um pouco sobre isso se você não estiver familiarizado com os conceitos, mas eu lhe darei uma visão básica aqui.
As ordens de mercado são ordens que executam ao preço de mercado atual, executando efetivamente imediatamente na maioria dos casos.
As ordens limitadas, por outro lado, acontecem quando você coloca uma ordem por um preço inferior ao preço de mercado (no caso de uma ordem de COMPRA) ou superior ao preço de mercado (no caso de uma ordem de VENDA). A vantagem das ordens com limite é que você pode antecipar os movimentos do mercado e colocar uma ordem em relação a onde você espera que o mercado vá antes que tal movimento aconteça.
Além disso, as ordens com limite estão normalmente sujeitas a taxas mais baixas do que as ordens de mercado. Isto porque as ordens de mercado estão sujeitas ao que é normalmente chamado de “taker fee”, enquanto as ordens com limite estão sujeitas a “maker fees”.
A razão para os nomes e suas respectivas taxas é que as ordens de mercado estão apenas aceitando (“tomando”) o preço de mercado atual, enquanto as ordens com limite fora do preço de mercado estão adicionando liquidez e, portanto, “fazendo um mercado”, pelo qual elas são “recompensadas” com taxas mais baixas.
Note que o bot neste artigo é mais adequado para ordens de mercado.
Por último, no tópico de taxas, ao definir o seu PROFIT_THRESHOLD
, lembre-se de ter em consideração as taxas.
Para ter lucro, você precisa realizar uma compra e depois uma operação de venda, o que o deixa sujeito a 2 taxas.
Como tal, você precisa certificar-se de que só vende com lucro quando for capaz de pelo menos cobrir as suas taxas, caso contrário você estará realmente a fazer uma perda.
Pense nisso, assumindo que as taxas eram fixas, se você comprasse um activo por 100,00$, incorrendo numa taxa de 0,50$, e depois o vendesse por 100,75$, novamente com uma taxa de 0,50$, você teria feito um lucro bruto de 0,75%, mas, na realidade, você teria uma perda líquida de 0,25%.
Agora imagine que o seu bot estava sempre a vender por uma perda líquida. Você perderia muito dinheiro rapidamente…
Final Remarks
É isso mesmo para o nosso bot. Espero que este tutorial tenha sido útil.
A idéia era focar em todos os conceitos que você precisa saber para construir um bot de negociação mesmo que você nunca tenha negociado antes, não ensiná-lo a programar.
A suposição é que todos os leitores são capazes de fazer pedidos HTTP em sua linguagem de escolha, então seria melhor focar em outros aspectos.
É o primeiro tutorial que escrevo assim (baseado em pseudo-codificação), então por favor me informe o que você achou do conceito.
Bancos à leitura! E se você acha que este artigo foi útil, sinta-se à vontade para me apoiar com algumas palmas 👏👏.