private static SystemDrawDown ProcessSystemValue(SystemValue currValue, ref SystemValue lastValue, ref SystemDrawDown lastDD)
        {
            SystemDrawDown currDD = UpdateDD(CreateNewDDIfRequired(CloseDDIfRequired(lastDD, currValue), currValue, lastValue), currValue);

            lastValue = currValue;
            if ((currDD == null) || (currDD == lastDD))
            {
                return(null);
            }
            lastDD = currDD;
            return(currDD);
        }
 private static SystemDrawDown UpdateDD(SystemDrawDown currDD, SystemValue currValue)
 {
     if (currDD == null)
     {
         return(null);
     }
     if (currDD.BottomValue.Value > currValue.Value)
     {
         currDD.BottomValue = currValue;
     }
     currDD.LastTS = currValue.TS;
     currDD.Ticks++;
     return(currDD);
 }
        public static List <SystemDrawDown> Calculate(List <SystemValue> equity)
        {
            if (equity.Count <= 1)
            {
                return(new List <SystemDrawDown>());
            }

            SystemValue    lastValue = equity[0];
            SystemDrawDown lastDD    = null;

            return(equity
                   .Skip(1)
                   .Select(currValue => ProcessSystemValue(currValue, ref lastValue, ref lastDD))
                   .Where(o => o != null)
                   .ToList());
        }
 private static SystemDrawDown CreateNewDDIfRequired(SystemDrawDown currDD, SystemValue currValue, SystemValue lastValue) =>
 (currDD == null) && (currValue.Value < lastValue.Value) ? CreateNewDD(lastValue, currValue) : currDD;
 private static SystemDrawDown CloseDDIfRequired(SystemDrawDown currDD, SystemValue currValue) =>
 (currDD?.TopValue.Value < currValue.Value) ? null : currDD;
 private static PointChartData CreateNewDataObject(SystemDrawDown dd) =>
 new SystemDrawDownPointChartData(dd);
 public SystemDrawDownPointChartData(SystemDrawDown dd)
 {
     _x       = 100f * dd.DD();
     _y       = dd.Ticks;
     DDObject = dd;
 }
Пример #8
0
 public static float DD(this SystemDrawDown dd) =>
 (dd.TopValue.Value - dd.BottomValue.Value) / Math.Abs(dd.TopValue.Value);