/// <summary>
        /// подписать на портфель
        /// отключить остальные подписки
        /// если портфель пользовательский - сохранить его
        /// </summary>
        public RequestStatus SubscribeOnPortfolio(
            ProtectedOperationContext secCtx,
            string subscriberLogin,
            TopPortfolio portfolio,
            decimal?maxFee,
            AutoTradeSettings tradeAutoSettings)
        {
            //Logger.InfoFormat("SubscribeOnPortfolio({0})", subscriberLogin);
            if (UserOperationRightsStorage.IsProtectedOperation(UserOperation.BindToSignal))
            {
                if (!UserSessionStorage.Instance.PermitUserOperation(secCtx,
                                                                     UserOperationRightsStorage.IsTradeOperation(UserOperation.BindToSignal), false))
                {
                    return(RequestStatus.Unauthorized);
                }
            }

            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                    return(walletRepository.SubscribeUserOnPortfolio(ctx, subscriberLogin, portfolio, maxFee, tradeAutoSettings));
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в SubscribeOnPortfolio()", ex);
                return(RequestStatus.ServerError);
            }
        }
Exemplo n.º 2
0
 public static void UndecoratePortfolio(TOP_PORTFOLIO dest, TopPortfolio src)
 {
     dest.Criteria         = src.Criteria;
     dest.DescendingOrder  = src.DescendingOrder;
     dest.ManagedAccount   = src.ManagedAccount;
     dest.MarginValue      = src.MarginValue;
     dest.Name             = src.Name;
     dest.OwnerUser        = src.OwnerUser;
     dest.ParticipantCount = src.ParticipantCount;
 }
Exemplo n.º 3
0
        public RequestStatus SubscribeOnPortfolio(string hash, string userLogin, long localTime,
                                                  int portfolioId, AutoTradeSettings tradeAutoSettings)
        {
            var portfolio = new TopPortfolio
            {
                Id = portfolioId
            };

            return(SubscribeOnUserOrCustomPortfolio(hash, userLogin, localTime, portfolio, tradeAutoSettings));
        }
Exemplo n.º 4
0
 public RequestStatus SubscribeOnPortfolio(ProtectedOperationContext secCtx, string subscriberLogin,
                                           TopPortfolio portfolio, decimal?maxFee, AutoTradeSettings tradeAutoSettings)
 {
     try
     {
         return(Proxy.SubscribeOnPortfolio(secCtx, subscriberLogin, portfolio, maxFee, tradeAutoSettings));
     }
     catch (Exception)
     {
         RenewChannel();
         return(Proxy.SubscribeOnPortfolio(secCtx, subscriberLogin, portfolio, maxFee, tradeAutoSettings));
     }
 }
Exemplo n.º 5
0
        public RequestStatus SubscribeOnCustomPortfolio(string hash, string userLogin, long localTime,
                                                        string formula, float?marginValue, int topCount,
                                                        AutoTradeSettings tradeAutoSettings)
        {
            var portfolio = new TopPortfolio
            {
                Criteria         = formula,
                MarginValue      = marginValue,
                ParticipantCount = topCount
            };

            return(SubscribeOnUserOrCustomPortfolio(hash, userLogin, localTime, portfolio, tradeAutoSettings));
        }
Exemplo n.º 6
0
 public static TOP_PORTFOLIO UndecoratePortfolio(TopPortfolio p)
 {
     return(new TOP_PORTFOLIO
     {
         Criteria = p.Criteria,
         DescendingOrder = p.DescendingOrder,
         Id = p.Id,
         ManagedAccount = p.ManagedAccount,
         MarginValue = p.MarginValue,
         Name = p.Name,
         ParticipantCount = p.ParticipantCount,
         OwnerUser = p.OwnerUser
     });
 }
        public void SetupPortfolio(TopPortfolio portfolio)
        {
            this.portfolio = portfolio;

            lblPortfolioName.Text =
                (portfolio.IsCompanyPortfolio
                    ? (Localizer.GetString("TitlePortfolio") + " \"" + portfolio.Name + "\"")
                    : (Localizer.GetString("TitleUserPortfolio")) +
                 " [" + portfolio.ParticipantCount + "]");

            // сформировать формулу с подсветкой
            formulaBrowser.DocumentText = PerformerStatField.GetFormulaHighlightedHtml(portfolio.Criteria);

            tbCount.Value = portfolio.ParticipantCount;
            if (portfolio.IsCompanyPortfolio)
            {
                tbCount.Enabled = false;
            }
        }
