public HttpResponseMessage ComprarBNB(ComprarBNBViewModel ViewModel)
 {
     try
     {
         if (ViewModel == null)
         {
             return(Request.CreateResponse(HttpStatusCode.NotAcceptable, "Campos Inválidos", "text/plain"));
         }
         if (ModelState.IsValid)
         {
             var userId        = int.Parse(Helper.GetJWTPayloadValue(Request, "id"));
             var user          = _UserRepo.GetById(userId);
             var BinanceResult = BinanceRestApi.ComprarBNB(user.BinanceAPIKey, user.BinanceAPISecret, ViewModel.qtd);
             if (BinanceResult.IsSuccessStatusCode)
             {
                 return(Request.CreateResponse(HttpStatusCode.OK));
             }
             else
             {
                 var BinanceerrorObj = Helper.GetBinanceErrorObj(BinanceResult);
                 Logs.LogOrdem(user.Id + " (" + user.Email + ") => Type (Compar BNB Erro)" + " code => " + BinanceerrorObj.code + " motivo => " + BinanceerrorObj.msg);
                 return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceerrorObj));
             }
         }
         var modelstateError = ModelStateErrors.DisplayModelStateError(ModelState);
         return(Request.CreateResponse(HttpStatusCode.NotAcceptable, modelstateError, "text/plain"));
     }
     catch (Exception ex)
     {
         return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
     }
 }
Esempio n. 2
0
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
     using (var _UserRepo = new UsuarioRepository())
     {
         var user = _UserRepo.GetByEmail(filterContext.HttpContext.User.Identity.Name);
         if (!string.IsNullOrEmpty(user.BinanceAPIKey) && !string.IsNullOrWhiteSpace(user.BinanceAPISecret) && user.IsValidBinanceKeys)
         {
             var apicontent = BinanceRestApi.GetAccountInformation(user.BinanceAPIKey, user.BinanceAPISecret);
             if (apicontent.IsSuccessStatusCode)
             {
                 var result            = apicontent.Content.ReadAsStringAsync().Result;
                 var AccounInformation = JsonConvert.DeserializeObject <Account_Information>(result);
                 filterContext.Controller.ViewBag.BTC            = AccounInformation.balances.Where(x => x.asset == "BTC").Select(x => x.free).FirstOrDefault();
                 filterContext.Controller.ViewBag.datavencimento = user.DataVencimentoLicenca.ToString("dd/MM/yyyy");
                 filterContext.Controller.ViewBag.username       = user.Nome;
             }
             else
             {
                 filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { area = "usuario", controller = "Errors", action = "BinanceApiError" }));
             }
         }
         else
         {
             filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { area = "usuario", controller = "binance", action = "setkeys" }));
         }
     }
 }
 public HttpResponseMessage TestKeys(SetKeysViewModel ViewModel)
 {
     try
     {
         if (ViewModel == null)
         {
             return(Request.CreateResponse(HttpStatusCode.NotAcceptable, "Campos Inválidos", "text/plain"));
         }
         if (ModelState.IsValid)
         {
             var BinanceResult = BinanceRestApi.GetAccountInformation(ViewModel.binanceKey, ViewModel.binanceSecret);
             if (BinanceResult.IsSuccessStatusCode)
             {
                 return(Request.CreateResponse(HttpStatusCode.OK));
             }
             else
             {
                 var BinanceerrorObj = Helper.GetBinanceErrorObj(BinanceResult);
                 return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceerrorObj));
             }
         }
         var modelstateError = ModelStateErrors.DisplayModelStateError(ModelState);
         return(Request.CreateResponse(HttpStatusCode.NotAcceptable, modelstateError, "text/plain"));
     }
     catch (Exception ex)
     {
         return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
     }
 }
        public async Task <ActionResult> Limites()
        {
            var user = _UserRepo.GetByEmail(User.Identity.Name);

            ViewBag.datavencimento = user.DataVencimentoLicenca.ToString("dd/MM/yyyy");
            ViewBag.username       = user.Nome;
            var apicontent = BinanceRestApi.GetAccountInformation(user.BinanceAPIKey, user.BinanceAPISecret);

            if (apicontent.IsSuccessStatusCode)
            {
                var result = await apicontent.Content.ReadAsStringAsync();

                var AccounInformation = JsonConvert.DeserializeObject <Account_Information>(result);
                ViewBag.BTC = AccounInformation.balances.Where(x => x.asset == "BTC").Select(x => x.free).FirstOrDefault();
                var symbolsContent = BinanceRestApi.SymbolsPriece();
                if (symbolsContent.IsSuccessStatusCode)
                {
                    var symbolResult = await symbolsContent.Content.ReadAsStringAsync();

                    var symbolsInformation = JsonConvert.DeserializeObject <List <SymbolTicker> >(symbolResult);

                    var viewmodel = new LimitesViewModel
                    {
                        balances      = AccounInformation.balances.Where(x => x.free != 0 || x.locked != 0).OrderByDescending(x => x.asset == "BTC").ThenByDescending(x => x.free).ToList(),
                        symbolTickers = symbolsInformation
                    };
                    return(View(viewmodel));
                }
            }
            return(RedirectToAction("BinanceApiError", "Errors", new { area = "Usuario" }));
        }
