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; }
public static float DD(this SystemDrawDown dd) => (dd.TopValue.Value - dd.BottomValue.Value) / Math.Abs(dd.TopValue.Value);