Пример #1
0
        public Setup Statistics(bool opt, decimal share)
        {
            if (trades.Count == 0)
            {
                return(null);
            }

            var groupTrades = trades.GroupBy(t => t.ExitTime.Value.Date).ToDictionary(x => x.Key, y => y.ToList());
            var countr      = groupTrades.ToDictionary(x => x.Key, y => y.Value.Count);
            var cumsum      = new Dictionary <DateTime, decimal>();

            if (trade == null)
            {
                trade = trades.LastOrDefault();
            }

            if (trade.AssetClass != "BMF.FUT")
            {
                trades.ForEach(t =>
                {
                    t.GetNetResult(t.ExitValue);
                    t.Cost     += t.BkrFixComm / countr[t.ExitTime.Value.Date];
                    t.NetResult = t.NetResult * share - 100 * t.BkrFixComm / t.EntryValue / t.Qnty / countr[t.ExitTime.Value.Date];
                });
            }
            else
            {
                trades.ForEach(t =>
                {
                    t.GetNetResult(t.ExitValue);
                    t.NetResult = t.Capital * t.Result * t.Unit - t.Cost;
                });
            }

            trades[0].CumResult = trades[0].NetResult;
            for (var i = 1; i < trades.Count; i++)
            {
                trades[i].CumResult = trades[i - 1].CumResult + trades[i].NetResult;
            }

            var dailyr = trades.GroupBy(t => t.ExitTime.Value.Date).ToDictionary(x => x.Key, y => y.Sum(z => z.NetResult.Value));

            #region Calculate DrawnDown
            var max  = 0.0m;
            var mdd  = 0.0m;
            var esum = 0.0m;

            foreach (var pair in dailyr)
            {
                esum += pair.Value;
                max   = Math.Max(max, esum);
                mdd   = Math.Max(mdd, (max - esum));
                cumsum.Add(pair.Key, esum);
            }
            #endregion

            var months = (decimal)(trades.Last().ExitTime.Value - trades.First().EntryTime).TotalDays / 30.4368499m;

            this.action               = 0;
            this.setup.MaxDrawndown   = mdd;
            this.setup.TotalNetProfit = esum;
            this.setup.DailyNetProfit = esum / months;
            this.setup.TradesCount    = trades.Count();
            this.setup.TotalCosts     = trades.Sum(t => t.Cost) / months;
            this.setup.SharpeRatio    = GetSharpeRation(dailyr.Values);
            this.setup.SharpeRatio    = this.setup.SharpeRatio * GetRSquared(cumsum);
            this.setup.PositiveTrades = 100 * trades.Count(t => t.NetResult > 0) / trades.Count;
            this.setup.Description    =
                trades.First().EntryTime.ToShortDateString() + " " +
                trades.Last().ExitTime.Value.ToShortDateString() + "\t";

            var nonnulltrades = trades.FindAll(t => t.NetResult.HasValue);
            this.setup.WinLossRatio = this.setup.PositiveTrades == 0 || this.setup.PositiveTrades == 100 ? 0 : -
                                      nonnulltrades.Where(t => t.NetResult.Value > 0).Average(t => t.NetResult.Value) /
                                      nonnulltrades.Where(t => t.NetResult.Value < 0).Average(t => t.NetResult.Value);

            var resultsDic = new Dictionary <string, string>();

            var firstofthismonth = trade.ExitTime.Value.AddDays(1 - trade.ExitTime.Value.Day);
            var lastofthismonth  = firstofthismonth.AddMonths(1).AddDays(-1);
            resultsDic.Add("Mês", Return(firstofthismonth, lastofthismonth));

            var firstofthisyear = new DateTime(trade.ExitTime.Value.Year, 1, 1);
            resultsDic.Add("Ano", Return(firstofthisyear, lastofthismonth));

            var startlast06months = trade.ExitTime.Value.AddMonths(-6);
            resultsDic.Add("6 meses", Return(startlast06months, lastofthismonth));

            var startlast12months = trade.ExitTime.Value.AddMonths(-12);
            resultsDic.Add("12 meses", Return(startlast12months, lastofthismonth));

            var startlast24months = trade.ExitTime.Value.AddMonths(-24);
            resultsDic.Add("24 meses", Return(startlast24months, lastofthismonth));

            for (var i = 1; i <= 12; i++)
            {
                resultsDic.Add(firstofthismonth.AddMonths(-i).ToString(@"MMM/yy"),
                               Return(firstofthismonth.AddMonths(-i), lastofthismonth.AddMonths(-i)));
            }

            this.setup.Description += string.Join(";", resultsDic.Keys) + "\r\n;" + string.Join(";", resultsDic.Values);

            if (opt)
            {
                if (esum > mdd)
                {
                    OnStatusChanged(setup.ToString());
                }

                var _file = String.Format(DataDir.Replace(@"\Data\", @"\Backtest\") + "{0:ID_000}_{1:yyMMddHHmm}.csv", setup.SetupId, DateTime.Now);
                if (File.Exists(_file))
                {
                    File.Delete(_file);
                }

                File.AppendAllText(_file, this.setup.ToString() + "\r\n", System.Text.Encoding.UTF8);
                foreach (var pair in countr)
                {
                    File.AppendAllText(_file, "\r\n" +
                                       pair.Key.ToShortDateString() + ";" + pair.Value + ";" + dailyr[pair.Key] + ";" + cumsum[pair.Key]);
                }

                _file = _file.Replace(".csv", "_trades.csv");
                if (File.Exists(_file))
                {
                    File.Delete(_file);
                }
                for (var i = 0; i < trades.Count; i++)
                {
                    File.AppendAllText(_file, trades[i].ToString() + "\r\n");
                }
            }

            this.trades.RemoveAll(t => t.EntryTime.Date != trade.EntryTime.Date);

            return(this.setup);
        }