Exemplo n.º 1
0
        private static async Task DepthSockets()
        {
            const string symbol = "btcusdt";

            var     mediaAtual = new AverageCalculator(4);
            var     mediaCurta = new AverageCalculator(6);
            var     mediaLonga = new AverageCalculator(15);
            decimal valorAtual = 0;

            var saida = new StringBuilder();

            var comprado          = false;
            var monitorandoPrecos = true;

            decimal relacaoUltimaMedia = 0;
            decimal maximaMedia        = decimal.MinValue;
            decimal minimaMedia        = decimal.MaxValue;

            OrderBookUpdateArgs bookUpate = null;

            await PreencherHistoricoMedias(symbol, mediaCurta, mediaLonga);

            Timer.RunEvery(1000, () =>
            {
                if (valorAtual == 0)
                {
                    return;
                }

                mediaAtual.AddSample(valorAtual);
            });

            Timer.RunEvery(60000, () =>
            {
                if (valorAtual == 0)
                {
                    return;
                }

                mediaLonga.AddSample(valorAtual);
            });

            Timer.RunEvery(5000, () =>
            {
                if (valorAtual == 0)
                {
                    return;
                }

                var ultimaMedia = mediaCurta.Calculate();
                mediaCurta.AddSample(valorAtual);
                relacaoUltimaMedia = (mediaCurta.Calculate() / ultimaMedia) * 100;
            });

            var sync = new object();

            decimal valorCompra = 0;

            Action print = () =>
            {
                lock (sync)
                {
                    Console.Clear();

                    var valorMediaLonga = mediaLonga.Calculate(valorAtual);
                    var valorMediaCurta = mediaCurta.Calculate(valorAtual);

                    Console.WriteLine("Longa({0}): {1:N8}\tCurta({2}): {3:N8}\nValor: {4:N8}\n",
                                      mediaLonga.Count,
                                      valorMediaLonga,
                                      mediaCurta.Count,
                                      valorMediaCurta,
                                      valorAtual
                                      );

                    maximaMedia = Math.Max(maximaMedia, valorMediaCurta);
                    minimaMedia = Math.Min(minimaMedia, valorMediaCurta);

                    var relacaoMediaMinima = (valorMediaCurta / minimaMedia) * 100;
                    var relacaoMediaMaxima = (valorMediaCurta / maximaMedia) * 100;

                    //foreach (var m in mediaCurta.Samples)
                    //    Console.Write("Curta: {0:N8}\t", m);

                    var relacaoMediaLonga = (valorMediaCurta / valorMediaLonga) * 100;

                    Console.WriteLine("\nRelação Medias: {0:N2}%\t\tRel. Ultima: {1:N2}%",
                                      relacaoMediaLonga,
                                      relacaoUltimaMedia);

                    Console.WriteLine("Relação Min: {0:N2}%\t\tRel. Max: {1:N2}%\n",
                                      relacaoMediaMinima,
                                      relacaoMediaMaxima);

                    //if (!monitorandoPrecos && relacaoMediaLonga <= 99.7m)
                    //{
                    //    saida.AppendFormat("{0:HH:mm:ss}:  ", DateTime.Now).AppendLine("Monitorando...");
                    //    monitorandoPrecos = true;
                    //}

                    if (monitorandoPrecos)
                    {
                        if (!comprado && relacaoMediaMinima >= 100.5m)
                        {
                            comprado = true;
                            saida
                            .AppendFormat("{0:HH:mm:ss}:  ", DateTime.Now)
                            .AppendFormat("Comprando a {0:N4}\n", valorCompra = valorAtual)
                            .AppendFormat("Relação Ultima {0:N2}\n", relacaoUltimaMedia);
                        }

                        if (comprado)
                        {
                            if (relacaoMediaMaxima <= 99.5m)
                            {
                                maximaMedia = decimal.MinValue;
                                minimaMedia = decimal.MaxValue;

                                comprado          = false;
                                monitorandoPrecos = false;
                                saida
                                .AppendFormat("{0:HH:mm:ss}:  ", DateTime.Now)
                                .AppendFormat("Vendendo a {0:N4}\n", valorAtual)
                                .AppendFormat("Lucro: {0:N4} ( {1:N2}% )\n", valorAtual - valorCompra, (valorAtual / valorCompra) * 100)
                                .AppendFormat("Relação Ultima {0:N2}\n\n", relacaoUltimaMedia);
                            }

                            var relacaoMediaAtual = (mediaAtual.Calculate(valorAtual) / valorMediaCurta) / 100;

                            if (relacaoMediaAtual <= 99.5m)
                            {
                                maximaMedia = decimal.MinValue;
                                minimaMedia = decimal.MaxValue;

                                comprado          = false;
                                monitorandoPrecos = false;
                                saida
                                .AppendFormat("{0:HH:mm:ss}:  ", DateTime.Now)
                                .AppendFormat("Vendendo Stop-Loss a {0:N8}\n", valorAtual)
                                .AppendFormat("Prejuizo: {0:N4} ( {1:N2}% )\n", valorAtual - valorCompra, (valorAtual / valorCompra) * 100)
                                .AppendFormat("Relação Ultima {0:N2}\n\n", relacaoMediaAtual);
                            }
                        }
                    }

                    var saidaRaw = saida.ToString();
                    Console.WriteLine(saidaRaw);
                    File.WriteAllText("saida.txt", saidaRaw);

                    //if (bookUpate == null)
                    //    return;

                    //Console.WriteLine("\n");

                    //var limit = new[] { 20, bookUpate.Bids.Count(), bookUpate.Asks.Count() }.Min();

                    //for (var i = 0; i < limit; ++i)
                    //{
                    //    Console.WriteLine("Preço: {0:N4}\tQtd: {1:N4}\t\t\t{2:N4}\tQtd: {3:N4}",
                    //        bookUpate.Bids.ElementAt(i).Price,
                    //        bookUpate.Bids.ElementAt(i).Quantity,
                    //        bookUpate.Asks.ElementAt(i).Price,
                    //        bookUpate.Asks.ElementAt(i).Quantity);
                    //}
                }
            };


            using (var binanceSocket = new BinanceWebSocket())
            {
                //var book = new OrderBook(binanceSocket, symbol);


                binanceSocket.Register(new AggregatedTradeEventListener(symbol, response =>
                {
                    valorAtual = response.Price;
                    print();
                }));


                //book.OnUpdate(x =>
                //{
                //    bookUpate = x;
                //    print();
                //});


                await binanceSocket.Start();

                //await book.Start();

                Console.ReadKey();
            }
        }
Exemplo n.º 2
0
        public OrderBook(BinanceWebSocket binanceSocket, string symbol)
        {
            _symbol = symbol;

            binanceSocket.Register(new DiffDepthEventListener(_symbol, message => _messages.Add(message)));
        }