private void LoadEventsFromDb()
        {
            try
            {
                var plainList = new List <UserEvent>();
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    foreach (var evt in ctx.USER_EVENT)
                    {
                        plainList.Add(LinqToEntity.DecorateUserEvent(evt));
                    }

                    // удалить старые сообщения
                    ctx.ClearOldUserEvents(new DateTime(1900, 1, 1));
                }

                // заполнить список
                var dic = plainList.GroupBy(x => x.User).ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
                userEvent.Clear();
                foreach (var evt in dic)
                {
                    userEvent.UpdateValues(evt.Key, evt.Value);
                }
                Logger.InfoFormat("Прочитано {0} записей USER_EVENT", plainList.Count);
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в UserEventStorage.LoadEventsFromDb()", ex);
            }
        }
        public PaymentSystemTransfer GetTransferById(int id)
        {
            PaymentSystemTransfer result;

            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var ps = (from x in ctx.PAYMENT_SYSTEM_TRANSFER
                              where x.Id == id
                              select new { transfer = x,
                                           paySys = x.USER_PAYMENT_SYSTEM != null ? (PaymentSystem)x.USER_PAYMENT_SYSTEM.SystemPayment : PaymentSystem.Unknown,
                                           wallet = x.USER_PAYMENT_SYSTEM != null ? ctx.WALLET.FirstOrDefault(w => w.User == x.USER_PAYMENT_SYSTEM.UserId) : null }).Single();


                    result        = LinqToEntity.DecoratePaymentSystemTransfer(ps.transfer);
                    result.Wallet = ps.wallet != null?LinqToEntity.DecorateWallet(ps.wallet) : new Wallet();

                    result.PaymentSys = ps.paySys;
                }
            }
            catch (Exception ex)
            {
                Logger.Error("GetUnknownTransfers()", ex);
                return(null);
            }
            return(result);
        }
        public void Setup()
        {
            // подготовить свежие котировки
            QuoteMaker.FillQuoteStorageWithDefaultValues();

            // соединение и тестовые данные
            TradeSharpConnectionPersistent.RestoreCsvFilesInMoqDbFolder();
            conn = TradeSharpConnectionPersistent.InitializeTradeSharpConnection();
            MakeTestData();

            // словари
            TradeSharpDictionary.Initialize(MoqTradeSharpDictionary.Mock);

            // тестируемый менеджер
            ManagerTrade.MakeTestInstance(
                new Dictionary <string, IDealer>
            {
                { testAccount.AccountGroup,
                  new DemoDealer.DemoDealer(new DealerDescription(), conn.ACCOUNT_GROUP.Select(g => g.Code).ToList()) }
            });
            managerTrade = ManagerTrade.Instance;
            var mockAccountRepository = new Mock <IAccountRepository>();

            mockAccountRepository.Setup(s => s.GetAccount(It.IsAny <int>())).Returns(
                (int id) => LinqToEntity.DecorateAccount(testAccount));
            managerTrade.accountRepository = mockAccountRepository.Object;

            managerTrade.orderRepository = OrderRepository.Instance;
        }
 public ActionResult EditDealerDetails(string code)
 {
     using (var ctx = DatabaseContext.Instance.Make())
     {
         return(View(LinqToEntity.DecorateDealerDescription(ctx.DEALER.FirstOrDefault(x => x.Code == code))));
     }
 }