Esempio n. 5
0
        public HttpResponseMessage Delete(int id)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var userId = int.Parse(Helper.GetJWTPayloadValue(Request, "id"));
                    var user   = _UserRepo.GetById(userId);
                    var ordem  = _OrdemRepo.GetWith_Chamada_and_Symbol(id);

                    var res = BinanceRestApi.CancelarEntrada(user.BinanceAPIKey, user.BinanceAPISecret, ordem.Chamada.Symbol.symbol, ordem.OrderID);
                    if (res.IsSuccessStatusCode)
                    {
                        ordem.BinanceStatus_Id      = 4;
                        ordem.OrdemStatus_Id        = 4;
                        ordem.DataCancelamento      = DateTime.UtcNow;
                        ordem.MotivoCancelamento_ID = 1;
                        _OrdemRepo.Update(ordem);
                        return(Request.CreateResponse(HttpStatusCode.OK, ordem));
                    }
                    else
                    {
                        var BinanceErrorObj = Helper.GetBinanceErrorObj(res);
                        Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Erro ao Cancelar Ordem de Entrada) OrdemId => " + id + " code => " + BinanceErrorObj.code + " motivo => " + BinanceErrorObj.msg);
                        return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceErrorObj));
                    }
                }
                var modelstateError = ModelStateErrors.DisplayModelStateError(ModelState);
                return(Request.CreateResponse(HttpStatusCode.NotAcceptable, modelstateError, "text/plain"));
            }
            catch (Exception ex)
            {
                return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
            }
        }
        public TraderScalper()
        {
            m_api = new ExchangeSharpApi(ExchangeSet.All);
            m_api.LoadCredentials(Credentials.CredentialsFile, Credentials.CredentialsPassword);
            m_creds  = Credentials.LoadEncryptedCsv(Credentials.CredentialsFile, Credentials.CredentialsPassword);
            m_prowl  = new ProwlPub(m_creds["PROWL"].Key, "Scalper");
            m_om     = new OrderManager(m_creds);
            m_maker  = new CandlestickMaker();
            m_orders = new ConcurrentBag <ExchangeOrderResult>();

            m_binanceRestApi = new BinanceRestApi(m_creds["BINANCE"].Key, m_creds["BINANCE"].Secret);

            ReadTradeSymbols();
        }
 public HttpResponseMessage GetSaldoBTC()
 {
     try
     {
         var userId        = int.Parse(Helper.GetJWTPayloadValue(Request, "id"));
         var user          = _UserRepo.GetById(userId);
         var BinanceResult = BinanceRestApi.GetAccountInformation(user.BinanceAPIKey, user.BinanceAPISecret);
         if (BinanceResult.IsSuccessStatusCode)
         {
             var result            = BinanceResult.Content.ReadAsStringAsync().Result;
             var AccounInformation = JsonConvert.DeserializeObject <Account_Information>(result);
             var saldo             = AccounInformation.balances.Where(x => x.asset == "BTC").Select(x => x.free).FirstOrDefault();
             return(Request.CreateResponse(HttpStatusCode.OK, saldo));
         }
         var BinanceerrorObj = Helper.GetBinanceErrorObj(BinanceResult);
         return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceerrorObj));
     }
     catch (Exception ex)
     {
         return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
     }
 }
 /// <summary>
 /// Atualiza as Chaves da api binance
 /// </summary>
 /// <param name="ViewModel"></param>
 /// <returns></returns>
 public HttpResponseMessage Post([FromBody] SetKeysViewModel ViewModel)
 {
     try
     {
         if (ViewModel == null)
         {
             return(Request.CreateResponse(HttpStatusCode.NotAcceptable, "Campos Inválidos", "text/plain"));
         }
         if (ModelState.IsValid)
         {
             var userId        = int.Parse(Helper.GetJWTPayloadValue(Request, "id"));
             var user          = _UserRepo.GetById(userId);
             var BinanceResult = BinanceRestApi.GetAccountInformation(ViewModel.binanceKey, ViewModel.binanceSecret);
             if (BinanceResult.IsSuccessStatusCode)
             {
                 user.BinanceAPIKey      = ViewModel.binanceKey;
                 user.BinanceAPISecret   = ViewModel.binanceSecret;
                 user.IsValidBinanceKeys = true;
                 _UserRepo.Update(user);
                 var monitor = WSMonitor.Instancia;
                 monitor.RemoveMonitor(userId);
                 return(Request.CreateResponse(HttpStatusCode.OK));
             }
             else
             {
                 user.IsValidBinanceKeys = false;
                 _UserRepo.Update(user);
                 var BinanceerrorObj = Helper.GetBinanceErrorObj(BinanceResult);
                 return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceerrorObj));
             }
         }
         var modelstateError = ModelStateErrors.DisplayModelStateError(ModelState);
         return(Request.CreateResponse(HttpStatusCode.NotAcceptable, modelstateError, "text/plain"));
     }
     catch (Exception ex)
     {
         return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
     }
 }
        public static void AtualizarOrdens(Usuario user)
        {
            using (var _OrdemRepo = new OrdemRepository())
            {
                var ordensabertas = _OrdemRepo.OrdemsAbertas(user.Id);
                if (ordensabertas.Count > 0)
                {
                    foreach (var item in ordensabertas)
                    {
                        var res = BinanceRestApi.RecentTraders(user.BinanceAPIKey, user.BinanceAPISecret, item.Chamada.Symbol.symbol);
                        if (res.IsSuccessStatusCode)
                        {
                            var jsonObj = res.Content.ReadAsStringAsync().Result;
                            var lista   = JsonConvert.DeserializeObject <List <order> >(jsonObj);
                            var oco     = _OrdemRepo.GetOcoOrder(user.Id, item.Chamada_Id);
                            if (oco != null && oco.MotivoCancelamento == null)
                            {
                                var ocoorder1 = lista.Where(x => x.clientOrderId == oco.LimitOrder_ID).FirstOrDefault();
                                var ocoorder2 = lista.Where(x => x.clientOrderId == oco.StopOrder_ID).FirstOrDefault();
                                // se bateu gain ou loss
                                if (ocoorder1.status == "FILLED" || ocoorder2.status == "FILLED")
                                {
                                    var filledOrder = lista.Where(x => x.clientOrderId == oco.LimitOrder_ID || x.clientOrderId == oco.StopOrder_ID && x.status == "FILLED").FirstOrDefault();
                                    if (filledOrder != null && filledOrder.executedQty > 0)
                                    {
                                        if (filledOrder.price >= item.Chamada.PrecoEntrada)
                                        {
                                            var mymain = _OrdemRepo.SelecionarbyChamadaID(item.Chamada_Id, user.Id);
                                            mymain.OrdemStatus_Id   = 5;
                                            mymain.BinanceStatus_Id = 3;
                                            mymain.DataExecucao     = new DateTimeOffset((10000 * filledOrder.time) + 621355968000000000, TimeSpan.Zero);
                                            _OrdemRepo.Update(mymain);
                                            //oco.ValorExecutado = binanceOrder.price;
                                            oco.OrdemStatus_Id   = 5;
                                            oco.BinanceStatus_Id = 3;
                                            _OrdemRepo.Update(oco);
                                        }
                                        else if (filledOrder.price <= item.Chamada.PrecoEntrada)
                                        {
                                            var mymain = _OrdemRepo.SelecionarbyChamadaID(item.Chamada_Id, user.Id);
                                            mymain.OrdemStatus_Id   = 6;
                                            mymain.BinanceStatus_Id = 3;
                                            mymain.DataExecucao     = new DateTimeOffset((10000 * filledOrder.time) + 621355968000000000, TimeSpan.Zero);
                                            _OrdemRepo.Update(mymain);
                                            //oco.ValorExecutado = binanceOrder.price;
                                            oco.OrdemStatus_Id   = 6;
                                            oco.BinanceStatus_Id = 3;
                                            _OrdemRepo.Update(oco);
                                        }
                                    }
                                }
                                //se a ordem foi canelada
                                else if (ocoorder1.status == "CANCELED" && ocoorder2.status == "CANCELED")
                                {
                                    oco.BinanceStatus_Id = 4;
                                    oco.OrdemStatus_Id   = 4;
                                    _OrdemRepo.Update(oco);

                                    item.DataCancelamento = new DateTimeOffset((10000 * ocoorder1.updateTime) + 621355968000000000, TimeSpan.Zero);
                                    item.BinanceStatus_Id = 4;
                                    item.OrdemStatus_Id   = 4;
                                    _OrdemRepo.Update(item);
                                }
                            }
                            else
                            {
                                var ordemCancelada = lista.Where(x => x.clientOrderId == item.OrderID).FirstOrDefault();
                                if (ordemCancelada != null && ordemCancelada.status == "CANCELED")
                                {
                                    item.DataCancelamento = new DateTimeOffset((10000 * ordemCancelada.updateTime) + 621355968000000000, TimeSpan.Zero);
                                    item.BinanceStatus_Id = 4;
                                    item.OrdemStatus_Id   = 4;
                                    _OrdemRepo.Update(item);
                                }
                            }
                        }
                    }
                }
                //else
                //{
                //    var OcosAbertas = _OrdemRepo.GetAllOcosAbertas(user.Id);
                //    foreach (var ocoAberta in OcosAbertas)
                //    {
                //        var mainOrder = _OrdemRepo.GetById((int)ocoAberta.MainOrderID);
                //        ocoAberta.BinanceStatus_Id = mainOrder.BinanceStatus_Id;
                //        ocoAberta.OrdemStatus_Id = mainOrder.OrdemStatus_Id;
                //        //obs: da pra colocar ocoOrdem data de cancelament e data de execuçao mas nao fiz para evitar request na binance;
                //        _OrdemRepo.Update(ocoAberta);
                //    }
                //}
            }
        }
        public WSMonitorada(Usuario user, ServerConfig config)
        {
            this.User    = user;
            OneSignalApi = new OneSignalAPI(config.OneSignalToken, config.AppServer, config.OneSignalAppId);

            if (!string.IsNullOrEmpty(user.BinanceAPIKey) && !string.IsNullOrEmpty(user.BinanceAPISecret))
            {
                timerKeepAlive.Interval = TimeSpan.FromMinutes(15).TotalMilliseconds;
                timerKeepAlive.Elapsed += (object source, ElapsedEventArgs e) =>
                {
                    BinanceUserDataStream.KeepAlive(user.BinanceAPIKey, user.BinanceAPISecret);
                };
                timerKeepAlive.Start();
                // a cada 3 horas verifica se o cara possui ordem aberta se nao possuir desconecta ele
                closeconnection.Interval = TimeSpan.FromHours(1).TotalMilliseconds;
                closeconnection.Elapsed += (object source, ElapsedEventArgs e) =>
                {
                    using (var _OrdemRepo = new OrdemRepository())
                    {
                        var ordensabertas = _OrdemRepo.OrdemsAbertas(User.Id);
                        if (ordensabertas.Count == 0)
                        {
                            this.Dispose(true);
                        }
                    }
                };
                closeconnection.Start();

                var result = BinanceUserDataStream.GetListenKey(user.BinanceAPIKey, user.BinanceAPISecret);
                if (result.IsSuccessStatusCode)
                {
                    var res       = result.Content.ReadAsStringAsync().Result;
                    var listenKey = (string)JsonConvert.DeserializeObject <dynamic>(res).listenKey;
                    ws = new WebSocket("wss://stream.binance.com:9443/ws/" + listenKey);
                    //ws.Log.Level = LogLevel.Trace;
                    //ws.Log.File = "C:\\LogConexao\\" + user.nome + ".txt";

                    //Para envio de ping
                    ws.EmitOnPing = true;

                    ws.OnOpen += (sender, e) =>
                    {
                    };

                    ws.OnMessage += (sender, e) =>
                    {
                        if (e.IsPing)
                        {
                            ws.Ping();
                            return;
                        }

                        var content    = e.Data;
                        var ws_Payload = JsonConvert.DeserializeObject <dynamic>(content);

                        //if (ws_Payload.e != "outboundAccountInfo")
                        //{
                        //    Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (" + ws_Payload.e + ") Payloadobjeto => " + ws_Payload);
                        //}

                        using (var _OrdemRepo = new OrdemRepository())
                        {
                            if ((string)ws_Payload.e == "executionReport")
                            {
                                //Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (ExecutionReport)  => " + (string)ws_Payload.x + " => " + e.Data);

                                //Ordem Executada
                                if ((string)ws_Payload.x == "TRADE" && (string)ws_Payload.X == "FILLED")
                                {
                                    string ordemID = (string)ws_Payload.c;
                                    var    ordem   = _OrdemRepo.EntradaByBinanceOrderID(ordemID);
                                    //tentar passar o id pra inteiro significa q a ordem foi gerada no meu sistema, o sisteman binance gera uma string
                                    #region OrderEntrada
                                    if (ordem != null && ordem.TipoOrdem_Id == 1)
                                    {
                                        Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Ordem Entrada Executada) OrdemId => " + ordemID);
                                        using (var _OrderCommision = new OrdemComissionRepository())
                                        {
                                            var Comission = new OrdemComission
                                            {
                                                Order_Id        = ordem.Id,
                                                ComissionAmount = (decimal)ws_Payload.n,
                                                ComissionAsset  = (string)ws_Payload.N,
                                                QtdExecutada    = (decimal)ws_Payload.z,
                                                ValorExecutado  = (decimal)ws_Payload.p
                                            };
                                            _OrderCommision.Add(Comission);

                                            ordem.DataEntrada      = DateTime.UtcNow;
                                            ordem.OrdemStatus_Id   = 3;
                                            ordem.BinanceStatus_Id = 3;
                                            _OrdemRepo.Update(ordem);
                                            _OrdemRepo.AddReference(ordem, "OrdemStatus");
                                            signalContext.Clients.User(user.Id.ToString()).EntradaRealizada(ordem);
                                            string LimitOrderID, StopOrderID;
                                            do
                                            {
                                                LimitOrderID = Helper.GenerateRandomOcoOrderID(10);
                                            } while (_OrdemRepo.IsValidOrderID(LimitOrderID));
                                            do
                                            {
                                                StopOrderID = Helper.GenerateRandomOcoOrderID(10);
                                            } while (_OrdemRepo.IsValidOrderID(StopOrderID));
                                            var     listAssets      = _OrderCommision.GetOrderComissions(ordem.Id);
                                            decimal SaldoQuantidade = Helper.ArredondarQuantidadeVenda(listAssets, ordem);
                                            var     limitLoss       = Helper.OcoStopLimitWithPercent(ordem.Chamada.Symbol_id, ordem.Chamada.PrecoLoss, 0.5m);
                                            var     ocoReturn       = BinanceRestApi.SendSaidaOco(user.BinanceAPIKey.Trim(), user.BinanceAPISecret.Trim(), ordem.Chamada.Symbol.symbol, SaldoQuantidade, ordem.Chamada.PrecoGain, ordem.Chamada.PrecoLoss, limitLoss, LimitOrderID, StopOrderID);
                                            if (ocoReturn.IsSuccessStatusCode)
                                            {
                                                var ocoRes   = ocoReturn.Content.ReadAsStringAsync().Result;
                                                var ocoObj   = JsonConvert.DeserializeObject <dynamic>(ocoRes);
                                                var OcoOrder = new Ordem
                                                {
                                                    DataCadastro     = DateTime.UtcNow,
                                                    Quantidade       = SaldoQuantidade,
                                                    Chamada_Id       = ordem.Chamada_Id,
                                                    Usuario_Id       = user.Id,
                                                    OrdemStatus_Id   = 3,
                                                    TipoOrdem_Id     = 2,
                                                    BinanceStatus_Id = 1,
                                                    StopOrder_ID     = StopOrderID,
                                                    LimitOrder_ID    = LimitOrderID,
                                                    OcoOrderListId   = (string)ocoObj.listClientOrderId,
                                                    MainOrderID      = ordem.Id
                                                };
                                                _OrdemRepo.Add(OcoOrder);
                                                var resOco = ocoReturn.Content.ReadAsStringAsync().Result;
                                                Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " =>  Type (Ordem OCO Criada sucesso) OcoOrderListID => " + OcoOrder.OcoOrderListId);
                                            }
                                            else
                                            {
                                                var BinanceerrorObj = Helper.GetBinanceErrorObj(ocoReturn);
                                                Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " =>  Type (Erro ao Criar Ordem Oco) MainOrderID => " + ordem.Id + " => code => " + BinanceerrorObj.code + " => msg => " + BinanceerrorObj.msg + "/" + BinanceerrorObj.motivo);
                                            }
                                        }
                                    }
                                    #endregion
                                    #region VendaMercado
                                    else if (ordem != null && ordem.TipoOrdem_Id == 3)
                                    {
                                        var mainorder = _OrdemRepo.GetById((int)ordem.MainOrderID);
                                        mainorder.PrecoVendaMercado = (decimal)ws_Payload.L;
                                        mainorder.OrdemStatus_Id    = 2;
                                        _OrdemRepo.Update(mainorder);
                                    }
                                    #endregion
                                    #region Order Oco
                                    else
                                    {
                                        //var OcoOrderId = (string)ws_Payload.c;
                                        ordem = _OrdemRepo.OcoOrderByBinanceOrderID(ordemID);
                                        if (ordem != null)
                                        {
                                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Ordem OCO Executada) Stop_Or_Limit_ID => " + ordemID);
                                            var valorExecutado = ws_Payload.p;
                                            ordem.BinanceStatus_Id = 3;
                                            //status da order main tem que ser igual status da ultima ordem filha
                                            var mainOrder = _OrdemRepo.GetWith_Chamada_and_Symbol((int)ordem.MainOrderID);
                                            mainOrder.DataExecucao = DateTime.UtcNow;
                                            using (var _EdicaoAceitaRepo = new EdicaoAceitaRepository())
                                            {
                                                var EdicaoAceita = _EdicaoAceitaRepo.AceitouEdicao(user.Id, mainOrder.Chamada_Id);
                                                if (EdicaoAceita == null)
                                                {
                                                    if (valorExecutado >= ordem.Chamada.PrecoGain)
                                                    {
                                                        ordem.OrdemStatus_Id     = 5;
                                                        mainOrder.OrdemStatus_Id = 5;
                                                        _OrdemRepo.Update(mainOrder);
                                                        _OrdemRepo.Update(ordem);
                                                        signalContext.Clients.User(user.Id.ToString()).GainRealizado(mainOrder);
                                                        OneSignalApi.NotificarUsuario(user, mainOrder.Chamada.Symbol.symbol, NotificationType.Gain);
                                                    }
                                                    else if (valorExecutado <= ordem.Chamada.PrecoLoss)
                                                    {
                                                        ordem.OrdemStatus_Id     = 6;
                                                        mainOrder.OrdemStatus_Id = 6;
                                                        _OrdemRepo.Update(mainOrder);
                                                        _OrdemRepo.Update(ordem);
                                                        signalContext.Clients.User(user.Id.ToString()).LossRealizado(mainOrder);
                                                        OneSignalApi.NotificarUsuario(user, mainOrder.Chamada.Symbol.symbol, NotificationType.Loss);
                                                    }
                                                }
                                                else
                                                {
                                                    if (valorExecutado >= EdicaoAceita.ChamadaEditada.NewGain)
                                                    {
                                                        ordem.OrdemStatus_Id     = 5;
                                                        mainOrder.OrdemStatus_Id = 5;
                                                        _OrdemRepo.Update(mainOrder);
                                                        _OrdemRepo.Update(ordem);
                                                        signalContext.Clients.User(user.Id.ToString()).GainRealizado(mainOrder);
                                                        OneSignalApi.NotificarUsuario(user, mainOrder.Chamada.Symbol.symbol, NotificationType.Gain);
                                                    }
                                                    else if (valorExecutado <= EdicaoAceita.ChamadaEditada.NewLoss)
                                                    {
                                                        ordem.OrdemStatus_Id     = 6;
                                                        mainOrder.OrdemStatus_Id = 6;
                                                        _OrdemRepo.Update(mainOrder);
                                                        _OrdemRepo.Update(ordem);
                                                        signalContext.Clients.User(user.Id.ToString()).LossRealizado(mainOrder);
                                                        OneSignalApi.NotificarUsuario(user, mainOrder.Chamada.Symbol.symbol, NotificationType.Loss);
                                                    }
                                                }
                                            }
                                            signalContext.Clients.User(user.Id.ToString()).RemoverEdicao(ordem.Chamada_Id);
                                        }
                                    }
                                    #endregion
                                }

                                //quando a ordem é quebrada em varios valores
                                else if ((string)ws_Payload.x == "TRADE" && (string)ws_Payload.X == "PARTIALLY_FILLED")
                                {
                                    string ordemID = (string)ws_Payload.c;
                                    var    ordem   = _OrdemRepo.EntradaByBinanceOrderID(ordemID);
                                    if (ordem != null && ordem.TipoOrdem_Id == 1)
                                    {
                                        using (var _OrderCommision = new OrdemComissionRepository())
                                        {
                                            var Comission = new OrdemComission
                                            {
                                                Order_Id        = ordem.Id,
                                                ComissionAmount = (decimal)ws_Payload.n,
                                                ComissionAsset  = (string)ws_Payload.N,
                                                QtdExecutada    = (decimal)ws_Payload.z,
                                                ValorExecutado  = (decimal)ws_Payload.p
                                            };
                                            _OrderCommision.Add(Comission);
                                        }
                                    }
                                }

                                //Ordem Expirada
                                else if ((string)ws_Payload.x == "EXPIRED")
                                {
                                    var orderId = (string)ws_Payload.c;
                                    var ordem   = _OrdemRepo.EntradaByBinanceOrderID(orderId);
                                    if (ordem != null)
                                    {
                                        ordem.DataCancelamento = DateTime.UtcNow;
                                        ordem.BinanceStatus_Id = 7;
                                        ordem.OrdemStatus_Id   = 7;
                                        _OrdemRepo.Update(ordem);
                                        signalContext.Clients.User(user.Id.ToString()).RejeitadaMercadoemFalta(ordem.Id);
                                    }
                                }

                                //Ordem Cancelada
                                else if ((string)ws_Payload.x == "CANCELED")
                                {
                                    var orderId   = (string)ws_Payload.C;
                                    var mainOrder = _OrdemRepo.EntradaByBinanceOrderID(orderId);
                                    if (mainOrder != null && mainOrder.MotivoCancelamento_ID == null)
                                    {
                                        Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Ordem Entrada Cancelada) OrderID => " + orderId);
                                        mainOrder.DataCancelamento      = DateTime.UtcNow;
                                        mainOrder.BinanceStatus_Id      = 4;
                                        mainOrder.OrdemStatus_Id        = 4;
                                        mainOrder.MotivoCancelamento_ID = 1;
                                        _OrdemRepo.Update(mainOrder);
                                        signalContext.Clients.User(user.Id.ToString()).OrdemCancelada(mainOrder.MainOrderID == null ? mainOrder.Id : mainOrder.MainOrderID);
                                    }
                                    else
                                    {
                                        Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Ordem OCO Cancelada) Stop_Or_Limit_ID => " + orderId);
                                        var Ocoordem = _OrdemRepo.OcoOrderByBinanceOrderID(orderId);
                                        //venda a mercado
                                        if (Ocoordem != null && Ocoordem.MotivoCancelamento_ID == 2)
                                        {
                                            //A principio nao fazer nada
                                        }
                                        //Edicao Aceita
                                        else if (Ocoordem != null && Ocoordem.MotivoCancelamento_ID == 3)
                                        {
                                            //mainOrder = _OrdemRepo.GetById((int)Ocoordem.MainOrderID);
                                            //if (mainOrder != null && mainOrder.OrdemStatus_Id != 4)
                                            //{
                                            //    signalContext.Clients.User(user.Id.ToString()).OrdemCancelada(Ocoordem.MainOrderID == null ? mainOrder.Id : Ocoordem.MainOrderID);
                                            //    mainOrder.OrdemStatus_Id = 4;
                                            //    mainOrder.BinanceStatus_Id = 4;
                                            //    mainOrder.DataCancelamento = DateTime.UtcNow;
                                            //    _OrdemRepo.Update(mainOrder);
                                            //}
                                        }
                                    }
                                }
                            }
                            //Atualiza saldo
                            if ((string)ws_Payload.e == "outboundAccountPosition")
                            {
                                try
                                {
                                    var listAssets = ws_Payload.B.ToObject <List <B> >();
                                    var castedList = (List <B>)listAssets;
                                    var saldoBtc   = castedList.Where(x => x.a == "BTC").FirstOrDefault().f;
                                    signalContext.Clients.User(user.Id.ToString()).AtualizarSaldo(saldoBtc.ToString("N8"));
                                }
                                catch (Exception)
                                {
                                }
                            }
                        }
                    };

                    ws.OnError += (sender, e) =>
                    {
                        Logs.LogConexao(user.Id + " (" + user.Nome + ") => OnError Event => " + DateTime.UtcNow + " Msg Erro => " + e.Message + " => inner exception => " + e.Exception.Message + " => stack trace => " + e.Exception.StackTrace);
                    };

                    ws.OnClose += (sender, e) =>
                    {
                        try
                        {
                            Logs.LogConexao(user.Id + " (" + user.Nome + ") => OnClose Event => " + DateTime.UtcNow + " code => " + e.Code + " motivo => " + e.Reason);
                            var monitor = WSMonitor.Instancia;
                            monitor.RemoveMonitor(User.Id);
                        }
                        catch
                        {
                        }
                    };
                    ws.Connect();
                }
            }
        }
