• Nenhum resultado encontrado

Relatório de execução do robô bf_r1, na exchange Bitfinex

No documento Uso de robôs em bolsas de Bitcoin (páginas 77-79)

A respeito da execução do robô bf_r1 e seu resultado apresentado em Código 4.18, usamos 1000 intervalos de 6 horas, porém a simulação das negociações de compra e venda só foram iniciadas a partir do 37º período, devido à necessidade de dados para calcular a lista do histograma. Realizamos tentativas de simulação para intervalos de 1 dia, 12 horas, 6 horas, 3 horas, 1 hora, 30 minutos, 15 minuto e 5 minutos. O melhor resultado foi obtido com o intervalo de 6 horas. O último ‘candle’ dos 1000 não tem o intervalo de 6 horas, devido ao horário que o método candle foi executado, não foi necessário remover esse ‘candle’, porque ele não teve participação nas negociações. A variação no preço do bitcoin entre a primeira compra e a última venda, linhas 1 e 18, foi de 1718,18 (2461,80 - 743,62), isso representa 231% de aumento no preço do bitcoin, enquanto que o valor da na conta do usuário passou de 1000 para 2867,47, um aumento de 186,75%, isso significa que se o usuário tivesse mantido os bitcoins da primeira compra até a data da última venda teria um lucro maior. No entanto, considerando o período da primeira compra até final do intervalo de dados a diferença nos preços, linhas 1 e 20, foi de 1122,08 (1865,70 - 743,62), que representa 151,9% de aumento no preço, nesse caso o aumento no valor da conta continua de 186,75%, e nesse caso, o lucro usando o indicador MACD é maior.

Vamos destacar 3 operações que têm o maior impacto nos resultados da simulação Código 4.18. Nas linhas 11 e 12, foi registrado o maior lucro da simulação, justamente porque o bitcoin quase dobrou de valor sem apresentar quedas significativas o suficiente para o algoritmo atingir a condição de venda. A terceira operação que queremos destacar é na linha 18, que foi a venda responsável por evitar a perda, em uma das maiores quedas no preço registradas no período da simulação. Observando os preços de venda em relação ao preço da próxima compra, também podemos notar que diversas vezes o preço aumentou sinalizando que a estratégia falha em detectar o ponto de venda adequado, as mesmas falhas também ocorrem nos pontos de compra algumas vezes.

4.3. OUTROS CENÁRIOS PARA USO DE ROBÔ 77 Também é importante considerar que o preço simulado é diferente do preço ao qual o usuário iria comprar ou vender uma ordem real. Por exemplo, no momento do fechamento de um ‘candle’, o preço de fechamento é o preço registrado da última negociação realizada, se o usuário vai fazer uma compra em seguida, o preço de venda, na lista de ‘asks’ do livro de ordens, pode ser maior, igual ou até menor, porém a possibilidade de ser menor ou igual é muito baixa. Concluímos que o uso dessa estratégia apresenta possibilidade de lucro, porém com grandes riscos.

4.3

OUTROS CENÁRIOS PARA USO DE ROBÔ

4.3.1

Flash Crash

Como consequência de uma das maiores e mais rápidas variações de preços de uma criptomoeda, houve uma paralisação nas negociações de ether por dólar (EHT-USD) na exchange Gdax. Segundo relatos de White (2017), em 21 de junho de 2017, uma ordem de venda de milhões de dólares em ether foi colocada para ser realizada a preço de mercado (tipo de ordem que vende no melhor preço possível instantaneamente), no mercado de ETH-USD. Esse evento resultou em uma queda no valor do ETH de USD 317,81 para USD 224,48, devido a execução de todas as ordens do livro de compras em valores acima de USD 224,48, uma queda de 29,4% no preço de compra. Tal redução no preço deu início a execução de aproximadamente 800 ordens de stop loss (ordens de venda programadas para executar automaticamente se o preço cair abaixo de um valor definido) e margin funding liquidations (ordens são executadas automaticamente a fim de adquirir fundos para o usuário liquidar financiamentos existentes). Como consequência da execução automática desse grande volume de vendas, o preço do ETH caiu para USD 0,10 Tech (2017).

No caso da Gdax, fica visível que ethers foram vendidos num valor abaixo de 1% do valor real da moeda, e quem realizou venda nesses valores sofreu uma perda de mais de 99% do capital mantido naquela moeda. Vamos assumir que algumas ordens de stop loss, que deveriam ser executadas com valores acima de 50%, foram executadas por valores menores devido a falta de liquidez do mercado, porém se essas ordens não fossem todas executadas em sequência seria possível uma recuperação do mercado para a execução das ordens em valores adequados. Se considerarmos que o preço do ether em outras bolsas que negociam ether por dólar, não apresentou queda significativa, podemos concluir que as ordens de stop loss embora tenham executado normalmente não cumpriram o papel de proteger o investidor de perdas maiores, mas foram, de fato, a causa de perdas extremamente altas.

Com base no cenário ocorrido na exchage Gdax, temos uma proposta de robô para atuar em cenários similares. Vamos apresentar à implementação do robô para atuar na echange Bitfinex, que negocia bitcoin, ether e outras criptomoedas e também tem um forte mercado com opções de financiamento.

4.3. OUTROS CENÁRIOS PARA USO DE ROBÔ 78

 stopLossLimited: Simular um stop loss, limitando o valor de venda com um valor mínimo, o qual seria desnecessário vender abaixo daquele valor. Por exemplo, uma moeda comprada a 100, se cair abaixo de 90 pode ser vendida para evitar perdas maiores, porém se a queda for tão rápida que o valor chegou abaixo de 20, não vale a pena realizar a venda. Implementação disponível em Código 4.19.

1 def stopLossLimited(symbol, currency, wallet, sellprice, sellpricelimit):

2 orderId = 0

3 while True:

4 try:

5 status = orderStatus(orderId)

6 if(status.has_key(’is_live’) and status.get(’is_live’)): 7 cancel(orderId)

8 continue

9 balance = balances() #confirmar saldo 10 amount = 0

11 for x in balance:

12 if (x.get(’currency’) == currency and x.get(’type’) ==

wallet):

,→

13 amount = x.get(’available’)

14 break

15 if(amount == 0): return 0 16 book = orderbook(symbol) 17 bids = book.get(’bids’)

18 buyprice = float(bids[0].get(’price’)) 19 if(buyprice <= sellprice):

20 order = newOrder(amount, sellpricelimit, ’sell’) 21 orderId = order.get(’order_id’)

22 except Exception as erro:

23 print erro

24 time.sleep(5)

25 pass

No documento Uso de robôs em bolsas de Bitcoin (páginas 77-79)