Exemple #5
0
 public AuthenticationResponse GetUserDetail(string login, string password, out PlatformUser userDecorated)
 {
     userDecorated = null;
     using (var dbContext = DatabaseContext.Instance.Make())
     {
         try
         {
             var user = dbContext.PLATFORM_USER.FirstOrDefault(u => u.Login == login);
             if (user == null)
             {
                 return(AuthenticationResponse.InvalidAccount);
             }
             if (user.Password != password)
             {
                 return(AuthenticationResponse.WrongPassword);
             }
             userDecorated = LinqToEntity.DecoratePlatformUser(user);
             return(AuthenticationResponse.OK);
         }
         catch (Exception ex)
         {
             Logger.ErrorFormat("Ошибка в GetUserDetail({0}) : {1}", login, ex);
             return(AuthenticationResponse.ServerError);
         }
     }
 }
        private void StoreEventsInDb(object logMsg)
        {
            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    // удалить старые сообщения
                    ctx.ClearOldUserEvents(new DateTime(1900, 1, 1));
                    // сохранить новые
                    var countTotal = 0;
                    var events     = userEvent.ReceiveAllData();
                    foreach (var evtList in events)
                    {
                        var evtToSave = evtList.Value.Take(100).Reverse().ToList();
                        countTotal += evtToSave.Count;
                        foreach (var evt in evtToSave)
                        {
                            var usEvt = LinqToEntity.UndecorateUserEvent(evt);
                            ctx.USER_EVENT.Add(usEvt);
                        }
                    }

                    ctx.SaveChanges();
                    if ((bool)logMsg)
                    {
                        Logger.InfoFormat("Сохранено {0} записей USER_EVENT", countTotal);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в UserEventStorage.StoreEventsInDb()", ex);
            }
        }
Exemple #7
0
 /// <summary>
 /// получить список отложенных ордеров
 /// </summary>
 public RequestStatus GetPendingOrders(int accountId, out List <PendingOrder> orders)
 {
     orders = new List <PendingOrder>();
     try
     {
         using (var ctx = DatabaseContext.Instance.Make())
         {
             var pendingOrders = from ord in ctx.PENDING_ORDER
                                 where ord.AccountID == accountId
                                 select ord;
             // ReSharper disable LoopCanBeConvertedToQuery
             foreach (var ord in pendingOrders) // нельзя рефакторить
             // ReSharper restore LoopCanBeConvertedToQuery
             {
                 orders.Add(LinqToEntity.DecoratePendingOrder(ord));
             }
         }
     }
     catch (Exception ex)
     {
         Logger.Error("Ошибка при получении списка отложенных ордеров", ex);
         return(RequestStatus.ServerError);
     }
     return(RequestStatus.OK);
 }
        public void InitTest()
        {
            // забить котировки
            QuoteMaker.FillQuoteStorageWithDefaultValues();

            // словари
            TradeSharpDictionary.Initialize(MoqTradeSharpDictionary.Mock);

            tradeManager = new TradeManager(
                null,
                null,
                QuoteStorage.Instance, accountId =>
            {
                // ReSharper disable ConvertToLambdaExpression
                return(LinqToEntity.DecorateAccountGroup(conn.ACCOUNT.First(a => a.ID == accountId).ACCOUNT_GROUP));
                // ReSharper restore ConvertToLambdaExpression
            });

            // временно удалить файл начального наполнения (открытые ордера)
            TradeSharpConnectionPersistent.RestoreCsvFilesInMoqDbFolder();
            TradeSharpConnectionPersistent.RenameCsvFilesContainingAccountDataInMoqDbFolder();
            conn = TradeSharpConnectionPersistent.InitializeTradeSharpConnection();

            MakeTestData();
        }
Exemple #9
0
 /// <summary>
 /// получить закрытые ордера по дате закрытия
 /// </summary>
 public RequestStatus GetHistoryOrdersByCloseDate(int?accountId, DateTime?startDate,
                                                  out List <MarketOrder> orders)
 {
     using (var ctx = DatabaseContext.Instance.Make())
     {
         try
         {
             var positions = from pos in ctx.POSITION_CLOSED
                             where
                             pos.AccountID == (accountId ?? pos.AccountID) &&
                             (pos.TimeExit >= startDate) || (!startDate.HasValue)
                             select pos;
             orders = new List <MarketOrder>();
             // ReSharper disable LoopCanBeConvertedToQuery
             foreach (var position in positions)
             // ReSharper restore LoopCanBeConvertedToQuery
             {
                 orders.Add(LinqToEntity.DecorateOrder(position));
             }
             return(RequestStatus.OK);
         }
         catch (Exception ex)
         {
             orders = null;
             Logger.ErrorFormat("Ошибка в GetHistoryOrdersByCloseDate({0}): {1}", accountId, ex);
             return(RequestStatus.ServerError);
         }
     }
 }
