public static DataSeries <Value> Trim(this DataSeries <Value> values, double value) { var first = values.First(x => x.Val != value).Timestamp; var last = values.Reverse().First(x => x.Val != value).Timestamp; return(values.From(first).To(last)); }
public static double CalcMaxDrawdownPercent(DataSeries <Value> accountValue) { bool inDrawdown = false; var last = (double)accountValue.First(); var lastHigh = last; double worstInDrawdown = double.PositiveInfinity; double maxDrawdownPercent = 0; foreach (var v in accountValue.Skip(1)) { inDrawdown = inDrawdown || v < last; if (!inDrawdown) { lastHigh = Math.Max(lastHigh, v); } else { worstInDrawdown = Math.Min(worstInDrawdown, v); if (v >= lastHigh) { inDrawdown = false; maxDrawdownPercent = Math.Max(maxDrawdownPercent, (lastHigh - worstInDrawdown) / lastHigh); lastHigh = v; worstInDrawdown = double.PositiveInfinity; } } last = v; } return(maxDrawdownPercent); }
public static DataSeries <Value> SignalAccuracy(this DataSeries <Bar> bars, DataSeries <Value> signal) { var bs = bars.From(signal.First().Timestamp); return(bs.ZipElements <Value, Value>(signal, (b, s, v) => s[0] == 0 ? 0 : b[0].IsGreen == (s[0] > 0) ? 1 : -1)); }