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 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)); } }