Exemple #10
0
 /// <summary>
 /// получить список открытых позиций
 /// </summary>
 public RequestStatus GetMarketOrders(int accountId, out List <MarketOrder> orders)
 {
     using (var ctx = DatabaseContext.Instance.Make())
         try
         {
             var positions = from pos in ctx.POSITION
                             where (pos.State == (int)(PositionState.Opened) || pos.State == (int)(PositionState.StartOpened) ||
                                    pos.State == (int)(PositionState.StartClosed)) && pos.AccountID == accountId
                             select pos;
             orders = new List <MarketOrder>();
             // ReSharper disable LoopCanBeConvertedToQuery
             foreach (var position in positions)
             // ReSharper restore LoopCanBeConvertedToQuery
             {
                 orders.Add(LinqToEntity.DecorateOrder(position));
             }
             return(RequestStatus.OK);
         }
         catch (Exception ex)
         {
             orders = null;
             Logger.ErrorFormat("Ошибка в GetMarketOrders({0}): {1}", accountId, ex);
             return(RequestStatus.ServerError);
         }
 }
        /// <summary>
        /// Добавляем в базу новую сущность
        /// </summary>
        /// <param name="newTopPortfolio">Объект содержит значения полей для новой сущность</param>
        /// <returns></returns>
        private static TopPortfolio AddTopPortfolio(TopPortfolioItem newTopPortfolio)
        {
            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var topPortfolio = new TOP_PORTFOLIO
                    {
                        Name             = newTopPortfolio.Name,
                        Criteria         = newTopPortfolio.Criteria,
                        ParticipantCount = newTopPortfolio.ParticipantCount,
                        DescendingOrder  = newTopPortfolio.DescendingOrder,
                        MarginValue      = newTopPortfolio.MarginValue,
                        ManagedAccount   = newTopPortfolio.ManagedAccount
                    };

                    ctx.TOP_PORTFOLIO.Add(topPortfolio);
                    ctx.SaveChanges();

                    return(LinqToEntity.DecoratePortfolio(topPortfolio));
                }
            }
            catch (Exception ex)
            {
                Logger.Error("AddTopPortfolio", ex);
                return(null);
            }
        }
Exemple #12
0
        public Wallet GetUserWallet(ProtectedOperationContext secCtx, string userLogin)
        {
            // запрос разрешен?
            if (!UserSessionStorage.Instance.PermitUserOperation(secCtx, false, false))
            {
                return(null);
            }

            // получить кошелек пользователя и вернуть его
            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var queryWallet = from us in ctx.PLATFORM_USER where us.Login == userLogin select us.WALLET;

                    foreach (var walInf in queryWallet)
                    {
                        var wallet = LinqToEntity.DecorateWallet(walInf);
                        return(wallet);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("GetUserWallet({0}) - exception: {1}", userLogin, ex);
            }

            return(null);
        }
        public PaymentTransferModel GetTransfers()
        {
            var result = new PaymentTransferModel();

            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var ps = (from x in ctx.PAYMENT_SYSTEM_TRANSFER
                              where x.Transfer == null
                              select new { transfer = x,
                                           paySys = x.USER_PAYMENT_SYSTEM != null ? (PaymentSystem)x.USER_PAYMENT_SYSTEM.SystemPayment : PaymentSystem.Unknown,
                                           wallet = x.USER_PAYMENT_SYSTEM != null ? ctx.WALLET.FirstOrDefault(w => w.User == x.USER_PAYMENT_SYSTEM.UserId) : null }).ToList();

                    foreach (var p in ps)
                    {
                        var decorP = LinqToEntity.DecoratePaymentSystemTransfer(p.transfer);
                        decorP.PaymentSys = p.paySys;
                        if (p.wallet != null)
                        {
                            decorP.Wallet = LinqToEntity.DecorateWallet(p.wallet);
                        }

                        result.UndefinedPaymentTransfer.Add(decorP);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("GetUnknownTransfers()", ex);
                return(null);
            }
            return(result);
        }
