Example #1
0
        public JsonResult GetMonthBase([FromBody] Params param)
        {
            //Get History,Account
            var account   = _context.FrxAccount.SingleOrDefault(x => x.AccountId == param.AccountId);
            var positions = Position.GetPositions(param.ApiUrl, param.AccountId.ToString(), param.AccessToken);
            var histories = _context.FrxHistory.Where(x => x.AccountId == param.AccountId).OrderByDescending(x => x.ClosingTimestamp).ToList();
            var cashflow  = _context.FrxCashflow.Where(x => x.AccountId == param.AccountId);

            #region Get MonthBaseData
            //Get XData
            var          lastHistory      = histories[0];
            var          lastHisTimestamp = lastHistory.ClosingTimestamp;
            var          lastHisTime      = ConvertJson.StampToDateTime(lastHistory.ClosingTimestamp);
            var          lastHisTimeYear  = lastHisTime.Year;
            var          lastHisTimeMonth = lastHisTime.Month;
            List <XData> xDatas           = new List <XData>();
            var          xTime            = new DateTime(lastHisTimeYear, lastHisTimeMonth, 1);
            //Add Months
            for (int i = 0; i < 12; i++)
            {
                var   xt    = xTime.AddMonths(i - 11);
                var   xn    = xt.Month.ToString() + "月份";
                XData xData = new XData(xn, xt);
                xDatas.Add(xData);
            }
            //Add Year,Total
            var yearBeginTime  = new DateTime(lastHisTimeYear, 1, 1);
            var totalBeginTime = ConvertJson.StampToDateTime(account.TraderRegistrationTimestamp);
            var yearXData      = new XData("全年", yearBeginTime);
            var totalXData     = new XData("总计", totalBeginTime);
            xDatas.Add(yearXData);
            xDatas.Add(totalXData);
            //Get MonthBaseData
            List <MonthBaseData> monthBaseData = new List <MonthBaseData>();
            for (int i = 0; i < 14; i++)
            {
                MonthBaseData mdata   = new MonthBaseData();
                var           tempHis = new List <FrxHistory>();
                long          endTimestamp;
                mdata.XData = xDatas[i];
                if (i < 12)
                {
                    endTimestamp = ConvertJson.DateTimeToStamp(mdata.XData.XTime.AddMonths(1));
                }
                else
                {
                    endTimestamp = lastHisTimestamp + 86400000;
                }
                tempHis = histories.Where(x => x.ClosingTimestamp > ConvertJson.DateTimeToStamp(mdata.XData.XTime) && x.ClosingTimestamp < endTimestamp).OrderBy(y => y.ClosingTimestamp).ToList();
                if (tempHis.Count() != 0)
                {
                    var list_bsData = tempHis.GroupBy(g => new
                    {
                        g.SymbolCode
                    }).Select(s => new BuySellData
                    {
                        SymbolCode = s.Key.SymbolCode,
                        Count      = s.Count(),
                        Lots       = s.Sum(a => a.Lot),
                        Pips       = s.Sum(a => a.Pips * a.Lot) / s.Sum(a => a.Lot),
                        Profit     = s.Sum(a => a.NetProfit),
                        BuyCount   = s.Where(a => a.TradeType == TradeType.Buy).Count(),
                        BuyLots    = s.Where(a => a.TradeType == TradeType.Buy).Sum(a => a.Lot),
                        BuyPips    = s.Where(a => a.TradeType == TradeType.Buy).Sum(a => a.Pips * a.Lot) / s.Where(a => a.TradeType == TradeType.Buy).Sum(a => a.Lot),
                        BuyProfit  = s.Where(a => a.TradeType == TradeType.Buy).Sum(a => a.NetProfit),
                        BuyRate    = s.Where(t => t.TradeType == TradeType.Buy).Count() == 0 ? 0
                        : (s.Where(t => t.TradeType == TradeType.Sell).Count() == 0 ? 1
                        : Math.Round(s.Where(t => t.TradeType == TradeType.Buy).Sum(a => a.Lot) / s.Sum(b => b.Lot), 4)),
                        SellCount  = s.Where(a => a.TradeType == TradeType.Sell).Count(),
                        SellLots   = s.Where(a => a.TradeType == TradeType.Sell).Sum(a => a.Lot),
                        SellPips   = s.Where(a => a.TradeType == TradeType.Sell).Sum(a => a.Pips * a.Lot) / s.Where(a => a.TradeType == TradeType.Sell).Sum(a => a.Lot),
                        SellProfit = s.Where(a => a.TradeType == TradeType.Sell).Sum(a => a.NetProfit),
                        SellRate   = s.Where(t => t.TradeType == TradeType.Buy).Count() == 0 ? 1
                        : (s.Where(t => t.TradeType == TradeType.Sell).Count() == 0 ? 0
                        : (1 - Math.Round(s.Where(t => t.TradeType == TradeType.Buy).Sum(a => a.Lot) / s.Sum(b => b.Lot), 4))),
                        WinCount = s.Where(a => a.NetProfit > 0).Count(),
                        WinRate  = s.Where(a => a.NetProfit > 0).Count() == 0 ? 0
                        : (s.Where(a => a.NetProfit <= 0).Count() == 0 ? 1
                        : Math.Round((double)s.Where(a => a.NetProfit > 0).Count() / (double)s.Count(), 4)),
                        LossCount = s.Where(a => a.NetProfit <= 0).Count(),
                        LossRate  = s.Where(a => a.NetProfit > 0).Count() == 0 ? 1
                        : (s.Where(a => a.NetProfit <= 0).Count() == 0 ? 0
                        : (1 - Math.Round((double)s.Where(a => a.NetProfit > 0).Count() / (double)s.Count(), 4))),
                    }).ToList();
                    var initBalance = tempHis.ToList()[0].Balance - tempHis.ToList()[0].NetProfit;
                    var net         = tempHis.Select(x => x.NetProfit).Sum();
                    var gain        = net / initBalance;
                    var swap        = tempHis.Select(x => x.Swap).Sum();
                    var pips        = tempHis.Select(x => x.Pips).Sum();
                    var lots        = tempHis.Select(x => x.Lot).Sum();
                    mdata.BuySellData = list_bsData;
                    mdata.Net         = Math.Round(net, 2);
                    mdata.Gain        = Math.Round(gain, 4);
                    mdata.Swap        = Math.Round(swap, 2);
                    mdata.Pips        = Math.Round(pips, 2);
                    mdata.Lots        = Math.Round(lots, 2);
                    monthBaseData.Add(mdata);
                }
                else
                {
                    mdata.BuySellData = new List <BuySellData>();
                    mdata.Net         = 0;
                    mdata.Gain        = 0;
                    mdata.Swap        = 0;
                    mdata.Pips        = 0;
                    mdata.Lots        = 0;
                    monthBaseData.Add(mdata);
                }
            }
            #endregion
            #region GetAccountInfo
            var deposit  = 0.00;
            var withdraw = 0.00;
            foreach (var c in cashflow)
            {
                if (c.Type == "DEPOSIT")
                {
                    deposit += c.Delta;
                }
                if (c.Type == "WITHDRAW")
                {
                    withdraw += c.Delta;
                }
            }
            var unrnet = 0.00;
            if (positions.Count != 0)
            {
                unrnet = (double)positions.Sum(x => x.Commission * 2 + x.Swap + x.Profit) / 100;
            }
            var  maxbalance       = histories.Select(x => x.Balance).Max();
            long maxtimestamp     = histories.FirstOrDefault(x => x.Balance == maxbalance).ClosingTimestamp;
            var  maxdrawdown      = histories.Select(x => Math.Round((x.Balance - x.Equity) / x.Balance, 4)).Max();
            long maxdrawtimestamp = histories.FirstOrDefault(x => Math.Round((x.Balance - x.Equity) / x.Balance, 4) == maxdrawdown).ClosingTimestamp;
            var  totalswap        = histories.Select(x => x.Swap).Sum();
            var  twr = 1.00;
            foreach (var m in monthBaseData)
            {
                if (m.XData.XName != "全年" && m.XData.XName != "总计")
                {
                    twr = (1 + m.Gain) * twr;
                }
            }
            long lasttradetimestamp;
            if (histories.Count() > 0)
            {
                lasttradetimestamp = lastHisTimestamp;
            }
            else
            {
                lasttradetimestamp = account.TraderRegistrationTimestamp;
            }
            var accountinfo = new AccountInfo
            {
                Gain                  = Math.Round(twr - 1, 4) * 100,
                AbsGain               = Math.Round((account.Balance - deposit + withdraw) / deposit, 4) * 100,
                MaxDraw               = maxdrawdown * 100,
                MaxDrawTimestamp      = maxdrawtimestamp,
                Deposit               = deposit,
                Withdraw              = withdraw,
                Balance               = account.Balance,
                Equity                = account.Balance + (double)unrnet,
                MaxBalance            = maxbalance,
                MaxBalanceTimestamp   = maxtimestamp,
                TotalProfit           = account.Balance - deposit + withdraw,
                TotalSwap             = Math.Round(totalswap, 2),
                LastTradeTimestamp    = lasttradetimestamp,
                RigistrationTimestamp = account.TraderRegistrationTimestamp
            };
            #endregion
            return(Json(new { monthBaseData, accountinfo }));
        }