Exemplo n.º 8
0
        private RequestStatus SubscribeOnUserOrCustomPortfolio(string hash, string userLogin, long localTime,
                                                               TopPortfolio portfolio,
                                                               AutoTradeSettings tradeAutoSettings)
        {
            if (portfolio == null)
            {
                Logger.Error("SubscribeOnUserOrCustomPortfolio(null)");
                return(RequestStatus.BadRequest);
            }

            Logger.InfoFormat("SubscribeOnUserOrCustomPortfolio({0}, портфель {1})", userLogin,
                              portfolio.Id > 0 ? "#" + portfolio.Id : portfolio.Criteria);
            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var user = ctx.PLATFORM_USER.FirstOrDefault(u => u.Login == userLogin);
                    if (user == null)
                    {
                        return(RequestStatus.Unauthorized);
                    }

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

                    var status = walletRepository.SubscribeUserOnPortfolio(ctx, userLogin, portfolio, null, tradeAutoSettings);
                    if (status != RequestStatus.OK)
                    {
                        Logger.Info("SubscribeOnUserOrCustomPortfolio: status: " + status);
                    }
                    return(status);
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в SubscribeOnUserOrCustomPortfolio()", ex);
                return(RequestStatus.ServerError);
            }
        }
Exemplo n.º 9
0
        private void LoadPortfolioSubscribers(TopPortfolio portfolio)
        {
            var perfs = new List <PerformerStatEx>();
            var cats  = SubscriptionModel.Instance.SubscribedCategories ?? new List <Contract.Entity.Subscription>();

            try
            {
                perfs.AddRange(portfolio.Managers.Select(performer => new PerformerStatEx(performer)
                {
                    IsSubscribed = cats.Any(c => c.Service == performer.Service),
                }));
            }
            catch (Exception ex)
            {
                Logger.Info("SubscriptionControl.LoadPortfolioSubscribers", ex);
            }
            performers = perfs;
            performerGridCtrl.DataBind(performers, chat);
            topFilterControl.RefreshButtonEnabled = true;
            refreshButton.Enabled = true;
        }
 public CompleteSubscribeOnPortfolioDlg(TopPortfolio portfolio) : this()
 {
     completeSubscribeOnPortfolioControl1.SetupPortfolio(portfolio);
 }
