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