Esempio n. 11
0
 public HttpResponseMessage IniciarBancoVazio()
 {
     try
     {
         var            res          = BinanceRestApi.GetExchangeInfo();
         List <filters> filterstoAdd = new List <filters>();
         List <Symbol>  SymboltoAdd  = new List <Symbol>();
         if (res.IsSuccessStatusCode)
         {
             var content = res.Content.ReadAsStringAsync().Result;
             var jsonObj = JsonConvert.DeserializeObject <ExchangeInfo>(content);
             _ISymbolRepo.AddRange(jsonObj.symbols.ToList());
             //foreach (var item in jsonObj.symbols)
             //{
             //    var symbol = new Symbol();
             //    symbol.symbol = item.symbol.ToLower();
             //    symbol.status = item.status;
             //    symbol.baseAsset = item.baseAsset;
             //    symbol.baseAssetPrecision = item.baseAssetPrecision;
             //    symbol.quoteAsset = item.quoteAsset;
             //    symbol.quotePrecision = item.quotePrecision;
             //    symbol.orderTypes = item.orderTypes;
             //    symbol.icebergAllowed = item.icebergAllowed;
             //    symbol.ocoAllowed = item.ocoAllowed;
             //    symbol.isSpotTradingAllowed = item.isSpotTradingAllowed;
             //    symbol.isMarginTradingAllowed = item.isMarginTradingAllowed;
             //    foreach (var filteritem in item.filters)
             //    {
             //        var filters = new filters();
             //        filters.Symbol_Id = symbol.Id;
             //        filters.filterType = filteritem.filterType;
             //        //PRICE_FILTER
             //        filters.minPrice = filteritem.minPrice;
             //        filters.maxPrice = filteritem.maxPrice;
             //        filters.tickSize = filteritem.tickSize;
             //        //PERCENT_PRICE
             //        filters.multiplierUp = filteritem.multiplierUp;
             //        filters.multiplierDown = filteritem.multiplierDown;
             //        //LOT_SIZE & MARKET_LOT_SIZE
             //        filters.minQty = filteritem.minQty;
             //        filters.maxQty = filteritem.maxQty;
             //        filters.stepSize = filteritem.stepSize;
             //        //MIN_NOTIONAL
             //        filters.minNotional = filteritem.minNotional;
             //        filters.applyToMarket = filteritem.applyToMarket;
             //        //MIN_NOTIONAL & PERCENT_PRICE
             //        filters.avgPriceMins = filteritem.avgPriceMins;
             //        //ICEBERG_PARTS & MAX_NUM_ORDERS
             //        filters.limit = filteritem.limit;
             //        //MAX_NUM_ALGO_ORDERS
             //        filters.maxNumAlgoOrders = filteritem.maxNumAlgoOrders;
             //        //MAX_NUM_ICEBERG_ORDERS
             //        filters.maxNumIcebergOrders = filteritem.maxNumIcebergOrders;
             //        filterstoAdd.Add(filters);
             //    }
             //    symbol.filters = filterstoAdd;
             //    _ISymbolRepo.Add(symbol);
             //    _ISymbolRepo.Detach(symbol);
             //    filterstoAdd.Clear();
             //_IFiltersRepo.AddRange(filterstoAdd);
             //}
             return(Request.CreateResponse(HttpStatusCode.OK, jsonObj.symbols.Count()));
         }
         else
         {
             var BinanceErrorObj = Helper.GetBinanceErrorObj(res);
             return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceErrorObj));
         }
     }
     catch (Exception ex)
     {
         return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message + " => inner => " + ex.InnerException.Message));
     }
 }
