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