Example #1
0
 public static TradeAccount ToTradeAccount(this TradeAccounts t)
 {
     return(new TradeAccount
     {
         Id = t.Id,
         Login = t.Login
     });
 }
        private static OperationResult <string> GetTradeHistory(TradeAccounts account)
        {
            return(InvokeOperations.InvokeOperation(() =>
            {
                Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");

                var csv = new StringBuilder($"\"Login\";\"Ticket\";\"Symbol\";\"Price\";\"Profit\";\"Volume\";\"Date\";\"Direction\";\"Entry\";{Environment.NewLine}");

                foreach (var trade in account.Trades.OrderBy(x => x.Date))
                {
                    csv.AppendLine($"\"{account.Login}\";" +
                                   $"\"{trade.Ticket}\";" +
                                   $"\"{trade.Symbol}\";" +
                                   $"\"{trade.Price}\";" +
                                   $"\"{trade.Profit}\";" +
                                   $"\"{trade.Volume}\";" +
                                   $"\"{trade.Date:yyyy-MM-dd HH:mm:ss}\";" +
                                   $"\"{trade.Direction}\";" +
                                   $"\"{trade.Entry}\";");
                }
                return csv.ToString();
            }));
        }
        public OperationResult TradeAccountsCreated(List <AccountCreated> accounts)
        {
            return(InvokeOperations.InvokeOperation(() =>
            {
                foreach (var accountData in accounts)
                {
                    var participant = context.Participants.FirstOrDefault(x => x.Id == accountData.ParticipantId);
                    if (participant == null)
                    {
                        continue;
                    }

                    var tournament = context.Tournaments.FirstOrDefault(x => x.IsEnabled);
                    if (tournament == null)
                    {
                        continue;
                    }

                    var account = new TradeAccounts
                    {
                        Id = Guid.NewGuid(),
                        TournamentId = tournament.Id,
                        Login = accountData.Login,
                        Password = accountData.Password,
                        OrdersCount = 0,
                        StartBalance = accountData.StartBalance,
                        ParticipantId = accountData.ParticipantId,
                        TotalProfit = 0,
                        TotalProfitInPercent = 0,
                        TradeServerId = accountData.TradeServerId
                    };
                    context.Add(account);
                    context.SaveChanges();
                }
            }));
        }
        public void RecalculateChart(TradeAccounts account, int pointsCount = 30, ChartType type = ChartType.ByProfit)
        {
            var result = new List <decimal> {
                0
            };

            var startBalance = account.StartBalance;
            var profits      = account.Trades
                               .Where(x => x.Entry != TradeEntry.In)
                               .OrderBy(x => x.Date)
                               .Select(x => x.Profit)
                               .ToList();

            var statistic = new List <decimal>();
            var balances  = new List <decimal>();

            statistic.Add(0m);
            balances.Add(startBalance);
            for (var i = 0; i < profits.Count; i++)
            {
                statistic.Add((balances[i] + profits[i]) / startBalance * 100m - 100m);
                balances.Add(balances[i] + profits[i]);
            }

            var list = new List <List <decimal> >();
            var step = statistic.Count <= pointsCount
                ? 1
                : statistic.Count % pointsCount >= pointsCount / 3
                    ? statistic.Count / pointsCount + 1
                    : statistic.Count / pointsCount;

            var count = 0;

            do
            {
                list.Add(statistic.Skip(count).Take(step).ToList());
                count += step;
            } while (count < statistic.Count);

            if (!list.Any() || !list.First().Any())
            {
                return;
            }

            switch (type)
            {
            case ChartType.ByProfit:
                result = list
                         .Select(x => Math.Round(x.Average(y => y), 2))
                         .ToList();
                break;
            }

            if (profits.Count > pointsCount)
            {
                result.Add(account.TotalProfitInPercent);
            }

            context.RemoveRange(account.Charts.Where(x => x.Type == type));

            var index = 0;

            foreach (var chart in result)
            {
                context.Add(new Charts
                {
                    Id             = Guid.NewGuid(),
                    Type           = type,
                    Index          = index,
                    TradeAccountId = account.Id,
                    Value          = chart
                });
                index++;
            }

            context.SaveChanges();
        }