Esempio n. 12
0
        public HttpResponseMessage AtualizarBanco()
        {
            try
            {
                var res = BinanceRestApi.GetExchangeInfo();
                //var jsonObj = JsonConvert.DeserializeObject<ExchangeInfo>(content, new JsonSerializerSettings() { DefaultValueHandling = DefaultValueHandling.Ignore, NullValueHandling = NullValueHandling.Ignore });
                if (res.IsSuccessStatusCode)
                {
                    var content = res.Content.ReadAsStringAsync().Result;
                    var jsonObj = JsonConvert.DeserializeObject <ExchangeInfo>(content);
                    foreach (var item in jsonObj.symbols)
                    {
                        var dbsymbol = _ISymbolRepo.GetBySymbol(item.symbol.ToLower());
                        if (dbsymbol == null)
                        {
                            var symbol = new Symbol();
                            symbol.symbol                 = item.symbol.ToLower();
                            symbol.status                 = item.status;
                            symbol.baseAsset              = item.baseAsset;
                            symbol.baseAssetPrecision     = item.baseAssetPrecision;
                            symbol.quoteAsset             = item.quoteAsset;
                            symbol.quotePrecision         = item.quotePrecision;
                            symbol.orderTypes             = item.orderTypes;
                            symbol.icebergAllowed         = item.icebergAllowed;
                            symbol.ocoAllowed             = item.ocoAllowed;
                            symbol.isSpotTradingAllowed   = item.isSpotTradingAllowed;
                            symbol.isMarginTradingAllowed = item.isMarginTradingAllowed;
                            _ISymbolRepo.Add(symbol);
                            foreach (var filteritem in item.filters)
                            {
                                var filters = new filters();
                                filters.Symbol_Id  = symbol.Id;
                                filters.filterType = filteritem.filterType;
                                //PRICE_FILTER
                                filters.minPrice = filteritem.minPrice;
                                filters.maxPrice = filteritem.maxPrice;
                                filters.tickSize = filteritem.tickSize;
                                //PERCENT_PRICE
                                filters.multiplierUp   = filteritem.multiplierUp;
                                filters.multiplierDown = filteritem.multiplierDown;
                                //LOT_SIZE & MARKET_LOT_SIZE
                                filters.minQty   = filteritem.minQty;
                                filters.maxQty   = filteritem.maxQty;
                                filters.stepSize = filteritem.stepSize;
                                //MIN_NOTIONAL
                                filters.minNotional   = filteritem.minNotional;
                                filters.applyToMarket = filteritem.applyToMarket;
                                //MIN_NOTIONAL & PERCENT_PRICE
                                filters.avgPriceMins = filteritem.avgPriceMins;
                                //ICEBERG_PARTS & MAX_NUM_ORDERS
                                filters.limit = filteritem.limit;
                                //MAX_NUM_ALGO_ORDERS
                                filters.maxNumAlgoOrders = filteritem.maxNumAlgoOrders;
                                //MAX_NUM_ICEBERG_ORDERS
                                filters.maxNumIcebergOrders = filteritem.maxNumIcebergOrders;
                                _IFiltersRepo.Add(filters);
                            }
                        }
                        else
                        {
                            var updatesymbol = dbsymbol;
                            updatesymbol.status                 = item.status;
                            updatesymbol.baseAsset              = item.baseAsset;
                            updatesymbol.baseAssetPrecision     = item.baseAssetPrecision;
                            updatesymbol.quoteAsset             = item.quoteAsset;
                            updatesymbol.quotePrecision         = item.quotePrecision;
                            updatesymbol.orderTypes             = item.orderTypes;
                            updatesymbol.icebergAllowed         = item.icebergAllowed;
                            updatesymbol.ocoAllowed             = item.ocoAllowed;
                            updatesymbol.isSpotTradingAllowed   = item.isSpotTradingAllowed;
                            updatesymbol.isMarginTradingAllowed = item.isMarginTradingAllowed;
                            if (updatesymbol != dbsymbol)
                            {
                                _ISymbolRepo.Update(dbsymbol);
                            }

                            foreach (var filteritem in item.filters)
                            {
                                var oldFilter     = _IFiltersRepo.GetBySymbol_Type(filteritem.filterType, updatesymbol.Id);
                                var Updatefilters = (oldFilter != null) ? oldFilter : new filters();
                                Updatefilters.Symbol_Id  = updatesymbol.Id;
                                Updatefilters.filterType = filteritem.filterType;
                                //PRICE_FILTER
                                Updatefilters.minPrice = filteritem.minPrice;
                                Updatefilters.maxPrice = filteritem.maxPrice;
                                Updatefilters.tickSize = filteritem.tickSize;
                                //PERCENT_PRICE
                                Updatefilters.multiplierUp   = filteritem.multiplierUp;
                                Updatefilters.multiplierDown = filteritem.multiplierDown;
                                //LOT_SIZE & MARKET_LOT_SIZE
                                Updatefilters.minQty   = filteritem.minQty;
                                Updatefilters.maxQty   = filteritem.maxQty;
                                Updatefilters.stepSize = filteritem.stepSize;
                                //MIN_NOTIONAL
                                Updatefilters.minNotional   = filteritem.minNotional;
                                Updatefilters.applyToMarket = filteritem.applyToMarket;
                                //MIN_NOTIONAL & PERCENT_PRICE
                                Updatefilters.avgPriceMins = filteritem.avgPriceMins;
                                //ICEBERG_PARTS & MAX_NUM_ORDERS
                                Updatefilters.limit = filteritem.limit;
                                //MAX_NUM_ALGO_ORDERS
                                Updatefilters.maxNumAlgoOrders = filteritem.maxNumAlgoOrders;
                                //MAX_NUM_ICEBERG_ORDE    RS
                                Updatefilters.maxNumIcebergOrders = filteritem.maxNumIcebergOrders;
                                if (Updatefilters != oldFilter && oldFilter != null)
                                {
                                    _IFiltersRepo.Update(Updatefilters);
                                }
                                else if (oldFilter == null)
                                {
                                    _IFiltersRepo.Add(Updatefilters);
                                }
                            }
                        }
                    }
                    return(Request.CreateResponse(HttpStatusCode.OK, jsonObj.symbols.Count()));
                }
                else
                {
                    var BinanceErrorObj = Helper.GetBinanceErrorObj(res);
                    return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceErrorObj));
                }
            }
            catch (Exception ex)
            {
                return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
            }
        }
        public HttpResponseMessage aceitar([FromBody] AceitarEdicaoViewModel model)
        {
            try
            {
                if (model == null)
                {
                    return(Request.CreateResponse(HttpStatusCode.NotAcceptable, "Campos Inválidos", "text/plain"));
                }
                if (ModelState.IsValid)
                {
                    var userId         = int.Parse(Helper.GetJWTPayloadValue(Request, "id"));
                    var chamadaEditada = _ChamadaEditadaRepo.GetById(model.EdicaoId);
                    var user           = _UserRepo.GetById(userId);
                    var ordem          = _OrdemRepo.GetOcoOrder(userId, model.ChamadaId);
                    ordem.MotivoCancelamento_ID = 3;
                    _OrdemRepo.Update(ordem);

                    //caso tenha cancelado e dado erro pra criar outra oco
                    if (ordem.OrdemStatus_Id == 4 && ordem.BinanceStatus_Id == 4 && ordem.MotivoCancelamento_ID == 3)
                    {
                        string LimitOrderID, StopOrderID;
                        do
                        {
                            LimitOrderID = Helper.GenerateRandomOcoOrderID(10);
                        } while (_OrdemRepo.IsValidOrderID(LimitOrderID));
                        do
                        {
                            StopOrderID = Helper.GenerateRandomOcoOrderID(10);
                        } while (_OrdemRepo.IsValidOrderID(StopOrderID));
                        var limitLoss = Helper.OcoStopLimitWithPercent(ordem.Chamada.Symbol_id, chamadaEditada.NewLoss, 0.5m);
                        //cria uma nova ordem
                        var ocoReturn = BinanceRestApi.SendSaidaOco(user.BinanceAPIKey, user.BinanceAPISecret, ordem.Chamada.Symbol.symbol, ordem.Quantidade, chamadaEditada.NewGain, chamadaEditada.NewLoss, limitLoss, LimitOrderID, StopOrderID);
                        if (ocoReturn.IsSuccessStatusCode)
                        {
                            var edicaoAceita = new EdicaoAceita
                            {
                                Usuario_Id        = userId,
                                TipoEdicao_ID     = 1,
                                DataCadastro      = DateTime.UtcNow,
                                ChamadaEditada_ID = model.EdicaoId,
                                Chamada_ID        = model.ChamadaId
                            };
                            _EdicaoAceitaRepo.Add(edicaoAceita);

                            var ocoRes   = ocoReturn.Content.ReadAsStringAsync().Result;
                            var ocoObj   = JsonConvert.DeserializeObject <dynamic>(ocoRes);
                            var OcoOrder = new Ordem
                            {
                                DataCadastro     = DateTime.UtcNow,
                                DataExecucao     = null,
                                Quantidade       = ordem.Quantidade,
                                Chamada_Id       = ordem.Chamada_Id,
                                Usuario_Id       = user.Id,
                                OrdemStatus_Id   = 3,
                                TipoOrdem_Id     = 2,
                                BinanceStatus_Id = 1,
                                StopOrder_ID     = StopOrderID,
                                LimitOrder_ID    = LimitOrderID,
                                OcoOrderListId   = (string)ocoObj.listClientOrderId,
                                MainOrderID      = ordem.MainOrderID
                            };
                            _OrdemRepo.Add(OcoOrder);

                            var retunrobj = new { PrecoEntrada = ordem.Chamada.PrecoEntrada, NewGain = chamadaEditada.NewGain, NewLoss = chamadaEditada.NewLoss, chamadaId = chamadaEditada.Chamada_Id };
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => Type (Criar Ordem Editada Sucesso) MainOrderID => " + OcoOrder.MainOrderID);
                            return(Request.CreateResponse(HttpStatusCode.OK, retunrobj));
                        }
                        else
                        {
                            var BinanceErrorObj = Helper.GetBinanceErrorObj(ocoReturn);
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => Type (Erro ao Criar Ordem Editada) OcoOrderListID => " + ordem.OcoOrderListId + " code => " + BinanceErrorObj.code + " motivo => " + BinanceErrorObj.msg);
                            return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceErrorObj));
                        }
                    }

                    var res = BinanceRestApi.CancelarOco(user.BinanceAPIKey, user.BinanceAPISecret, ordem.Chamada.Symbol.symbol, ordem.OcoOrderListId);
                    if (res.IsSuccessStatusCode)
                    {
                        ordem.OrdemStatus_Id   = 4;
                        ordem.BinanceStatus_Id = 4;
                        ordem.DataCancelamento = DateTime.UtcNow;
                        _OrdemRepo.Update(ordem);
                        string LimitOrderID, StopOrderID;
                        do
                        {
                            LimitOrderID = Helper.GenerateRandomOcoOrderID(10);
                        } while (_OrdemRepo.IsValidOrderID(LimitOrderID));
                        do
                        {
                            StopOrderID = Helper.GenerateRandomOcoOrderID(10);
                        } while (_OrdemRepo.IsValidOrderID(StopOrderID));
                        var limitLoss = Helper.OcoStopLimitWithPercent(ordem.Chamada.Symbol_id, chamadaEditada.NewLoss, 0.5m);
                        //cria uma nova ordem
                        var ocoReturn = BinanceRestApi.SendSaidaOco(user.BinanceAPIKey, user.BinanceAPISecret, ordem.Chamada.Symbol.symbol, ordem.Quantidade, chamadaEditada.NewGain, chamadaEditada.NewLoss, limitLoss, LimitOrderID, StopOrderID);
                        if (ocoReturn.IsSuccessStatusCode)
                        {
                            var edicaoAceita = new EdicaoAceita
                            {
                                Usuario_Id        = userId,
                                TipoEdicao_ID     = 1,
                                DataCadastro      = DateTime.UtcNow,
                                ChamadaEditada_ID = model.EdicaoId,
                                Chamada_ID        = model.ChamadaId
                            };
                            _EdicaoAceitaRepo.Add(edicaoAceita);

                            var ocoRes   = ocoReturn.Content.ReadAsStringAsync().Result;
                            var ocoObj   = JsonConvert.DeserializeObject <dynamic>(ocoRes);
                            var OcoOrder = new Ordem
                            {
                                DataCadastro     = DateTime.UtcNow,
                                DataExecucao     = null,
                                Quantidade       = ordem.Quantidade,
                                Chamada_Id       = ordem.Chamada_Id,
                                Usuario_Id       = user.Id,
                                OrdemStatus_Id   = 3,
                                TipoOrdem_Id     = 2,
                                BinanceStatus_Id = 1,
                                StopOrder_ID     = StopOrderID,
                                LimitOrder_ID    = LimitOrderID,
                                OcoOrderListId   = (string)ocoObj.listClientOrderId,
                                MainOrderID      = ordem.MainOrderID
                            };
                            _OrdemRepo.Add(OcoOrder);

                            var retunrobj = new { PrecoEntrada = ordem.Chamada.PrecoEntrada, NewGain = chamadaEditada.NewGain, NewLoss = chamadaEditada.NewLoss, chamadaId = chamadaEditada.Chamada_Id };
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => Type (Criar Ordem Editada Sucesso) => OrderId => " + OcoOrder.Id + " =>  MainOrderID => " + OcoOrder.MainOrderID);
                            return(Request.CreateResponse(HttpStatusCode.OK, retunrobj));
                        }
                        else
                        {
                            var BinanceErrorObj = Helper.GetBinanceErrorObj(ocoReturn);
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => Type (Erro ao Criar Ordem Editada) OcoOrderListID => " + ordem.OcoOrderListId + " code => " + BinanceErrorObj.code + " motivo => " + BinanceErrorObj.msg);
                            return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceErrorObj));
                        }
                    }
                    else
                    {
                        var BinanceErrorObj = Helper.GetBinanceErrorObj(res);
                        Logs.LogOrdem(user.Id + " (" + user.Email + ") => Type (Erro ao Cancelar Ordem Para Aceitar Edição) OcoOrderListID => " + ordem.OcoOrderListId + " code => " + BinanceErrorObj.code + " motivo => " + BinanceErrorObj.msg);
                        return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceErrorObj));
                    }
                }
                var modelstateError = ModelStateErrors.DisplayModelStateError(ModelState);
                return(Request.CreateResponse(HttpStatusCode.NotAcceptable, modelstateError, "text/plain"));
            }
            catch (Exception ex)
            {
                return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
            }
        }
        public HttpResponseMessage Post([FromBody] CreateChamadaViewModel ViewModel)
        {
            try
            {
                if (ViewModel == null)
                {
                    return(Request.CreateResponse(HttpStatusCode.NotAcceptable, "Campos Inválidos", "text/plain"));
                }
                if (ModelState.IsValid)
                {
                    #region Binance
                    var    userId         = int.Parse(Helper.GetJWTPayloadValue(Request, "id"));
                    var    user           = _UserRepo.GetById(userId);
                    var    chamada        = _ChamadasRepo.GetWith_Symbol_and_Filter(ViewModel.id);
                    var    ordemType      = BinanceHelper.getEntradaOrderType(chamada);
                    string BinanceOrderID = "";
                    if (!BinanceHelper.ValidateFilterPrice(chamada.Symbol.filters.Where(x => x.filterType == "PRICE_FILTER").FirstOrDefault(), ViewModel.qtd))
                    {
                        return(Request.CreateResponse(HttpStatusCode.BadRequest, new BinanceErrors {
                            code = 0, motivo = "Quantidade Inválida"
                        }));
                    }

                    do
                    {
                        BinanceOrderID = Helper.GenerateRandomOcoOrderID(10);
                    } while (_OrdemRepo.IsValidOrderID(BinanceOrderID));

                    HttpResponseMessage BinanceResult = BinanceRestApi.SendOrdemEntrada(user.BinanceAPIKey, user.BinanceAPISecret, ordemType, chamada.Symbol.symbol, ViewModel.qtd, chamada.PrecoEntrada, chamada.RangeEntrada, BinanceOrderID);
                    #endregion
                    if (BinanceResult.IsSuccessStatusCode)
                    {
                        var ordem = new Ordem()
                        {
                            DataCadastro     = DateTime.UtcNow,
                            DataExecucao     = null,
                            Quantidade       = (decimal)ViewModel.qtd,
                            Chamada_Id       = ViewModel.id,
                            Usuario_Id       = user.Id,
                            OrdemStatus_Id   = 1,
                            TipoOrdem_Id     = 1,
                            BinanceStatus_Id = 1,
                            OrderID          = BinanceOrderID
                        };
                        Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Aceitar Chamada Sucesso) ChamadaID => " + chamada.Id);
                        _OrdemRepo.Add(ordem);
                        var objanonimo = new
                        {
                            Id           = ordem.Id,
                            TipoOrdem    = 1,
                            Status_id    = ordem.OrdemStatus_Id,
                            DataCadastro = ordem.DataCadastro,
                            Quantidade   = ordem.Quantidade.ToString("N8"),
                            Chamada_Id   = ordem.Chamada_Id,
                            Symbol       = chamada.Symbol.symbol,
                            Descricao    = "Aguardando Entrada",
                            PrecoEntrada = chamada.PrecoEntrada.ToString("N8"),
                            PrecoGain    = chamada.PrecoGain.ToString("N8"),
                            PrecoLoss    = chamada.PrecoLoss.ToString("N8"),
                            RangeEntrada = chamada.RangeEntrada.ToString("N8"),
                            observacao   = chamada.Observacao
                        };
                        //necessario porque o kra pode estar logado no app e na web ao mesmo tempo e tentar enviar nos dois
                        _signalContext.Clients.User(userId.ToString()).RemoverChamada(chamada.Id);
                        _signalContext.Clients.User("admin").AddPosicionado(chamada.Id);
                        return(Request.CreateResponse(HttpStatusCode.OK, objanonimo));
                    }
                    else
                    {
                        var BinanceerrorObj = Helper.GetBinanceErrorObj(BinanceResult);
                        Logs.LogOrdem(user.Id + " (" + user.Email + ") => Type (Aceitar Chamada Erro) ChamadaID => " + chamada.Id + " code => " + BinanceerrorObj.code + " motivo => " + BinanceerrorObj.msg);
                        return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceerrorObj));
                    }
                }
                var modelstateError = ModelStateErrors.DisplayModelStateError(ModelState);
                return(Request.CreateResponse(HttpStatusCode.NotAcceptable, modelstateError, "text/plain"));
            }
            catch (Exception ex)
            {
                return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
            }
        }