Exemple #14
0
        public bool SavePendingOrder(PendingOrder order, out int orderID)
        {
            orderID = -1;
            using (var ctx = DatabaseContext.Instance.Make())
            {
                var account = ctx.ACCOUNT.FirstOrDefault(ac => ac.ID == order.AccountID);
                if (account == null)
                {
                    return(false);
                }

                // найти парный ордер, чтобы прописать OCO
                PENDING_ORDER pairOrder = null;

                if (order.PairOCO.HasValue && order.PairOCO.Value > 0)
                {
                    pairOrder = ctx.PENDING_ORDER.FirstOrDefault(o => o.ID == order.PairOCO.Value);
                    if (pairOrder == null)
                    {
                        order.PairOCO = null;
                    }
                    else
                    {
                        var anotherPair = ctx.PENDING_ORDER.FirstOrDefault(o => o.ID == pairOrder.ID);
                        if (anotherPair != null)
                        {
                            anotherPair.PairOCO          = null;
                            ctx.Entry(anotherPair).State = EntityState.Modified;
                        }
                    }
                }

                var pendingOrder = LinqToEntity.UndecorateLiveActiveOrder(order);
                account.PENDING_ORDER.Add(pendingOrder);

                try
                {
                    ctx.SaveChanges();
                    orderID = pendingOrder.ID;

                    // таки прописать ID парному ордеру
                    if (pairOrder != null)
                    {
                        pairOrder.PairOCO = orderID;
                        ctx.SaveChanges();
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error("Ошибка сохранения сущности PENDING_ORDER", ex);
                    ServiceManagerClientManagerProxy.Instance.NewOrderResponse(null,
                                                                               RequestStatus.ServerError, "crudsav");
                    return(false);
                }
            }
            // отправить уведомление клиенту
            ServiceManagerClientManagerProxy.Instance.NewPendingOrderResponse(order, RequestStatus.OK, "");
            return(true);
        }
        public Account GetAccountDetail(string hash, string userLogin, long localTime,
                                        int accountId, bool calculateEquity,
                                        out decimal brokerLeverage, out decimal exposure)
        {
            brokerLeverage = 0;
            exposure       = 0;

            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var user = ctx.PLATFORM_USER.FirstOrDefault(u => u.Login == userLogin);
                    if (user == null)
                    {
                        return(null);
                    }

                    var userHash = CredentialsHash.MakeCredentialsHash(userLogin, user.Password, localTime);
                    if (userHash != hash)
                    {
                        return(null);
                    }

                    // авторизован?
                    if (!PlatformUser.IsManager(user.RoleMask) && !PlatformUser.IsAdmin(user.RoleMask))
                    {
                        if (!ctx.PLATFORM_USER_ACCOUNT.Any(pa => pa.PlatformUser == user.ID && pa.Account == accountId))
                        {
                            return(null);
                        }
                    }

                    var account = LinqToEntity.DecorateAccount(ctx.ACCOUNT.First(a => a.ID == accountId));
                    if (!calculateEquity)
                    {
                        return(account);
                    }

                    // получить открытые ордера по счету
                    var orders = ctx.POSITION.Where(p => p.AccountID == accountId && p.State ==
                                                    (int)PositionState.Opened).ToList().Select(LinqToEntity.DecorateOrder).ToList();

                    // посчитать открытый результат и экспозицию в валюте депо
                    var quotes = QuoteStorage.Instance.ReceiveAllData();
                    var errors = new List <string>();
                    exposure = DalSpot.Instance.CalculateExposure(orders, quotes, account.Currency, errors);
                    var group = ctx.ACCOUNT_GROUP.First(g => g.Code == account.Group);
                    brokerLeverage     = group.BrokerLeverage;
                    account.UsedMargin = exposure / brokerLeverage;
                    return(account);
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в GetAccountDetail()", ex);
                return(null);
            }
        }
