public void TestGetAccountShareHistory() { conn.ACCOUNT_SHARE_HISTORY.Add(new ACCOUNT_SHARE_HISTORY { Account = testAccount.ID, ShareOwner = shareOwner.ID, NewShare = 50, NewHWM = 25400, ShareAmount = 25300, Date = DateTime.Now.Date.AddDays(-5) }); conn.ACCOUNT_SHARE_HISTORY.Add(new ACCOUNT_SHARE_HISTORY { Account = testAccount.ID, ShareOwner = shareOwner.ID, NewShare = 49.95M, NewHWM = 25800, ShareAmount = 25800, Date = DateTime.Now.Date.AddDays(-4) }); conn.ACCOUNT_SHARE_HISTORY.Add(new ACCOUNT_SHARE_HISTORY { Account = testAccount.ID, ShareOwner = conn.PLATFORM_USER.First(u => u.ID != shareOwner.ID).ID, NewShare = 50.05M, NewHWM = 25810, ShareAmount = 25810, Date = DateTime.Now.Date.AddDays(-4) }); conn.SaveChanges(); var records = testManager.GetAccountShareHistory(testAccount.ID, shareOwner.Login); Assert.AreEqual(2, records.Count, "GetAccountShareHistory() - должен вернуть 2 записи"); }
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 void TestCleanupPositionQuery() { var stalePositions = SignalExecutor.GetStaleOrders(); Assert.AreEqual(0, stalePositions.Count, "Устаревших сигнальных сделок быть не должно"); allPositions[1].MasterOrder = allPositions[0].ID + 50; conn.SaveChanges(); stalePositions = SignalExecutor.GetStaleOrders(); Assert.AreEqual(1, stalePositions.Count, "Один сигнал должен числиться устаревшим"); }
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"); }
private void MakeTestData() { testAccount = conn.ACCOUNT.First(a => !a.POSITION.Any() && a.Balance >= 10000 && a.Currency == "USD"); // создать тестовые ордера // создать сделки по счету testOrders = PositionMaker.MakePositions(conn, testAccount.ID); conn.SaveChanges(); }
private void MakeTestContents() { // добавить тестовый счет var group = conn.ACCOUNT_GROUP.First(g => !g.IsReal); group.SwapFree = false; account = new ACCOUNT { AccountGroup = group.Code, Currency = "USD", Balance = 10000, Description = "test", Status = (int)Account.AccountStatus.Created }; conn.ACCOUNT.Add(account); conn.SaveChanges(); // задать всем дефолтовый своп foreach (var spot in conn.SPOT) { spot.SwapBuy = SwapBuy; spot.SwapSell = SwapSell; } // создать сделки по счету allPositions = PositionMaker.MakePositions(conn, account.ID); conn.SaveChanges(); foreach (var pos in allPositions) { // расчетное значение своп-а var swap = DalSpot.Instance.GetAbsValue(pos.Symbol, pos.Side > 0 ? SwapBuy : SwapSell); swap = swap * pos.Volume; // перевести своп в валюту счета string errorStr; swap = DalSpot.Instance.ConvertToTargetCurrency(pos.Symbol, false, account.Currency, (double)swap, QuoteStorage.Instance.ReceiveAllData(), out errorStr) ?? 0; swapByPos.Add(pos, swap); } }
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 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 SetupTest() { MakeFakeTradeProxy(); conn = TradeSharpConnectionPersistent.InitializeTradeSharpConnection(); // очистить подписки на портфели foreach (var sub in conn.USER_TOP_PORTFOLIO.ToList()) { conn.USER_TOP_PORTFOLIO.Remove(sub); } foreach (var portf in conn.TOP_PORTFOLIO.ToList()) { conn.TOP_PORTFOLIO.Remove(portf); } conn.SaveChanges(); // определить владельцев портфелей и подписантов portOwners = conn.PLATFORM_USER_ACCOUNT.Where(a => a.RightsMask == (int)AccountRights.Управление).Take(2).ToArray(); var lastOwnerId = portOwners[portOwners.Length - 1].PlatformUser; portSubs = conn.PLATFORM_USER_ACCOUNT.Where(a => a.RightsMask == (int)AccountRights.Управление).Where(a => a.PlatformUser > lastOwnerId).Take(2).ToArray(); // создать портфели portfolios = new [] { new TOP_PORTFOLIO { Criteria = "AYP", ParticipantCount = 3, OwnerUser = portOwners[0].PlatformUser, Name = "P1" }, new TOP_PORTFOLIO { Criteria = "DD", ParticipantCount = 2, OwnerUser = portOwners[1].PlatformUser, Name = "P1" } }; foreach (var pf in portfolios) { conn.TOP_PORTFOLIO.Add(pf); } conn.SaveChanges(); // подписать пользователей на портфели var curPortfolioIndex = 0; foreach (var usr in portSubs) { var port = portfolios[curPortfolioIndex++]; if (curPortfolioIndex == portfolios.Length) { curPortfolioIndex = 0; } conn.USER_TOP_PORTFOLIO.Add(new USER_TOP_PORTFOLIO { User = usr.PlatformUser, Portfolio = port.Id }); } conn.SaveChanges(); }
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) } ); }