Esempio n. 15
0
        public HttpResponseMessage VenderMercado(int id)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var userId = int.Parse(Helper.GetJWTPayloadValue(Request, "id"));
                    var user   = _UserRepo.GetById(userId);
                    //alterar pra receber como parametro chamada id
                    var OriginalOrder = _OrdemRepo.GetById(id);
                    var ordem         = _OrdemRepo.GetOcoOrder(userId, OriginalOrder.Chamada_Id);
                    ordem.MotivoCancelamento_ID = 2;
                    _OrdemRepo.Update(ordem);


                    //caso tenha cancelado e tenha dado erro pra criar venda a mercado
                    if (ordem.OrdemStatus_Id == 4 && ordem.BinanceStatus_Id == 4 && ordem.MotivoCancelamento_ID == 2)
                    {
                        string BinanceOrderID;
                        do
                        {
                            BinanceOrderID = Helper.GenerateRandomOcoOrderID(10);
                        } while (_OrdemRepo.IsValidOrderID(BinanceOrderID));
                        var     listAssets      = _OrdemComissionRepo.GetOrderComissions(id);
                        decimal SaldoQuantidade = Helper.ArredondarQuantidadeVenda(listAssets, OriginalOrder);
                        var     resMarket       = BinanceRestApi.VenderMercado(user.BinanceAPIKey, user.BinanceAPISecret, ordem.Chamada.Symbol.symbol, SaldoQuantidade, BinanceOrderID);
                        if (resMarket.IsSuccessStatusCode)
                        {
                            var BinanceContent = resMarket.Content.ReadAsStringAsync().Result;
                            var BinanceResult  = JsonConvert.DeserializeObject <NewOrder>(BinanceContent);
                            var newOrder       = new Ordem
                            {
                                BinanceStatus_Id  = 3,
                                OrdemStatus_Id    = 2,
                                OrderID           = BinanceOrderID,
                                Chamada_Id        = OriginalOrder.Chamada_Id,
                                DataCadastro      = DateTime.UtcNow,
                                TipoOrdem_Id      = 3,
                                Quantidade        = ordem.Quantidade,
                                Usuario_Id        = userId,
                                MainOrderID       = OriginalOrder.Id,
                                PrecoVendaMercado = BinanceResult.fills.FirstOrDefault().price
                            };
                            _OrdemRepo.Add(newOrder);
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Vender a Mercado Sucesso) MainOrderId =>  " + OriginalOrder.Id);
                            OriginalOrder.OrdemStatus_Id    = 2;
                            OriginalOrder.BinanceStatus_Id  = 3;
                            OriginalOrder.PrecoVendaMercado = BinanceResult.fills.FirstOrDefault().price;
                            _OrdemRepo.Update(OriginalOrder);
                            return(Request.CreateResponse(HttpStatusCode.OK, OriginalOrder));
                        }
                        else
                        {
                            var BinanceerrorObj = Helper.GetBinanceErrorObj(resMarket);
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Vender a Mercado Erro) MainOrderId => " + OriginalOrder.Id + " code => " + BinanceerrorObj.code + " motivo => " + BinanceerrorObj.msg);
                            return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceerrorObj));
                        }
                    }

                    var res = BinanceRestApi.CancelarOco(user.BinanceAPIKey, user.BinanceAPISecret, ordem.Chamada.Symbol.symbol, ordem.OcoOrderListId);
                    if (res.IsSuccessStatusCode)
                    {
                        ordem.BinanceStatus_Id = 4;
                        ordem.OrdemStatus_Id   = 4;
                        ordem.DataCancelamento = DateTime.UtcNow;
                        _OrdemRepo.Update(ordem);

                        string BinanceOrderID;
                        do
                        {
                            BinanceOrderID = Helper.GenerateRandomOcoOrderID(10);
                        } while (_OrdemRepo.IsValidOrderID(BinanceOrderID));
                        var     listAssets      = _OrdemComissionRepo.GetOrderComissions(id);
                        decimal SaldoQuantidade = Helper.ArredondarQuantidadeVenda(listAssets, OriginalOrder);
                        var     resMarket       = BinanceRestApi.VenderMercado(user.BinanceAPIKey, user.BinanceAPISecret, ordem.Chamada.Symbol.symbol, SaldoQuantidade, BinanceOrderID);
                        if (resMarket.IsSuccessStatusCode)
                        {
                            var BinanceContent = resMarket.Content.ReadAsStringAsync().Result;
                            var BinanceResult  = JsonConvert.DeserializeObject <NewOrder>(BinanceContent);
                            var newOrder       = new Ordem
                            {
                                BinanceStatus_Id  = 3,
                                OrdemStatus_Id    = 2,
                                OrderID           = BinanceOrderID,
                                Chamada_Id        = OriginalOrder.Chamada_Id,
                                DataCadastro      = DateTime.UtcNow,
                                TipoOrdem_Id      = 3,
                                Quantidade        = ordem.Quantidade,
                                Usuario_Id        = userId,
                                MainOrderID       = OriginalOrder.Id,
                                PrecoVendaMercado = BinanceResult.fills.FirstOrDefault().price
                            };
                            _OrdemRepo.Add(newOrder);
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Vender a Mercado Sucesso) MainOrderId =>  " + OriginalOrder.Id);
                            OriginalOrder.OrdemStatus_Id    = 2;
                            OriginalOrder.BinanceStatus_Id  = 3;
                            OriginalOrder.PrecoVendaMercado = BinanceResult.fills.FirstOrDefault().price;
                            _OrdemRepo.Update(OriginalOrder);
                            return(Request.CreateResponse(HttpStatusCode.OK, OriginalOrder));
                        }
                        else
                        {
                            var BinanceerrorObj = Helper.GetBinanceErrorObj(resMarket);
                            Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Vender a Mercado Erro) MainOrderId => " + OriginalOrder.Id + " code => " + BinanceerrorObj.code + " motivo => " + BinanceerrorObj.msg);
                            return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceerrorObj));
                        }
                    }
                    else
                    {
                        var BinanceErrorObj = Helper.GetBinanceErrorObj(res);
                        Logs.LogOrdem(user.Id + " (" + user.Email + ") => " + DateTime.UtcNow + " => Type (Erro ao Cancelar Ordem Oco Para Venda a Mercado) OcoOrderListID => " + ordem.OcoOrderListId + " code => " + BinanceErrorObj.code + " motivo => " + BinanceErrorObj.msg);
                        return(Request.CreateResponse(HttpStatusCode.BadRequest, BinanceErrorObj));
                    }
                }
                var modelstateError = ModelStateErrors.DisplayModelStateError(ModelState);
                return(Request.CreateResponse(HttpStatusCode.NotAcceptable, modelstateError, "text/plain"));
            }
            catch (Exception ex)
            {
                return(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message));
            }
        }