Exemple #16
0
        public bool DeletePendingOrder(PendingOrder orderDecorated,
                                       PendingOrderStatus status, int?positionID, string closeReason)
        {
            var order = LinqToEntity.UndecorateLiveActiveOrder(orderDecorated);

            using (var ctx = DatabaseContext.Instance.Make())
            {
                // получить текущую цену
                var pair        = QuoteStorage.Instance.ReceiveValue(order.Symbol);
                var priceClosed = pair == null ? 0 : order.Side > 0 ? pair.bid : pair.ask;

                var hist = new PENDING_ORDER_CLOSED
                {
                    OrderID       = order.ID,
                    AccountID     = order.AccountID,
                    Comment       = order.Comment,
                    ExpertComment = order.ExpertComment,
                    Magic         = order.Magic,
                    PairOCO       = order.PairOCO,
                    PriceFrom     = order.PriceFrom,
                    PriceTo       = order.PriceTo,
                    Side          = order.Side,
                    Status        = (int)status,
                    Stoploss      = order.Stoploss,
                    Takeprofit    = order.Takeprofit,
                    Symbol        = order.Symbol,
                    TimeClosed    = DateTime.Now,
                    Volume        = order.Volume,
                    PriceClosed   = (decimal)priceClosed,
                    Position      = positionID,
                    CloseReason   = closeReason
                };
                try
                {
                    ctx.PENDING_ORDER_CLOSED.Add(hist);

                    var ord = ctx.PENDING_ORDER.FirstOrDefault(p => p.ID == order.ID);
                    if (ord == null)
                    {
                        Logger.ErrorFormat("DeletePendingOrder - ордер {0} не найден", order.ID);
                        ServiceManagerClientManagerProxy.Instance.NewOrderResponse(null,
                                                                                   RequestStatus.ServerError, "crudsav");
                        return(false);
                    }
                    ctx.PENDING_ORDER.Remove(ord);
                    // сохранить изменения
                    ctx.SaveChanges();

                    return(true);
                }
                catch (Exception ex)
                {
                    Logger.ErrorFormat("Ошибка в DeletePendingOrder (#{0}): {1}", order.ID, ex);
                }
            }
            return(false);
        }
 public void SaveProviderMessage(BrokerOrder msg)
 {
     using (var ctx = DatabaseContext.Instance.Make())
     {
         var brokOrder = LinqToEntity.UndecorateBrokerOrder(msg);
         ctx.BROKER_ORDER.Add(brokOrder);
         ctx.SaveChanges();
     }
 }
Exemple #18
0
        public WalletError SetPaymentWalletsBySystem(ProtectedOperationContext secCtx,
                                                     PaymentSystem syst,
                                                     List <UserPaymentSystem> actualPaySys,
                                                     string userLogin, string walletPwrd)
        {
            if (!UserSessionStorage.Instance.PermitUserOperation(secCtx, false, false))
            {
                return(WalletError.InsufficientRights);
            }

            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var user = ctx.PLATFORM_USER.FirstOrDefault(u => u.Login == userLogin);
                    if (user == null)
                    {
                        return(WalletError.AuthenticationError);
                    }

                    // уничтожить старые записи того же типа
                    var existRecs =
                        ctx.USER_PAYMENT_SYSTEM.Where(r => r.UserId == user.ID && r.SystemPayment == (int)syst).ToList();
                    foreach (var rec in existRecs)
                    {
                        ctx.USER_PAYMENT_SYSTEM.Remove(rec);
                    }
                    ctx.SaveChanges();

                    // добавить новые записи
                    foreach (var paySyst in actualPaySys)
                    {
                        paySyst.UserId        = user.ID;
                        paySyst.SystemPayment = syst;
                        ctx.USER_PAYMENT_SYSTEM.Add(LinqToEntity.UndecorateUserPaymentSystem(paySyst));
                    }
                    ctx.SaveChanges();
                    return(WalletError.OK);
                }
            }
            catch (DbUpdateException ex)
            {
                if (ex.InnerException.InnerException is SqlException)
                {
                    Logger.Error("SetPaymentWalletsBySystem() error: возможно, запись с таким RootId и PurseId уже есть в таблице USER_PAYMENT_SYSTEM", ex);
                    return(WalletError.ServerSqlError);
                }
                Logger.Error("SetPaymentWalletsBySystem() error", ex);
                return(WalletError.ServerError);
            }
            catch (Exception ex)
            {
                Logger.Error("SetPaymentWalletsBySystem() error", ex);
                return(WalletError.ServerError);
            }
        }
