public CreateScheduledTradesResponse CreateScheduledTrade(CreateScheduledTradesRequest request) { CreateScheduledTradesResponse response = new CreateScheduledTradesResponse { Success = true, Error = "" }; if (request.Trade == null) { response.Success = false; response.Error = "No trade provided"; return(response); } List <Trade_Criteria> newCriterias = new List <Trade_Criteria>(); foreach (var tradeCriteria in request.Trade.TradeCriteria) { newCriterias.Add(new Trade_Criteria { EcoIndexType = tradeCriteria.EcoIndexType, CriteriaValueType = tradeCriteria.CriteriaValueType, Value = tradeCriteria.Value, Weight = tradeCriteria.Weight }); } Exchange_Pairs pair = db.Exchange_Pairs.FirstOrDefault(p => p.Symbol1.ToLower() == request.Trade.ExchangePair.Symbol1.ToLower() && p.Symbol2.ToLower() == request.Trade.ExchangePair.Symbol2.ToLower() && p.ExchangeType == request.Trade.ExchangePair.ExchangeType); Trade_Trades newTrade = new Trade_Trades { UserNr = request.UserNr, CreationDate = DateTime.Now, Value = request.Trade.Value, ExchangePairNr = pair.PairNr, TradeAction = request.Trade.TradeAction, TradeStatus = (int)TradeStatusTypeEnum.Pending, Trade_Criteria = newCriterias }; try { db.Trade_Trades.Add(newTrade); db.SaveChanges(); } catch (Exception e) { _logger.ErrorFormat($"error happend error: {e.Message} stacktrace: {e.StackTrace}"); response.Success = false; response.Error = "An error occured in user creation please check logs for more details"; } return(response); }
public GetScheduledTradesResponse GetScheduledTrades(GetScheduledTradesRequest request) { GetScheduledTradesResponse response = new GetScheduledTradesResponse { Success = true, Error = "" }; try { List <Trade_Trades> trades = db.Trade_Trades.Where(t => t.UserNr == request.UserNr).ToList(); if (trades.Count > 0) { List <ScheduledTrade> finalTrades = Mapper.Map <List <ScheduledTrade> >(trades); foreach (ScheduledTrade trade in finalTrades) { List <Trade_Criteria> criterias = db.Trade_Criteria.Where(c => c.TradeNr == trade.TradeNr).ToList(); trade.TradeCriteria = Mapper.Map <List <TradeCriteria> >(criterias); Exchange_Pairs dbPair = db.Exchange_Pairs.FirstOrDefault(p => p.PairNr == trade.ExchangePairNr); if (dbPair == null) { response.Success = false; response.Error = $"Wrong format trade request found {trade.TradeNr} remove it manually before all trades can be loaded"; return(response); } trade.ExchangePair = Mapper.Map <ExchangePair>(dbPair); } response.Trades = finalTrades; } } catch (Exception e) { _logger.ErrorFormat($"error happend error: {e.Message} stacktrace: {e.StackTrace}"); response.Success = false; response.Error = "An error occured in user creation please check logs for more details"; } return(response); }
public RecalculateActionsResponse RecalculateActions(RecalculateActionsRequest request) { List <Trade_Trades> allTrades = db.Trade_Trades.Where(t => t.TradeStatus != (int)TradeStatusTypeEnum.Failed && t.TradeStatus != (int)TradeStatusTypeEnum.Completed).ToList(); Dictionary <int, List <EcoIndex> > allNewEcoIndexes = GetAllExchangeEcoIndexValues(); foreach (Trade_Trades trade in allTrades) { List <Trade_Criteria> tradeCriterias = db.Trade_Criteria.Where(t => t.TradeNr == trade.TradeNr).ToList(); Exchange_Pairs exchangePair = db.Exchange_Pairs.FirstOrDefault(t => t.PairNr == trade.ExchangePairNr); decimal successWeight = 0M; decimal totalWeight = tradeCriterias.Sum(tc => tc.Weight); if (exchangePair != null) { foreach (Trade_Criteria criteria in tradeCriterias) { EcoIndex criteriaIndex = allNewEcoIndexes.FirstOrDefault(i => i.Key == exchangePair.ExchangeType).Value.FirstOrDefault(e => (int)e.Id == criteria.EcoIndexType); if (criteriaIndex != null) { if (criteria.CriteriaValueType == (int)CriteriaValueType.Above) { if (criteriaIndex.Value > criteria.Value) { successWeight += criteria.Weight; } } else if (criteria.CriteriaValueType == (int)CriteriaValueType.AboveOrEqual) { if (criteriaIndex.Value >= criteria.Value) { successWeight += criteria.Weight; } } else if (criteria.CriteriaValueType == (int)CriteriaValueType.Equal) { if (criteriaIndex.Value == criteria.Value) { successWeight += criteria.Weight; } } else if (criteria.CriteriaValueType == (int)CriteriaValueType.BelowOrEqual) { if (criteriaIndex.Value <= criteria.Value) { successWeight += criteria.Weight; } } else if (criteria.CriteriaValueType == (int)CriteriaValueType.Below) { if (criteriaIndex.Value < criteria.Value) { successWeight += criteria.Weight; } } } if (successWeight >= totalWeight) { trade.TradeStatus = (int)TradeStatusTypeEnum.Valid; db.SaveChanges(); if (exchangePair.ExchangeType == (int)ExchangeTypeEnum.Cex) { User_Keys key = db.User_Keys.FirstOrDefault(k => k.UserNr == trade.UserNr && k.ExchangeType == exchangePair.ExchangeType); if (key != null) { CexTradeRequest cexRequest = new CexTradeRequest { Amount = trade.Value, Nonce = (154264078495300 + new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds()).ToString(), Price = 1M, Symbol1 = exchangePair.Symbol1.ToUpper(), Symbol2 = exchangePair.Symbol2.ToUpper(), Type = trade.TradeAction == (int)TradeActionType.Buy ? "buy" : "sell", Key = key.KeyValue, Secret = key.SecretValue, }; CexTradeResponse cexResponse = _cexManager.PerformTrade(cexRequest); if (cexResponse.Completed) { trade.TradeStatus = (int)TradeStatusTypeEnum.Completed; db.SaveChanges(); } else { trade.TradeStatus = (int)TradeStatusTypeEnum.Failed; db.SaveChanges(); } } else { trade.TradeStatus = (int)TradeStatusTypeEnum.Failed; db.SaveChanges(); } } else { User_Keys key = db.User_Keys.FirstOrDefault(k => k.UserNr == trade.UserNr && k.ExchangeType == exchangePair.ExchangeType); if (key != null) { PoloniexTradeRequest poloniexRequest = new PoloniexTradeRequest { Amount = trade.Value, Command = trade.TradeAction == (int)TradeActionType.Buy ? "buy" : "sell", CurrencyPair = exchangePair.Symbol1.ToUpper() + "_" + exchangePair.Symbol2.ToUpper(), Nonce = (154264078495300 + new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds()).ToString(), Rate = 1M }; PoloniexTradeResponse poloniexTradeResponse = _poloniexManager.PerformTrade(poloniexRequest, key.KeyValue, key.SecretValue); if (poloniexTradeResponse.ResultingTrades?.Count > 0) { trade.TradeStatus = (int)TradeStatusTypeEnum.Completed; db.SaveChanges(); } else { trade.TradeStatus = (int)TradeStatusTypeEnum.Failed; db.SaveChanges(); } } else { trade.TradeStatus = (int)TradeStatusTypeEnum.Failed; db.SaveChanges(); } } } } } } return(new RecalculateActionsResponse { Success = true, Error = "" }); }