Exemplo n.º 11
0
        private void CreatePortfolioButtonClick(object sender, EventArgs e)
        {
            var portfolioName = "TOP " + AccountModel.Instance.GetUserLogin();

            if (portfolioName.Length > 50)
            {
                portfolioName = portfolioName.Substring(0, 50);
            }
            var portfolio = new TopPortfolio
            {
                Name             = portfolioName,
                Criteria         = SelectedFunction.Function,
                DescendingOrder  = SelectedFunction.PreferredSortOrder == SortOrder.Descending,
                MarginValue      = SelectedFunction.MarginValue,
                ParticipantCount = ParticipantCount
            };

            var complete = new CompleteSubscribeOnPortfolioDlg(portfolio).ShowDialog() == DialogResult.OK;

            if (!complete)
            {
                return;
            }

            // открыть диалог настройки авто-торговли
            var dlg = new AutoTradeSettingsForm();

            if (dlg.ShowDialog(this) != DialogResult.OK)
            {
                return;
            }
            var tradeSettings = dlg.sets;

            RequestStatus status;

            try
            {
                status =
                    AccountModel.Instance.ServerProxy.SubscribeOnPortfolio(
                        CurrentProtectedContext.Instance.MakeProtectedContext(),
                        AccountModel.Instance.GetUserLogin(), portfolio, null, tradeSettings);
            }
            catch (Exception ex)
            {
                //4 debug
                MessageBox.Show(this, "Операция выполнена с ошибкой:" + Environment.NewLine + ex.Message, "Предупреждение",
                                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Logger.Info("TopPortfolioControl.Subscribe: error calling SubscribeOnPortfolio/UnsubscribePortfolio", ex);
                return;
            }
            if (status == RequestStatus.OK)
            {
                MessageBox.Show(this, "Операция выполнена успешно", "Информация", MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show(this,
                                "Операция выполнена с ошибкой:" + Environment.NewLine +
                                EnumFriendlyName <RequestStatus> .GetString(status), "Предупреждение", MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);
            }
        }
Exemplo n.º 12
0
        private static AccountEfficiency GeneratePortfolioAccountEfficiency(TopPortfolio portfolio, IAccountStatistics proxy)
        {
            var portfolioEfficiency = new AccountEfficiency();
            var efficiencies        = new List <AccountEfficiency>();

            // detect beginning
            DateTime?beginDate = null;

            foreach (var performerStat in portfolio.Managers)
            {
                var efficiency = proxy.GetAccountEfficiencyShort(performerStat.Account, false, false);
                efficiencies.Add(efficiency);
                var firstDate = efficiency.listProfit1000.Min(e => e.time);
                if (!beginDate.HasValue)
                {
                    beginDate = firstDate;
                }
                else
                if (firstDate < beginDate.Value)
                {
                    beginDate = firstDate;
                }
            }
            if (!beginDate.HasValue)
            {
                return(null);
            }

            // pofit1000 calc
            portfolioEfficiency.listProfit1000 = new List <EquityOnTime>();
            portfolioEfficiency.listEquity     = new List <EquityOnTime>();
            for (var date = beginDate.Value; date < DateTime.Now; date = date.AddDays(1))
            {
                float equity = 0;
                foreach (var efficiency in efficiencies)
                {
                    var equityOnTime = efficiency.listProfit1000.Find(e => e.time == date);
                    if (equityOnTime.time == default(DateTime))
                    {
                        continue;
                    }
                    equity += equityOnTime.equity;
                }
                equity /= efficiencies.Count;
                portfolioEfficiency.listProfit1000.Add(new EquityOnTime(equity, date));
            }
            if (!AccountModel.Instance.AccountId.HasValue || portfolioEfficiency.listProfit1000.Count == 0)
            {
                return(null);
            }

            // pofit calc
            var stat = proxy.GetPerformerByAccountId(AccountModel.Instance.AccountId.Value);
            // пусть performerStat.Equity соответствует последней точке на кривой доходности на 1000
            var profitFactor = stat.Equity / portfolioEfficiency.listProfit1000.Last().equity;

            foreach (var equityOnTime in portfolioEfficiency.listProfit1000)
            {
                portfolioEfficiency.listEquity.Add(new EquityOnTime(equityOnTime.equity * profitFactor, equityOnTime.time));
            }

            // stats calc
            portfolioEfficiency.listTransaction = new List <BalanceChange>();
            portfolioEfficiency.InitialBalance  = portfolioEfficiency.listEquity[0].equity;
            portfolioEfficiency.StartDate       = portfolioEfficiency.listEquity[0].time;
            new EfficiencyCalculator().CalculateProfitCoeffs(portfolioEfficiency);

            return(portfolioEfficiency);
        }
        public TopPortfolio GetTopPortfolio(int id, out AccountEfficiency userAccountEfficiency)
        {
            userAccountEfficiency = null;
            TopPortfolio result;

            try
            {
                // reading db
                using (var context = DatabaseContext.Instance.Make())
                {
                    try
                    {
                        var portfolio = context.TOP_PORTFOLIO.FirstOrDefault(p => p.Id == id);
                        if (portfolio == null)
                        {
                            return(null);
                        }

                        result = new TopPortfolio
                        {
                            Id               = portfolio.Id,
                            Name             = portfolio.Name,
                            Criteria         = portfolio.Criteria,
                            ParticipantCount = portfolio.ParticipantCount,
                            DescendingOrder  = portfolio.DescendingOrder,
                            MarginValue      = (float?)portfolio.MarginValue,
                            ManagedAccount   = portfolio.ManagedAccount,
                            OwnerUser        = portfolio.OwnerUser
                        };
                    }
                    catch (Exception ex)
                    {
                        Logger.Error("AccountEfficiencyCache.GetTopPortfolio.db - read error", ex);
                        return(null);
                    }
                }

                // Statistics
                if (result.ManagedAccount.HasValue)
                {
                    result.Statistics = GetPerformerByAccountId(result.ManagedAccount.Value);
                }

                // идентификаторы сигнальщиков
                // тут будут корректировки, потому что вхождение сигнальщика в топ не всегда на данный момент времени соответствует критерию
                // потому что обновление топов и обновлние статистики сигнальщиков выполняются в разное время, а результаты выборки хранятся только run-time
                var performers = GetAllPerformersWithCriteria(true, result.Criteria, result.ParticipantCount,
                                                              !result.DescendingOrder, result.MarginValue, 0);

                if (result.Statistics == null || performers == null)
                {
                    Logger.ErrorFormat("GetTopPortfolio() - статистика / перформеры не получены, кеш обновлен: {0}", cacheUpdated);
                    return(result);
                }

                // ManagerIds
                result.ManagerIds = performers.Select(p => p.Account).ToList();

                // Manages
                result.Managers = performers;

                // Orders
                if (result.ManagedAccount.HasValue)
                {
                    result.Orders = GetAccountDeals(result.ManagedAccount.Value, true);
                }

                if (result.IsCompanyPortfolio)
                {
                    return(result);
                }

                // ----------------
                // 4 user portfolio
                // ----------------
                if (!cacheUpdated)
                {
                    return(null);
                }
                var managersFullStat = new List <AccountEfficiency>();

                // beginning of profit1000 chart
                if (result.ManagerIds == null)
                {
                    throw new Exception("GetTopPortfolio(польз. портфель) - список Id менеджеров = null");
                }

                DateTime?beginDate = null;
                try
                {
                    foreach (var managerId in result.ManagerIds)
                    {
                        var stat = dicPerformers.ReceiveValue(managerId);
                        if (stat == null)
                        {
                            Logger.Error("AccountEfficiencyCache.GetTopPortfolio.dicPerformers.TryGetValue returned null");
                            return(null); // ManagerIds.Count != managersFullStat.Count
                        }
                        if (stat.listProfit1000 == null || stat.listProfit1000.Count == 0)
                        {
                            continue;
                        }
                        managersFullStat.Add(stat);
                        // detect beginning
                        var firstDate = stat.listProfit1000.Min(e => e.time);
                        if (!beginDate.HasValue)
                        {
                            beginDate = firstDate;
                        }
                        else
                        if (firstDate < beginDate.Value)
                        {
                            beginDate = firstDate;
                        }
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error("AccountEfficiencyCache.GetTopPortfolio - stat gen error", ex);
                    return(null);
                }

                // userAccountEfficiency
                userAccountEfficiency = new AccountEfficiency
                {
                    listProfit1000 = new List <EquityOnTime>(),
                };

                // pofit1000 calc
                if (beginDate.HasValue)
                {
                    for (var date = beginDate.Value.Date; date < DateTime.Now; date = date.AddDays(1))
                    {
                        float equity      = 0;
                        var   equityCount = 0;
                        foreach (var fullStat in managersFullStat)
                        {
                            var equityOnTime = fullStat.listProfit1000.Find(e => e.time == date);
                            if (equityOnTime.time == default(DateTime))
                            {
                                continue;
                            }
                            equity += equityOnTime.equity;
                            equityCount++;
                        }
                        if (equityCount == 0) // данных на этот день недостаточно - пропускаем
                        {
                            continue;
                        }
                        equity /= equityCount;
                        userAccountEfficiency.listProfit1000.Add(new EquityOnTime(equity, date));
                    }
                }

                // stats calc
                userAccountEfficiency.Statistics.DealsCount = managersFullStat.Sum(s => s.Statistics.DealsCount);
                Logger.InfoFormat("запрошен портфель - GetTopPortfolio({0}, {1} управляющих)", result.Name, result.Managers);

                return(result);
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в GetTopPortfolio", ex);
                throw;
            }
        }
Exemplo n.º 14
0
        public RequestStatus SubscribeUserOnPortfolio(
            TradeSharpConnection ctx,
            string subscriberLogin,
            TopPortfolio portfolio,
            decimal?maxFee,
            AutoTradeSettings tradeAutoSettings)
        {
            var user = ctx.PLATFORM_USER.FirstOrDefault(u => u.Login == subscriberLogin);

            if (user == null)
            {
                return(RequestStatus.Unauthorized);
            }

            TOP_PORTFOLIO targetPortfolio = null;

            if (portfolio.Id > 0)
            {
                targetPortfolio = ctx.TOP_PORTFOLIO.FirstOrDefault(p => p.Id == portfolio.Id);
            }
            if (targetPortfolio != null)
            {
                portfolio.ManagedAccount = targetPortfolio.ManagedAccount;
            }

            // если портфель - пользовательский - сохранить его
            // для пользователя или обновить его имеющийся портфель
            if (!portfolio.IsCompanyPortfolio)
            {
                Logger.Info("SubscribeOnPortfolio() - user portfolio");
                try
                {
                    var existPortfolio = ctx.TOP_PORTFOLIO.FirstOrDefault(p => p.OwnerUser == user.ID);
                    if (existPortfolio != null)
                    {
                        if (!LinqToEntity.DecoratePortfolio(existPortfolio).AreSame(portfolio))
                        {
                            // удалить старый портфель пользователя
                            ctx.TOP_PORTFOLIO.Remove(existPortfolio);
                            existPortfolio = null;
                        }
                        else
                        {
                            targetPortfolio = existPortfolio;
                        }
                    }
                    // создать портфель пользователя
                    if (existPortfolio == null)
                    {
                        targetPortfolio                = LinqToEntity.UndecoratePortfolio(portfolio);
                        targetPortfolio.OwnerUser      = user.ID;
                        targetPortfolio.ManagedAccount = null;
                        ctx.TOP_PORTFOLIO.Add(targetPortfolio);
                        ctx.SaveChanges();
                    }
                }
                catch (DbEntityValidationException dbEx)
                {
                    Logger.Error("SubscribeUserOnPortfolio - ошибка сохранения портфеля");
                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                    {
                        foreach (var validationError in validationErrors.ValidationErrors)
                        {
                            Logger.ErrorFormat("Свойство: {0}, ошибка: {1}",
                                               validationError.PropertyName, validationError.ErrorMessage);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error("Ошибка в SubscribeOnPortfolio() - обновление портфеля", ex);
                    return(RequestStatus.ServerError);
                }
            }
            else
            {// портфель компании
                Logger.Info("SubscribeOnPortfolio() - company portfolio");
                if (targetPortfolio == null)
                {
                    Logger.Error("Пользователь запросил несуществующий портфель компании " + portfolio.Id);
                    return(RequestStatus.ServerError);
                }
            }

            // очистить подписки пользователя на портфели
            // и привязать его к целевому портфелю
            //Logger.Info("SubscribeOnPortfolio() - removing bindings");
            var oldBinding = ctx.USER_TOP_PORTFOLIO.FirstOrDefault(u => u.User == user.ID);

            // "посмотреть" настройки портфельной торговли в имеющейся подписке
            if (tradeAutoSettings == null)
            {
                if (oldBinding == null)
                {
                    Logger.ErrorFormat("Подписка пользователя {0} на портфель {1} - нет данных по автоматической торговле",
                                       user.Login, portfolio.Id > 0 ? portfolio.Id.ToString() : portfolio.Name);
                    return(RequestStatus.BadRequest);
                }
                tradeAutoSettings = new AutoTradeSettings
                {
                    FixedVolume          = oldBinding.FixedVolume,
                    HedgingOrdersEnabled = oldBinding.HedgingOrdersEnabled,
                    MaxLeverage          = oldBinding.MaxLeverage,
                    MaxVolume            = oldBinding.MaxVolume,
                    MinVolume            = oldBinding.MinVolume,
                    PercentLeverage      = oldBinding.PercentLeverage ?? 100,
                    StepVolume           = oldBinding.StepVolume,
                    TargetAccount        = oldBinding.TargetAccount,
                    TradeAuto            = oldBinding.AutoTrade ?? false,
                    VolumeRound          = (VolumeRoundType?)oldBinding.VolumeRound
                };
            }

            if (oldBinding != null)
            {
                ctx.USER_TOP_PORTFOLIO.Remove(oldBinding);
            }

            //Logger.Info("SubscribeOnPortfolio() - adding binding");
            ctx.USER_TOP_PORTFOLIO.Add(new USER_TOP_PORTFOLIO
            {
                User                 = user.ID,
                Portfolio            = targetPortfolio.Id,
                MaxFee               = maxFee,
                AutoTrade            = tradeAutoSettings.TradeAuto,
                MaxLeverage          = tradeAutoSettings.MaxLeverage,
                PercentLeverage      = tradeAutoSettings.PercentLeverage,
                HedgingOrdersEnabled = tradeAutoSettings.HedgingOrdersEnabled,
                FixedVolume          = tradeAutoSettings.FixedVolume,
                MinVolume            = tradeAutoSettings.MinVolume,
                MaxVolume            = tradeAutoSettings.MaxVolume,
                VolumeRound          = (int?)tradeAutoSettings.VolumeRound,
                StepVolume           = tradeAutoSettings.StepVolume,
                TargetAccount        = tradeAutoSettings.TargetAccount
            });
            ctx.SaveChanges();
            //Logger.Info("SubscribeOnPortfolio() - changes are saved");

            // найти трейдеров, удовлетворяющих критерию
            List <PerformerStat> performers;

            try
            {
                try
                {
                    performers = TradeSharpAccountStatistics.Instance.proxy.GetAllPerformersWithCriteria(true,
                                                                                                         targetPortfolio.Criteria, targetPortfolio.ParticipantCount,
                                                                                                         !targetPortfolio.DescendingOrder, (float?)targetPortfolio.MarginValue, 0);
                }
                catch (Exception ex)
                {
                    Logger.Error(
                        "Ошибка в SubscribeOnPortfolio() - получение перформеров (" + targetPortfolio.Criteria + ")",
                        ex);
                    return(RequestStatus.ServerError);
                }

                if (performers == null)
                {
                    Logger.Error("Ошибка в SubscribeOnPortfolio() - список перформеров не получен (" + targetPortfolio.Criteria + ")");
                    return(RequestStatus.ServerError);
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в SubscribeOnPortfolio() - подписка", ex);
                return(RequestStatus.ServerError);
            }

            // сравнить полученный список с текущими подписками заказчика ("инвестора")
            // сформировать список для "отписки" и список для подписки
            var performerAcs = performers.Select(p => p.Account).ToList();
            var subsToRemove = ctx.SUBSCRIPTION.Where(s => s.User == user.ID &&
                                                      s.SERVICE1.ServiceType == (int)PaidServiceType.Signals &&
                                                      !performerAcs.Contains(s.SERVICE1.AccountId ?? 0)).ToList();

            foreach (var sub in subsToRemove)
            {
                WalletError error;
                SubscribeOnService(ctx, user.ID, sub.Service, false, true, tradeAutoSettings, out error);
                if (error != WalletError.OK)
                {
                    Logger.ErrorFormat("Portfolio - unsubscribe user {0} from srv {1}: error {2}",
                                       user.ID, sub.Service, error);
                }
            }

            // новоподписавшиеся
            foreach (var pf in performers)
            {
                WalletError error;
                SubscribeOnService(ctx, user.ID, pf.Service, true, false, tradeAutoSettings, out error);
                if (error != WalletError.OK)
                {
                    Logger.DebugFormat("Подписка SubscribeOnPortfolio({0}), сигн. {1}: {2}",
                                       subscriberLogin, pf.Service, error);
                }
            }
            return(RequestStatus.OK);
        }
Exemplo n.º 15
0
 public TopPortfolioForm(TopPortfolio portfolio) : this()
 {
     Text = portfolio.Name;
     topPortfolioControl.Portfolio = portfolio;
 }
Exemplo n.º 16
0
 public RequestStatus SubscribeOnPortfolio(ProtectedOperationContext secCtx, string subscriberLogin,
                                           TopPortfolio portfolio, decimal?maxFee, AutoTradeSettings tradeAutoSettings)
 {
     return(RequestStatus.CommonError);
 }
Exemplo n.º 17
0
        public RequestStatus GetUserPortfolioAndSubscriptions(string hash, string userLogin, long localTime,
                                                              out List <Subscription> signals, out TopPortfolio portfolio)
        {
            portfolio = null;

            using (var ctx = DatabaseContext.Instance.Make())
            {
                var error = GetUserSubscribedCats(ctx, userLogin, hash, localTime, out signals);
                if (error != RequestStatus.OK)
                {
                    return(error);
                }

                try
                {
                    var query = from us in ctx.PLATFORM_USER
                                join up in ctx.USER_TOP_PORTFOLIO on us.ID equals up.User
                                join pf in ctx.TOP_PORTFOLIO on up.Portfolio equals pf.Id
                                where us.Login == userLogin
                                select new TopPortfolio
                    {
                        Id = pf.Id,
                        ParticipantCount = pf.ParticipantCount,
                        Criteria         = pf.Criteria,
                        MarginValue      = (float?)pf.MarginValue,
                        DescendingOrder  = pf.DescendingOrder,
                        ManagedAccount   = pf.ManagedAccount,
                        Name             = pf.Name,
                        OwnerUser        = pf.OwnerUser
                    };

                    portfolio = query.FirstOrDefault();
                    return(RequestStatus.OK);
                }
                catch (Exception ex)
                {
                    Logger.Error("Ошибка в GetUserPortfolioAndSubscriptions", ex);
                    return(RequestStatus.ServerError);
                }
            }
        }
Exemplo n.º 18
0
        private void RenderAccountSubscriptions(StringBuilder sb, int accountId)
        {
            var farmAccount = RobotFarm.Instance.Accounts.FirstOrDefault(a => a.AccountId == accountId);

            if (farmAccount == null)
            {
                sb.AppendLine("    <h3>Счет не найден</h3>");
                return;
            }

            sb.AppendLine("    <p>Настройки авто-торговли по сигналам: <a href=\"?portfolioTradeSettings=1\">редактировать</a></p>");

            // получить все подписки пользователя: на торговые сигналы (SUBSCRIPTION)
            // и на портфели
            List <Subscription> subscriptions = null;

            try
            {
                subscriptions = TradeSharpAccount.Instance.proxy.GetSubscriptions(farmAccount.UserLogin);
            }
            catch (Exception ex)
            {
                sb.AppendLine("     <h3>Подписка на торговые сигналы не прочитана: " + ex.Message + "</h3>");
                Logger.Error("GetTradeSignalsSubscribed()", ex);
            }
            if (subscriptions != null && subscriptions.Count > 0)
            {
                RenderTableOpenTag(sb);
                RenderTableRowTag(sb, true);
                sb.AppendLine("        <td>№</td><td>Сигнал</td><td>Торговать</td><td>Объем</td>" +
                              "<td>Макс.плечо</td><td>Мин/шаг</td></tr>");

                foreach (var sig in subscriptions)
                {
                    var tradeSets = sig.AutoTradeSettings ?? new AutoTradeSettings();
                    sb.AppendLine(string.Format(
                                      "        <tr><td>{0}</td> <td>{1}</td> <td>{2}</td> <td>{3}</td> <td>{4:f1}</td> <td>{5}</td></tr>",
                                      sig.Service,
                                      sig.PaidService.Comment,
                                      tradeSets.TradeAuto ? "да" : "нет",
                                      tradeSets.FixedVolume.HasValue ? tradeSets.FixedVolume.Value.ToStringUniformMoneyFormat() : ((int)tradeSets.PercentLeverage).ToString() + "%",
                                      tradeSets.MaxLeverage,
                                      (tradeSets.MinVolume.HasValue ? tradeSets.MinVolume.Value.ToStringUniformMoneyFormat() : "-") + "/" +
                                      (tradeSets.StepVolume.HasValue ? tradeSets.StepVolume.Value.ToStringUniformMoneyFormat() : "-")));
                }
                sb.AppendLine("      </table>");
            }

            // подписка пользователя на портфель
            TopPortfolio      portfolio = null;
            AccountEfficiency efficiency;// = null;

            try
            {
                var portfolioId = TradeSharpAccountStatistics.Instance.proxy.GetSubscribedTopPortfolioId(farmAccount.UserLogin);
                if (portfolioId > 0)
                {
                    portfolio = TradeSharpAccountStatistics.Instance.proxy.GetTopPortfolio(portfolioId, out efficiency);
                }
            }
            catch (Exception ex)
            {
                sb.AppendLine("     <h3>Подписка на портфель не прочитана: " + ex.Message + "</h3>");
                Logger.Error("GetSubscribedTopPortfolio()", ex);
            }

            if (portfolio != null)
            {
                sb.AppendLine("    <br/> <p>");
                sb.AppendLine(string.Format("      Подписан на портфель - ТОП {0} {1} <br/>",
                                            portfolio.ParticipantCount, portfolio.Name));
                sb.AppendLine(string.Format("      {0} управляющих в портфеле<br/>", portfolio.Managers.Count));
                sb.AppendLine("    </p>");
            }
        }
        public void TestSubscribeOnCustomPortfolio()
        {
            var managerTrade = ManagerTrade.Instance;
            var portfolio    = new TopPortfolio
            {
                Criteria         = "P",
                DescendingOrder  = true,
                ParticipantCount = 6,
                Name             = "UserGeniusExclusiveTop",
            };
            var tradeSets = AutoTradeSettingsSampler.MakeSampleTradeSettings();

            tradeSets.TargetAccount = conn.PLATFORM_USER_ACCOUNT.First(pa => pa.PlatformUser == subscriber.ID).Account;
            var status = managerTrade.SubscribeOnPortfolio(ProtectedOperationContext.MakeServerSideContext(),
                                                           subscriber.Login, portfolio, null, tradeSets);

            Assert.AreEqual(RequestStatus.OK, status, "SubscribeOnPortfolio - удалось подписаться");
            // проверить количество подписок
            var userSubsCount = conn.SUBSCRIPTION.Count(s => s.User == subscriber.ID);

            Assert.AreEqual(portfolio.ParticipantCount, userSubsCount, "SubscribeOnPortfolio - подписался на всех в портфеле");

            // проверить настройки авто-торговли
            var subSettings = conn.SUBSCRIPTION_SIGNAL.First(ss => ss.User == subscriber.ID);
            var wrongFields = AutoTradeSettingsSampler.TradeSignalSetsAreCorrect(tradeSets, subSettings);

            if (!string.IsNullOrEmpty(wrongFields))
            {
                Assert.Fail("SubscribeOnPortfolio - настройки авто-торговли не сохранены в подписке: " + wrongFields);
            }

            // настройки авто-торговли для самого портфеля
            var portfolioTradeSets = (from upf in conn.USER_TOP_PORTFOLIO
                                      join pf in conn.TOP_PORTFOLIO on upf.Portfolio equals pf.Id
                                      where upf.User == subscriber.ID
                                      select upf).FirstOrDefault();

            Assert.IsNotNull(portfolioTradeSets, "SubscribeOnPortfolio - портфель создан");
            var portfolioSignalSets = new SUBSCRIPTION_SIGNAL
            {
                AutoTrade            = portfolioTradeSets.AutoTrade,
                MaxLeverage          = portfolioTradeSets.MaxLeverage,
                PercentLeverage      = portfolioTradeSets.PercentLeverage,
                HedgingOrdersEnabled = portfolioTradeSets.HedgingOrdersEnabled,
                FixedVolume          = portfolioTradeSets.FixedVolume,
                MinVolume            = portfolioTradeSets.MinVolume,
                MaxVolume            = portfolioTradeSets.MaxVolume,
                VolumeRound          = portfolioTradeSets.VolumeRound,
                StepVolume           = portfolioTradeSets.StepVolume,
                TargetAccount        = portfolioTradeSets.TargetAccount
            };

            wrongFields = AutoTradeSettingsSampler.TradeSignalSetsAreCorrect(tradeSets, portfolioSignalSets);
            if (!string.IsNullOrEmpty(wrongFields))
            {
                Assert.Fail("SubscribeOnPortfolio - настройки авто-торговли не сохранены в портфеле: " + wrongFields);
            }

            // отписаться от портфеля
            status = managerTrade.UnsubscribePortfolio(ProtectedOperationContext.MakeServerSideContext(),
                                                       subscriber.Login, true, true);
            Assert.AreEqual(RequestStatus.OK, status, "SubscribeOnPortfolio - удалось отписаться");
            userSubsCount = conn.SUBSCRIPTION.Count(s => s.User == subscriber.ID);
            Assert.AreEqual(0, userSubsCount, "SubscribeOnPortfolio - отписался ото всех в портфеле");
        }
Exemplo n.º 20
0
 public RequestStatus SubscribeOnPortfolio(ProtectedOperationContext secCtx, string subscriberLogin, TopPortfolio portfolio,
                                           decimal?maxFee, AutoTradeSettings tradeSets)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 21
0
 public RequestStatus SubscribeOnPortfolio(ProtectedOperationContext secCtx, string subscriberLogin,
                                           TopPortfolio portfolio, decimal?maxFee, AutoTradeSettings tradeAutoSettings)
 {
     return(Channel.SubscribeOnPortfolio(secCtx, subscriberLogin, portfolio, maxFee, tradeAutoSettings));
 }