Exemple #19
0
        public Wallet UpdateBalance(int walletId, decimal transferVolume, bool deposit, out WalletError error)
        {
            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var wallet = ctx.WALLET.FirstOrDefault(x => x.User == walletId);
                    if (wallet == null)
                    {
                        Logger.InfoFormat("не найден кошек {0}", walletId);
                        error = WalletError.InvalidData;
                        return(null);
                    }

                    if (transferVolume <= 0)
                    {
                        Logger.Info("объём зачисляемых средств должен быть больше нуля}");
                        error = WalletError.InvalidData;
                        return(LinqToEntity.DecorateWallet(wallet));
                    }
                    var currentAmount    = deposit ? transferVolume : -transferVolume;
                    var oldWalletBalance = wallet.Balance;
                    wallet.Balance += currentAmount;


                    Logger.InfoFormat("средства на кошеке {0} изменены с {1} на {2}",
                                      walletId, oldWalletBalance, wallet.Balance);

                    var newTransfer = new TRANSFER
                    {
                        Amount        = currentAmount,
                        TargetAmount  = currentAmount,
                        User          = walletId,
                        Comment       = "Изменение администратором средств кошелька № " + walletId,
                        ValueDate     = DateTime.Now,
                        BalanceChange = null,
                    };
                    ctx.TRANSFER.Add(newTransfer);

                    Logger.Info("Сохраняем изменения...");
                    ctx.SaveChanges();
                    error = WalletError.OK;
                    return(LinqToEntity.DecorateWallet(wallet));
                }
            }
            catch (Exception ex)
            {
                Logger.Error("UpdateUserWallet()", ex);
                error = WalletError.CommonError;
                return(null);
            }
        }
        public void TestProcessOrderOpening()
        {
            var order = MakeTestOrder();
            var bill  = BillingManager.ProcessOrderOpening(order, LinqToEntity.DecorateAccount(account));

            Assert.IsNotNull(bill, "ProcessOrderOpening - bill не должен быть null");

            var pointCost     = DalSpot.Instance.GetAbsValue(order.Symbol, 1f);
            var amountCounter = pointCost * 1; // order.Volume;
            var delta         = Math.Abs(amountCounter - bill.MarkupEnter);

            Assert.Less(delta, 0.01, "ProcessOrderOpening - при открытии должна быть списана корректная сумма");
        }
        public PaidServiceDetail GetPaidServiceDetail(int serviceId)
        {
            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var service = ctx.SERVICE.First(s => s.ID == serviceId);
                    if (service == null)
                    {
                        return(null);
                    }

                    var srvDec = LinqToEntity.DecoratePaidService(service);
                    var detail = new PaidServiceDetail
                    {
                        Currency  = service.Currency,
                        DayFee    = service.FixedPrice,
                        MonthFee  = srvDec.FixedPriceMonth,
                        AccountId = service.AccountId
                    };

                    var signalOwner = LinqToEntity.DecoratePlatformUser(ctx.PLATFORM_USER.First(u => u.ID == service.User));
                    detail.UserName = signalOwner.MakeNameWithInitials();

                    if (srvDec.AccountId.HasValue)
                    {
                        var account = LinqToEntity.DecorateAccount(ctx.ACCOUNT.First(a => a.ID == srvDec.AccountId));
                        detail.AccountGroup = account.Group;
                    }

                    // информация по торговым сигналам
                    var userSignal =
                        ctx.SERVICE.FirstOrDefault(us => us.User == service.User);
                    if (userSignal == null)
                    {
                        return(detail);
                    }
                    detail.SignalTitle =
                        string.IsNullOrEmpty(userSignal.Comment) ? "Сигналы №" + userSignal.ID : userSignal.Comment;
                    var subsCount = ctx.SUBSCRIPTION.Count(us => us.Service == userSignal.ID);
                    detail.SubscribersCount = subsCount;

                    return(detail);
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Error in GetPaidServiceDetail()", ex);
                return(null);
            }
        }
        public void TestProcessOrderClosing()
        {
            var order = MakeTestOrder();
            var bill  = BillingManager.ProcessOrderOpening(order, LinqToEntity.DecorateAccount(account));

            Assert.IsNotNull(bill, "ProcessPriceForOrderClosing - открытие не обработано");
            BillingManager.SaveNewOrderBill(bill, order.ID, conn);
            conn.SaveChanges();

            var billClose = BillingManager.ProcessPriceForOrderClosing(order,
                                                                       LinqToEntity.DecorateAccount(account), conn);

            Assert.IsNotNull(billClose, "ProcessPriceForOrderClosing - bill не должен быть null");
        }
