private RequestStatus FindPAMMServiceWithOwner() { owner = (from pa in ctx.PLATFORM_USER_ACCOUNT join u in ctx.PLATFORM_USER on pa.PlatformUser equals u.ID where pa.Account == accountId && pa.RightsMask == (int)AccountRights.Управление select u).FirstOrDefault(); if (owner == null) { Logger.ErrorFormat("InvestOrWithdrawFromPamm(acc={0}) - владелец счета не найден", accountId); return(RequestStatus.IncorrectData); } // найти ПАММ-сервис для целевого акаунта service = (from srv in ctx.SERVICE where srv.AccountId == accountId && srv.User == owner.ID && srv.ServiceType == (int)PaidServiceType.PAMM select srv).FirstOrDefault(); if (service == null) { Logger.ErrorFormat("InvestOrWithdrawFromPamm(acc={0}) - счет не указан как ПАММ", accountId); return(RequestStatus.BadRequest); } return(RequestStatus.OK); }
private static bool CheckPhoneCriteria(ColumnFilterCriteria crit, PLATFORM_USER user, string specimen) { if (crit == ColumnFilterCriteria.авно && user.Phone1 != specimen && user.Phone2 != specimen) { return(false); } if (crit == ColumnFilterCriteria.НеРавно && (user.Phone1 == specimen || user.Phone2 == specimen)) { return(false); } if (crit == ColumnFilterCriteria.Включает && (user.Phone1.Contains(specimen) || user.Phone2.Contains(specimen)) == false) { return(false); } if (crit == ColumnFilterCriteria.НачинаетсяС && (user.Phone1.StartsWith(specimen) || user.Phone2.StartsWith(specimen)) == false) { return(false); } if (crit == ColumnFilterCriteria.КончаетсяНа && (user.Phone1.EndsWith(specimen) || user.Phone2.EndsWith(specimen)) == false) { return(false); } return(true); }
public void CheckExistValuesFromTable() { using (var ctx = connectionPersistent) { PLATFORM_USER accId = null; try { accId = ctx.PLATFORM_USER.First(); } catch (Exception ex) { Logger.ErrorFormat("Тестирование невозможно. В таблице ACCOUNT тестовой БД не найдело записей.", ex); Assert.Fail("Тестирование невозможно. В таблице ACCOUNT файловой БД не найдело записей."); } var emailExist = Utils.CheckExistValuesFromTable <PLATFORM_USER>(x => x.Email == accId.Email); Assert.IsTrue(emailExist); var emailNotExist = Utils.CheckExistValuesFromTable <PLATFORM_USER>(x => x.Email == "*****@*****.**"); Assert.IsFalse(emailNotExist); DatabaseContext.InitializeFake(exceptionConnectionPersistent); exceptionConnectionPersistent.TestException = new EntityException("DB context has failed"); var commodityExpected1 = Utils.CheckExistValuesFromTable <COMMODITY>(null); Assert.IsNotNull(commodityExpected1); Assert.IsFalse(commodityExpected1); DatabaseContext.InitializeFake(exceptionConnectionPersistent); exceptionConnectionPersistent.TestException = new Exception("DatabaseContext Exception"); var commodityExpected2 = Utils.CheckExistValuesFromTable <COMMODITY>(null); Assert.IsNotNull(commodityExpected2); Assert.IsFalse(commodityExpected2); } }
private void CreateServiceWithOwner(string currency, decimal fee, out PLATFORM_USER serviceOwner, out SERVICE service) { // создать для будущего подписчика сервиса // для начала - создать владельца сервиса serviceOwner = new PLATFORM_USER { Email = "testuser" + currency + "@t.test", Login = "******" + currency, Password = "******", Title = "test", RegistrationDate = DateTime.Now }; conn.PLATFORM_USER.Add(serviceOwner); conn.SaveChanges(); conn.WALLET.Add(new WALLET { Currency = currency, User = serviceOwner.ID, Password = "******", Balance = 500 }); // и, собственно, сервис service = new SERVICE { User = serviceOwner.ID, ServiceType = (int)PaidServiceType.Signals, Comment = "test_" + currency, Currency = currency, FixedPrice = fee }; conn.SERVICE.Add(service); conn.SaveChanges(); }
public static void MakePammData(TradeSharpConnection conn, out ACCOUNT testAccount, out PLATFORM_USER shareOwner, out ACCOUNT eurAccount) { testAccount = conn.ACCOUNT.First(a => a.Balance > 0 && a.POSITION.Count > 0 && a.ACCOUNT_SHARE.Count == 0 && a.ACCOUNT_GROUP.IsReal); var ownerId = testAccount.PLATFORM_USER_ACCOUNT.First().PlatformUser; shareOwner = conn.PLATFORM_USER.First(u => u.ID == ownerId); var shareOwnerId = shareOwner.ID; var shareOwners = conn.PLATFORM_USER.Where(u => u.ID != shareOwnerId).Take(2).ToArray(); conn.ACCOUNT_SHARE.Add(new ACCOUNT_SHARE { Account = testAccount.ID, Share = 50, ShareOwner = shareOwner.ID }); conn.ACCOUNT_SHARE.Add(new ACCOUNT_SHARE { Account = testAccount.ID, Share = 30, ShareOwner = shareOwners[0].ID }); conn.ACCOUNT_SHARE.Add(new ACCOUNT_SHARE { Account = testAccount.ID, Share = 20, ShareOwner = shareOwners[1].ID }); // счет в евро eurAccount = new ACCOUNT { Balance = 10500, Currency = "EUR", AccountGroup = conn.ACCOUNT_GROUP.First(g => !g.IsReal).Code, TimeCreated = DateTime.Now, Status = (int)Account.AccountStatus.Created }; conn.ACCOUNT.Add(eurAccount); conn.SaveChanges(); // сделки по евровому счету conn.POSITION.Add(new POSITION { AccountID = eurAccount.ID, Side = (int)DealType.Sell, Symbol = "EURUSD", State = (int)PositionState.Opened, TimeEnter = eurAccount.TimeCreated, PriceEnter = (decimal)(Contract.Util.BL.QuoteStorage.Instance.ReceiveValue("EURUSD").bid + 0.002f) }); conn.SaveChanges(); }
private void FindSubscriber() { subscriber = (from usr in conn.PLATFORM_USER join w in conn.WALLET on usr.ID equals w.User join pa in conn.PLATFORM_USER_ACCOUNT on usr.ID equals pa.PlatformUser where pa.RightsMask == (int)AccountRights.Управление && w.Currency == SubscriberCurx && w.Balance > 1000 select usr).First(); // отписать будущего подписчика от всех служб var ownedSubs = conn.SUBSCRIPTION.Where(s => s.User == subscriber.ID).ToList(); foreach (var sub in ownedSubs) { conn.SUBSCRIPTION.Remove(sub); } conn.SaveChanges(); }
public void Setup() { conn = TradeSharpConnectionPersistent.InitializeTradeSharpConnection(); ManagerTrade.MakeTestInstance(); subscriber = (from usr in conn.PLATFORM_USER join w in conn.WALLET on usr.ID equals w.User join pa in conn.PLATFORM_USER_ACCOUNT on usr.ID equals pa.PlatformUser where pa.RightsMask == (int)AccountRights.Управление && w.Currency == SubscriberCurx && w.Balance > 40 select usr).First(); CreateServiceWithOwner("USD", 5, out serviceOwnerUsd, out serviceUsd); CreateServiceWithOwner("RUB", 25, out serviceOwnerRub, out serviceRub); QuoteStorage.Instance.UpdateValues("USDRUB", new QuoteData(35.20f, 35.20f, DateTime.Now)); // словари TradeSharpDictionary.Initialize(MoqTradeSharpDictionary.Mock); }
public static AccountUserModel DecoratePlatformUser(PLATFORM_USER platformUser) { var result = new AccountUserModel { UserId = platformUser.ID, UserName = platformUser.Name, UserSurname = platformUser.Surname, UserPatronym = platformUser.Patronym, UserDescription = platformUser.Description, UserEmail = platformUser.Email, UserLogin = platformUser.Login, UserPassword = platformUser.Password, UserPhone1 = platformUser.Phone1, UserPhone2 = platformUser.Phone2, UserRoleMask = (UserRole)platformUser.RoleMask, UserRightsMask = new Dictionary <int, UserAccountRights>(), UserRegistrationDate = platformUser.RegistrationDate }; return(result); }
public void MakeNewlyRegisteredAccountSignaller(TradeSharpConnection ctx, PLATFORM_USER user, ACCOUNT account) { try { ctx.SERVICE.Add(new SERVICE { AccountId = account.ID, ServiceType = (int)PaidServiceType.PAMM, Currency = account.Currency, FixedPrice = 1, Comment = "Сигналы " + LinqToEntity.DecoratePlatformUser(user).NameWithInitials, User = user.ID }); } catch (Exception ex) { Logger.ErrorFormat("Ошибка в MakeNewlyRegisteredAccountSignaller(login={0}, account={1}): {2}", user.Login, account.ID, ex); } }
private void MakeTestData() { paidService = conn.SERVICE.First(s => s.Currency == "USD"); srvOwner = paidService.PLATFORM_USER; srvSubscriber = conn.PLATFORM_USER.First(u => u.WALLET.Currency == "USD" && u.ID != srvOwner.ID); // аккаунт с дольками и открытыми позами accountShared = conn.ACCOUNT.First(a => a.POSITION.Count > 1 && a.POSITION.Count < 200); accountSharedOwner = (from pa in conn.PLATFORM_USER_ACCOUNT join u in conn.PLATFORM_USER on pa.PlatformUser equals u.ID where pa.Account == accountShared.ID select u).First(); // добавить ПАММ-сервис conn.SERVICE.Add(new SERVICE { Currency = "USD", ServiceType = (int)PaidServiceType.PAMM, AccountId = accountShared.ID, User = accountSharedOwner.ID, Comment = "PAMMMmm" }); // добавить дольки var oneMoreUser = conn.PLATFORM_USER.First(u => u.ID != accountSharedOwner.ID); conn.ACCOUNT_SHARE.Add(new ACCOUNT_SHARE { Account = accountShared.ID, Share = 55, ShareOwner = accountSharedOwner.ID }); conn.ACCOUNT_SHARE.Add(new ACCOUNT_SHARE { Account = accountShared.ID, Share = 45, ShareOwner = oneMoreUser.ID }); conn.SaveChanges(); }
private string CreateAccount(out int accountId) { accountId = -1; if (string.IsNullOrEmpty(tbLogin.Text) || string.IsNullOrEmpty(tbEmail.Text) || string.IsNullOrEmpty(tbPassword.Text) || cbAccountGroup.SelectedIndex < 0) { return("Поля не заполнены"); } var login = tbLogin.Text; var password = tbPassword.Text; var email = tbEmail.Text; var group = cbAccountGroup.SelectedItem.ToString(); var depo = tbStartDepo.Text.ToDecimalUniformSafe() ?? 0; var createTime = dpCreateTime.Value; using (var conn = DatabaseContext.Instance.Make()) { if (conn.PLATFORM_USER.Any(u => u.Login == login)) { return("Логин занят"); } if (conn.PLATFORM_USER.Any(u => u.Email == email)) { return("Email занят"); } try { var usr = new PLATFORM_USER { Login = login, Password = password, Email = email, Name = tbName.Text, Surname = tbSurname.Text, RegistrationDate = createTime, RoleMask = 0, Patronym = "Н", Title = "-" }; conn.PLATFORM_USER.Add(usr); var account = new ACCOUNT { Currency = "USD", Balance = depo, MaxLeverage = tbMaxLeverage.Text.ToDecimalUniformSafe() ?? 100, AccountGroup = group, TimeCreated = createTime, Status = (int)Account.AccountStatus.Created }; conn.ACCOUNT.Add(account); conn.SaveChanges(); var pa = new PLATFORM_USER_ACCOUNT { PlatformUser = usr.ID, Account = account.ID, RightsMask = 0 }; conn.PLATFORM_USER_ACCOUNT.Add(pa); var bc = new BALANCE_CHANGE { AccountID = account.ID, Amount = depo, ChangeType = (int)BalanceChangeType.Deposit, Description = "Initial deposit", ValueDate = createTime }; conn.BALANCE_CHANGE.Add(bc); conn.SaveChanges(); accountId = account.ID; return(string.Empty); } catch (Exception ex) { return(ex.GetType().Name + ": " + ex.Message); } } }
private RequestStatus CheckShareAndUpdateSubscriberWallet(List <AccountShare> shares, PLATFORM_USER subscriber, ACCOUNT account, Dictionary <string, QuoteData> quotes, out decimal amountInAccountCurx) { amountInAccountCurx = 0; var subscribersShare = shares.FirstOrDefault(s => s.UserId == subscriber.ID); if (subscribersShare == null && withdrawNotInvest) { Logger.ErrorFormat("CheckShareAndUpdateSubscriberWallet(acc={0}, user={1}) - у пользователя нет вклада", accountId, subscriber.Login); return(RequestStatus.BadRequest); } // посчитать сумму вложения в валюте целевого счета var ownerWallet = ctx.WALLET.First(w => w.User == subscriber.ID); string errorStr; var calculatedAmountInAccountCurx = DalSpot.Instance.ConvertSourceCurrencyToTargetCurrency(account.Currency, ownerWallet.Currency, (double)sumInWalletCurrency, quotes, out errorStr); if (!calculatedAmountInAccountCurx.HasValue) { Logger.Error("CheckShareAndUpdateSubscriberWallet - невозможно перевести " + account.Currency + " в " + ownerWallet.Currency + ": " + errorStr); return(RequestStatus.ServerError); } amountInAccountCurx = calculatedAmountInAccountCurx.Value; // завести денег в ПАММ - списать с кошелька подписчика if (!withdrawNotInvest) { // списать деньги с кошелька подписчика if (ownerWallet.Balance < sumInWalletCurrency) { Logger.ErrorFormat( "CheckShareAndUpdateSubscriberWallet({0} на счет {1}) - сумма инвестирования {2} больше баланса кошелька ({3})", login, accountId, sumInWalletCurrency, ownerWallet.Balance); return(RequestStatus.MarginOrLeverageExceeded); } ownerWallet.Balance -= sumInWalletCurrency; } else { // вывести все? if (withdrawAll) { amountInAccountCurx = subscribersShare.ShareMoney; string errorDepoAmountStr; var calculatedAmountInWalletCurx = DalSpot.Instance.ConvertSourceCurrencyToTargetCurrency( ownerWallet.Currency, account.Currency, (double)amountInAccountCurx, quotes, out errorDepoAmountStr); if (!calculatedAmountInWalletCurx.HasValue) { Logger.Error("CheckShareAndUpdateSubscriberWallet - (расчет суммы вывода) невозможно перевести " + account.Currency + " в " + ownerWallet.Currency + ": " + errorDepoAmountStr); return(RequestStatus.ServerError); } sumInWalletCurrency = calculatedAmountInWalletCurx.Value; } else { // не превышает ли выводимая сумма долю вкладчика? if (calculatedAmountInAccountCurx > subscribersShare.ShareMoney) { Logger.ErrorFormat("CheckShareAndUpdateSubscriberWallet({0} на счет {1}) - сумма вывода {2} больше доли пайщика ({3})", login, accountId, calculatedAmountInAccountCurx, subscribersShare.ShareMoney); return(RequestStatus.BadRequest); } subscribersShare.ShareMoney -= calculatedAmountInAccountCurx.Value; // выводится, фактически, вся сумма? if (subscribersShare.ShareMoney < MinInvestAmountOnPamm) { Logger.InfoFormat("CheckShareAndUpdateSubscriberWallet({0} на счет {1}) - сумма вывода {2} примерно равна доле пайщика ({3}), выводится все", login, accountId, calculatedAmountInAccountCurx, subscribersShare.ShareMoney); withdrawAll = true; subscribersShare.ShareMoney = 0; } } ownerWallet.Balance += sumInWalletCurrency; } return(RequestStatus.OK); }
private Wallet GetMoneyFromUserOwnedAccount(int accountId, decimal amountInSrcCurrency, out WalletError error, ACCOUNT account, WALLET wallet, TradeSharpConnection ctx, PLATFORM_USER user) { var amountWallet = amountInSrcCurrency; if (account.Currency != wallet.Currency) { // найти котировку и перевести string errorString; var amountTarget = DalSpot.Instance.ConvertSourceCurrencyToTargetCurrency(wallet.Currency, account.Currency, (double)amountWallet, QuoteStorage.Instance.ReceiveAllData(), out errorString); if (!amountTarget.HasValue) { Logger.ErrorFormat("DepositOrWithdraw({0} {1}): {2} (withdraw)", amountInSrcCurrency, account.Currency + "/" + wallet.Currency, errorString); error = WalletError.CurrencyExchangeFailed; return(null); } amountWallet = amountTarget.Value; } // достаточно ли средств на счете? // проверить средства / зарезервированное марж. обеспечение decimal equity, usedMargin; if (!GetAccountEquityAndUsedMargin(account, out equity, out usedMargin)) { error = WalletError.ServerError; return(null); } if (equity - usedMargin < amountInSrcCurrency) { error = WalletError.ServerError; return(null); } // списать со счета в пользу кошелька wallet.Balance += amountInSrcCurrency; account.Balance -= amountInSrcCurrency; var date = DateTime.Now; var bc = ctx.BALANCE_CHANGE.Add(new BALANCE_CHANGE { AccountID = accountId, Amount = amountInSrcCurrency, ChangeType = (int)BalanceChangeType.Withdrawal, ValueDate = date, Description = "Списание на кошелек №" + wallet.User }); ctx.SaveChanges(); ctx.TRANSFER.Add(new TRANSFER { Amount = amountWallet, TargetAmount = amountWallet, User = user.ID, Comment = "Вывод средств со счета №" + account.ID, ValueDate = date, BalanceChange = bc.ID, }); ctx.SaveChanges(); error = WalletError.OK; return(LinqToEntity.DecorateWallet(wallet)); }
private void TestSubscriptionFeeCharged(ManagerTrade tradeManager, SERVICE service, PLATFORM_USER serviceOwner) { RemoveSubscriptionIfAny(service.ID); var cacheInWallet = GetUserCacheAmount(subscriber.ID); var ownerCache = GetUserCacheAmount(serviceOwner.ID); WalletError error; tradeManager.SubscribeOnService(ProtectedOperationContext.MakeServerSideContext(), subscriber.Login, service.ID, true, false, new AutoTradeSettings(), out error); Assert.AreEqual(WalletError.OK, error, "Тестовая подписка должна пройти успешно"); var cacheInWalletAfter = GetUserCacheAmount(subscriber.ID); var ownerCacheAfter = GetUserCacheAmount(serviceOwner.ID); var curxRate = service.Currency == SubscriberCurx ? new QuoteData(1, 1, DateTime.Now) : QuoteStorage.Instance.ReceiveValue("USDRUB"); var userLost = service.FixedPrice / (decimal)curxRate.bid; var ownerGot = service.FixedPrice; Assert.IsTrue((cacheInWallet - userLost).SameMoney(cacheInWalletAfter), "Подписка сняла оговоренную сумму (валюта одна)"); Assert.IsTrue((ownerCache + ownerGot).SameMoney(ownerCacheAfter), "Подписка принесла владельцу оговоренную сумму (валюта одна)"); }
public CreateReadonlyUserRequestStatus MakeOrDeleteReadonlyUser(ProtectedOperationContext secCtx, int accountId, bool makeNew, string pwrd, out PlatformUser user) { user = null; if (UserOperationRightsStorage.IsProtectedOperation(UserOperation.ChangeAccountSettings)) { if (!UserSessionStorage.Instance.PermitUserOperation(secCtx, UserOperationRightsStorage.IsTradeOperation(UserOperation.ChangeAccountSettings), false)) { return(CreateReadonlyUserRequestStatus.NotPermitted); } } try { using (var ctx = DatabaseContext.Instance.Make()) { var existingUserRecord = ctx.PLATFORM_USER_ACCOUNT.FirstOrDefault(ua => ua.Account == accountId && ua.RightsMask == (int)AccountRights.Просмотр); if (!makeNew) { // удалить if (existingUserRecord == null) { return(CreateReadonlyUserRequestStatus.UserNotFound); } ctx.PLATFORM_USER_ACCOUNT.Remove(existingUserRecord); // удалить самого пользователя платформы var userRow = ctx.PLATFORM_USER.First(u => u.ID == existingUserRecord.PlatformUser); ctx.PLATFORM_USER.Remove(userRow); ctx.SaveChanges(); return(CreateReadonlyUserRequestStatus.Success); } // создать нового или редактировать старого if (existingUserRecord != null) { var userRow = ctx.PLATFORM_USER.First(u => u.ID == existingUserRecord.PlatformUser); user = LinqToEntity.DecoratePlatformUser(userRow); userRow.Password = pwrd; ctx.SaveChanges(); return(CreateReadonlyUserRequestStatus.Success); } // таки создать нового var newUser = new PLATFORM_USER { Title = "Read" + accountId, Login = "******" + accountId, Password = pwrd, RegistrationDate = DateTime.Now, RoleMask = (int)UserRole.Trader }; user = LinqToEntity.DecoratePlatformUser(newUser); var usr = ctx.PLATFORM_USER.Add(newUser); ctx.SaveChanges(); ctx.PLATFORM_USER_ACCOUNT.Add(new PLATFORM_USER_ACCOUNT { Account = accountId, PlatformUser = usr.ID, RightsMask = (int)AccountRights.Просмотр }); ctx.SaveChanges(); return(CreateReadonlyUserRequestStatus.Success); } } catch (Exception ex) { Logger.Error("Ошибка в CreateReadonlyUserRequestStatus()", ex); return(CreateReadonlyUserRequestStatus.CommonError); } }
private static Wallet PutMoneyOnUserOwnedAccount(int accountId, decimal amountInSrcCurrency, out WalletError error, WALLET wallet, ACCOUNT account, TradeSharpConnection ctx, PLATFORM_USER user) { // достаточно ли денег в кошельке? if (amountInSrcCurrency > wallet.Balance) { error = WalletError.InsufficientFunds; return(null); } // перевести объем в валюту счета var amount = amountInSrcCurrency; if (account.Currency != wallet.Currency) { // найти котировку и перевести string errorString; var amountTarget = DalSpot.Instance.ConvertSourceCurrencyToTargetCurrency(account.Currency, wallet.Currency, (double)amount, QuoteStorage.Instance.ReceiveAllData(), out errorString); if (!amountTarget.HasValue) { Logger.ErrorFormat("DepositOrWithdraw({0} {1}): {2}", amountInSrcCurrency, account.Currency + "/" + wallet.Currency, errorString); error = WalletError.CurrencyExchangeFailed; return(null); } amount = amountTarget.Value; } // списать с кошелька и пополнить счет wallet.Balance -= amountInSrcCurrency; account.Balance += amount; var dateOper = DateTime.Now; var balanceChange = ctx.BALANCE_CHANGE.Add(new BALANCE_CHANGE { AccountID = accountId, Amount = amount, ChangeType = (int)BalanceChangeType.Deposit, ValueDate = dateOper, Description = "Пополнение с кошелька №" + wallet.User }); try { ctx.SaveChanges(); } catch (Exception ex) { Logger.Error("DepositOrWithdraw() - error saving balance change", ex); error = WalletError.ServerError; return(null); } var balanceChangeId = balanceChange.ID; ctx.TRANSFER.Add(new TRANSFER { Amount = -amountInSrcCurrency, TargetAmount = -amountInSrcCurrency, User = user.ID, Comment = "Т. счет №" + account.ID, ValueDate = dateOper, BalanceChange = balanceChangeId, }); try { ctx.SaveChanges(); } //catch (System.Data.Entity.Infrastructure.DbUpdateConcurrencyException) //{ //} catch (Exception ex) { Logger.Error("DepositOrWithdraw() - error saving transfer for user " + user.ID + ", balance change Id: " + balanceChangeId + ", user: " + user.ID, ex); error = WalletError.ServerError; return(null); } error = WalletError.OK; return(LinqToEntity.DecorateWallet(wallet)); }
public void TestInvestInPAMM() { // PAMM-инвестор var pammInvestor = new PLATFORM_USER { Email = "*****@*****.**", Login = "******", Password = "******", RegistrationDate = DateTime.Now, RoleMask = (int)UserRole.Trader, Title = "trader" }; conn.PLATFORM_USER.Add(pammInvestor); conn.SaveChanges(); var wallet = new WALLET { User = pammInvestor.ID, Balance = 160000, Currency = "USD", Password = "******" }; conn.WALLET.Add(wallet); conn.SaveChanges(); // посчитать, что было ДО инвестирования в ПАММ List <AccountShare> shares; bool noQuoteError; WalletManager.CalculateAccountEquityWithShares(conn, accountShared, accountSharedOwner.ID, Contract.Util.BL.QuoteStorage.Instance.ReceiveAllData(), out shares, out noQuoteError); // инвестировать в ПАММ const decimal amountToInvest = 10000; var oldBalance = accountShared.Balance; var status = walletManager.InvestInPAMM(ProtectedOperationContext.MakeServerSideContext(), pammInvestor.Login, accountShared.ID, amountToInvest); Assert.AreEqual(RequestStatus.OK, status, "InvestInPAMM - должно быть ОК"); accountShared = conn.ACCOUNT.First(a => a.ID == accountShared.ID); var shouldBeBalance = oldBalance + amountToInvest; Assert.IsTrue(shouldBeBalance.RoughCompares(accountShared.Balance, 0.1M), "InvestInPAMM - баланс счета должен увеличиться на сумму вложения"); var newShares = conn.ACCOUNT_SHARE.Where(s => s.Account == accountShared.ID).ToList(); Assert.AreEqual(shares.Count + 1, newShares.Count, "InvestInPAMM - добавился один пай"); var sumSharesPercent = newShares.Sum(s => s.Share); Assert.IsTrue(100M.RoughCompares(sumSharesPercent, 0.000001M), "InvestInPAMM - сумма паев осталась 100%"); Assert.IsTrue(newShares.Any(s => s.ShareOwner == pammInvestor.ID), "InvestInPAMM - новый владелец должен быть в списке пайщиков"); Assert.IsTrue(conn.SUBSCRIPTION.Any(s => s.User == pammInvestor.ID), "InvestInPAMM - должна появиться подписка"); // инвестировать еще денег const decimal moreMoney = 145201.55M; status = walletManager.InvestInPAMM(ProtectedOperationContext.MakeServerSideContext(), pammInvestor.Login, accountShared.ID, moreMoney); Assert.AreEqual(RequestStatus.OK, status, "InvestInPAMM (повторно) - должно быть ОК"); var updatedNewShares = conn.ACCOUNT_SHARE.Where(s => s.Account == accountShared.ID).ToList(); Assert.AreEqual(newShares.Count, updatedNewShares.Count, "InvestInPAMM (повторно) - количество паев не должно меняться"); sumSharesPercent = updatedNewShares.Sum(s => s.Share); Assert.IsTrue(100M.RoughCompares(sumSharesPercent, 0.000001M), "InvestInPAMM (повторно) - сумма паев осталась 100%"); status = walletManager.InvestInPAMM(ProtectedOperationContext.MakeServerSideContext(), pammInvestor.Login, accountShared.ID, moreMoney); Assert.AreEqual(RequestStatus.MarginOrLeverageExceeded, status, "InvestInPAMM (превышение баланса) - должно быть MarginOrLeverageExceeded"); // вывести из ПАММа кусочек const decimal withdrawnMoney = 50.25M; var balanceBeforeWth = conn.WALLET.First(w => w.User == pammInvestor.ID).Balance; status = walletManager.WithdrawFromPAMM(ProtectedOperationContext.MakeServerSideContext(), pammInvestor.Login, accountShared.ID, withdrawnMoney, false); Assert.AreEqual(RequestStatus.OK, status, "InvestInPAMM (вывод средств) - должно быть OK"); var sharesAfterWithdraw = conn.ACCOUNT_SHARE.Where(s => s.Account == accountShared.ID).ToList(); var balanceAfterWth = conn.WALLET.First(w => w.User == pammInvestor.ID).Balance; Assert.IsTrue(balanceBeforeWth.RoughCompares(balanceAfterWth - withdrawnMoney, 0.005M), "баланс должен увеличиться на сумму вывода"); Assert.AreEqual(updatedNewShares.Count, sharesAfterWithdraw.Count, "InvestInPAMM (вывод средств) - количество паёв не должно измениться"); Assert.IsTrue(conn.SUBSCRIPTION.Any(s => s.User == pammInvestor.ID), "InvestInPAMM (вывод средств) - должна остаться подписка"); // попробовать вывести слишком много status = walletManager.WithdrawFromPAMM(ProtectedOperationContext.MakeServerSideContext(), pammInvestor.Login, accountShared.ID, 1000000, false); Assert.AreEqual(RequestStatus.BadRequest, status, "InvestInPAMM (вывод средств) - должно быть BadRequest"); // вывести остаток status = walletManager.WithdrawFromPAMM(ProtectedOperationContext.MakeServerSideContext(), pammInvestor.Login, accountShared.ID, 0, true); Assert.AreEqual(RequestStatus.OK, status, "InvestInPAMM (вывод всех средств) - должно быть OK"); Assert.IsFalse(conn.SUBSCRIPTION.Any(s => s.User == pammInvestor.ID), "InvestInPAMM (вывод всех средств) - должна удалиться подписка"); Assert.IsFalse(conn.ACCOUNT_SHARE.Any(s => s.ShareOwner == pammInvestor.ID), "InvestInPAMM (вывод всех средств) - должна удалиться долька нашего пайщика"); }
public void Setup() { // подыграть за торговый контракт SetupFakeServer(); // инициализировать словари (прежде всего - словарь тикеров) TradeSharpDictionary.Initialize(MoqTradeSharpDictionary.Mock); connection = TradeSharpConnectionPersistent.InitializeTradeSharpConnection(); // пользователь - владелец тестового сервиса var ownerUser = new PLATFORM_USER { Email = "*****@*****.**", Login = "******", Title = "Vafel", RoleMask = 0, Password = "******", RegistrationDate = DateTime.Now }; connection.PLATFORM_USER.Add(ownerUser); connection.SaveChanges(); // добавить категорию сигналов var srv = new SERVICE { FixedPrice = 0, Currency = "USD", User = ownerUser.ID }; connection.SERVICE.Add(srv); connection.SaveChanges(); serviceId = srv.ID; // добавить пользователя var user = new PLATFORM_USER { Email = "*****@*****.**", Login = "******", Password = "******", Title = "test", RegistrationDate = DateTime.Now }; connection.PLATFORM_USER.Add(user); connection.SaveChanges(); testUserId = user.ID; // добавить счет и сделок var group = connection.ACCOUNT_GROUP.First(g => !g.IsReal); var account = new ACCOUNT { AccountGroup = group.Code, Currency = AccountCurrency, Balance = 30000 }; connection.ACCOUNT.Add(account); connection.SaveChanges(); testAccountId = account.ID; // назначить пользователя владельцем счета connection.PLATFORM_USER_ACCOUNT.Add(new PLATFORM_USER_ACCOUNT { Account = testAccountId, PlatformUser = testUserId, RightsMask = (int)AccountRights.Управление }); // подписать счет на сигнал connection.SUBSCRIPTION.Add(new SUBSCRIPTION { User = testUserId, Service = serviceId, RenewAuto = true, TimeEnd = DateTime.Now.Date.AddDays(1) }); connection.SUBSCRIPTION_SIGNAL.Add(new SUBSCRIPTION_SIGNAL { User = testUserId, Service = serviceId, AutoTrade = true, PercentLeverage = 120, MinVolume = 10000, TargetAccount = testAccountId }); connection.SaveChanges(); // позиции MakeOrdersForTest(); foreach (var order in ordersForTest) { var pos = LinqToEntity.UndecorateOpenedPosition(order); connection.POSITION.Add(pos); } connection.SaveChanges(); // прописать срез котировок var nowTime = DateTime.Now; Contract.Util.BL.QuoteStorage.Instance.UpdateValues(new [] { "EURUSD", "GBPUSD", "USDJPY", "EURGBP" }, new [] { new QuoteData(1.3820f, 1.3822f, nowTime), new QuoteData(1.5350f, 1.5354f, nowTime), new QuoteData(90.81f, 90.83f, nowTime), new QuoteData(1.1107f, 1.1112f, nowTime) } ); }