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 записи");
        }
Example #2
0
        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");
        }
Example #5
0
 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 (вывод всех средств) - должна удалиться долька нашего пайщика");
        }
Example #9
0
        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)
            }
                                                                );
        }