Exemple #23
0
        private List <PaidService> GetServicesByUserOrId(int id, bool byUser, out PlatformUser serviceOwner)
        {
            serviceOwner = null;
            var srvList = new List <PaidService>();

            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var query = byUser
                                    ? ctx.SERVICE.Where(s => s.User == id)
                                    : ctx.SERVICE.Where(s => s.ID == id);
                    foreach (var srv in query)
                    {
                        var paidServ = LinqToEntity.DecoratePaidService(srv);
                        var srvId    = srv.ID;
                        // добавить рейты
                        foreach (var rate in ctx.SERVICE_RATE.Where(r => r.Service == srvId))
                        {
                            paidServ.serviceRates.Add(new PaidServiceRate
                            {
                                Amount      = rate.Amount,
                                RateType    = (PaidServiceRate.ServiceRateType)rate.RateType,
                                UserBalance = rate.UserBalance
                            });
                        }
                        srvList.Add(paidServ);
                    }

                    if (byUser)
                    {
                        serviceOwner = LinqToEntity.DecoratePlatformUser(ctx.PLATFORM_USER.First(u => u.ID == id));
                    }
                    else
                    {
                        var srv = srvList.FirstOrDefault();
                        if (srv != null)
                        {
                            serviceOwner = LinqToEntity.DecoratePlatformUser(ctx.PLATFORM_USER.First(u => u.ID == srv.User));
                        }
                    }
                }
                return(srvList);
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("GetServicesByUserOrId({0}, {1}) error: {2}", id, byUser, ex);
                return(srvList);
            }
        }
        public List <TradeTicker> GetTickers(out long lotByGroupHash)
        {
            lotByGroupHash = 0;
            var ticks = new List <TradeTicker>();

            using (var ctx = DatabaseContext.Instance.Make())
            {
                foreach (var tradeTicker in ctx.SPOT)
                {
                    ticks.Add(LinqToEntity.DecorateTicker(tradeTicker));
                }
            }
            return(ticks);
        }
        /// <summary>
        /// проверить SL, TP, трейлинги
        /// </summary>
        private void CheckOrders()
        {
            if (!WorkingDay.Instance.IsWorkingDay(DateTime.Now))
            {
                return;
            }

            var curPrices = QuoteStorage.Instance.ReceiveAllData();

            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    // позиции
                    foreach (var order in ctx.POSITION)
                    {
                        if ((PositionState)order.State != PositionState.Opened)
                        {
                            continue;
                        }
                        try
                        {
                            tradeManager.CheckOrder(LinqToEntity.DecorateOrder(order), curPrices);
                        }
                        catch (Exception ex)
                        {
                            Logger.Error("AccountCheckStream.CheckOrder() error", ex);
                        }
                    }

                    // отложенные ордера
                    foreach (var order in ctx.PENDING_ORDER)
                    {
                        try
                        {
                            tradeManager.CheckPendingOrder(LinqToEntity.DecoratePendingOrder(order), curPrices);
                        }
                        catch (Exception ex)
                        {
                            Logger.Error("AccountCheckStream.CheckPendingOrder() error", ex);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в CheckOrders()", ex);
            }
        }
Exemple #26
0
 /// <summary>
 /// Заполняет список allOrders позициями (сделками) из БД
 /// </summary>
 private void MakeOrders()
 {
     allOrders = new List <MarketOrder>();
     using (var ctx = DatabaseContext.Instance.Make())
     {
         foreach (var pos in ctx.POSITION)
         {
             allOrders.Add(LinqToEntity.DecorateOrder(pos));
         }
         foreach (var pos in ctx.POSITION_CLOSED)
         {
             allOrders.Add(LinqToEntity.DecorateOrder(pos));
         }
     }
 }
Exemple #27
0
        public bool CloseOrder(int orderId, decimal price, PositionExitReason exitReason)
        {
            MarketOrder orderDecor;

            using (var ctx = DatabaseContext.Instance.Make())
            {
                var orderQuery = ctx.POSITION.Where(p => p.ID == orderId).ToList();
                if (orderQuery.Count == 0)
                {
                    Logger.ErrorFormat("CloseOrder(Id = {0}) - позиция не найдена", orderId);
                    return(false);
                }
                orderDecor = LinqToEntity.DecorateOrder(orderQuery[0]);
            }
            return(CloseOrder(orderDecor, price, exitReason));
        }
Exemple #28
0
        public WalletError GetTransferExtendedInfo(ProtectedOperationContext secCtx,
                                                   int transferId, out BalanceChange balanceChange, out PlatformUser user)
        {
            balanceChange = null;
            user          = null;

            if (!UserSessionStorage.Instance.PermitUserOperation(secCtx, false, false))
            {
                return(WalletError.InsufficientRights);
            }

            var error = WalletError.ServerError;

            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var trans = ctx.TRANSFER.FirstOrDefault(t => t.ID == transferId);
                    if (trans == null)
                    {
                        return(WalletError.InvalidData);
                    }
                    if (trans.BalanceChange.HasValue)
                    {
                        balanceChange = LinqToEntity.DecorateBalanceChange(trans.BALANCE_CHANGE);
                        return(WalletError.OK);
                    }
                    if (trans.RefWallet.HasValue)
                    {
                        var us = ctx.PLATFORM_USER.FirstOrDefault(u => u.ID == trans.RefWallet.Value);
                        if (us != null)
                        {
                            user          = LinqToEntity.DecoratePlatformUser(us);
                            user.Password = string.Empty;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("GetTransferExtendedInfo({0}) error: {1}", transferId, ex);
                error = WalletError.ServerError;
            }
            return(error);
        }
Exemple #29
0
        /// <summary>
        /// формирует модель для представления PositionDetails
        /// </summary>
        /// <param name="positionId">Уникальным идентификатором является сделки</param>
        /// <remarks>Не тестируется</remarks>
        public MarketOrder GetPositionItemDetails(int positionId)
        {
            MarketOrder positionItem = null;

            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    // Проверяем, есть ли указанная сделка среди открытых (потому что их меньше), если нет - ищём её среди закрытых
                    if (ctx.POSITION.Any(x => x.ID == positionId))
                    {
                        POSITION position;
                        try
                        {
                            position = ctx.POSITION.Single(x => x.ID == positionId);
                        }
                        catch (Exception ex)
                        {
                            Logger.Error(string.Format("GetPositionItemDetails() - При запросе подробностей о сделке c id {0} не удалось получить конкретный элемент из POSITION", positionId), ex);
                            return(null);
                        }
                        positionItem = LinqToEntity.DecorateOrder(position);
                    }
                    else
                    {
                        POSITION_CLOSED position;
                        try
                        {
                            position = ctx.POSITION_CLOSED.Single(x => x.ID == positionId);
                        }
                        catch (Exception ex)
                        {
                            Logger.Error(string.Format("GetPositionItemDetails() - При запросе подробностей о сделке c id {0} не удалось получить конкретный элемент из POSITION_CLOSED", positionId), ex);
                            return(null);
                        }
                        positionItem = LinqToEntity.DecorateOrder(position);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("GetPositionItemDetails Exception", ex);
            }
            return(positionItem);
        }
Exemple #30
0
        private PaidService GetPaidServiceProgressiveFeeScaleDetail(TradeSharpConnection ctx, SERVICE srv)
        {
            var fees = ctx.SERVICE_RATE.Where(r => r.Service == srv.ID).OrderBy(r => r.UserBalance).ToList();

            if (fees.Count == 0)
            {
                return(null);
            }
            var service = LinqToEntity.DecoratePaidService(srv);

            service.serviceRates = fees.Select(f => new PaidServiceRate
            {
                Amount      = f.Amount,
                RateType    = PaidServiceRate.ServiceRateType.Percent,
                UserBalance = f.UserBalance
            }).ToList().ToList();
            return(service);
        }