public static DateTime GetOpenTime(this Bars bars, double barIndex, Symbol symbol) { var currentIndex = bars.Count - 1; var timeDiff = bars.GetTimeDiff(); var indexDiff = barIndex - currentIndex; var result = indexDiff <= 0 ? bars.OpenTimes[(int)barIndex] : bars.OpenTimes[currentIndex]; if (indexDiff > 0) { var isDiffLessThanDay = timeDiff < TimeSpan.FromDays(1); for (var i = 1; i <= indexDiff; i++) { result = result.Add(timeDiff); if (isDiffLessThanDay) { while (!symbol.IsInTradingTime(result)) { result = result.Add(timeDiff); } } } } return(result); }
/// <summary> /// Returns a bar open time by giving its index, it supports both past and future bars but the future bars provided /// open time is an approximation based on previous bars time differences not exact open time /// </summary> /// <param name="bars">The market series</param> /// <param name="barIndex">The bar index</param> /// <returns>DateTime</returns> public static DateTime GetOpenTime(this Bars bars, double barIndex) { var currentIndex = bars.GetIndex(); TimeSpan timeDiff = bars.GetTimeDiff(); var indexDiff = barIndex - currentIndex; var indexDiffAbs = Math.Abs(indexDiff); var result = indexDiff <= 0 ? bars.OpenTimes[(int)barIndex] : bars.OpenTimes[currentIndex]; if (indexDiff > 0) { for (var i = 1; i <= indexDiffAbs; i++) { do { result = result.Add(timeDiff); }while (result.DayOfWeek == DayOfWeek.Saturday || result.DayOfWeek == DayOfWeek.Sunday); } } var barIndexFraction = barIndex % 1; var barIndexFractionInMinutes = timeDiff.TotalMinutes * barIndexFraction; result = result.AddMinutes(barIndexFractionInMinutes); return(result); }
public static double GetBarIndex(this Bars bars, DateTime time, Symbol symbol) { if (time <= bars.OpenTimes.LastValue) { return(bars.OpenTimes.GetIndexByTime(time)); } var timeDiff = bars.GetTimeDiff(); var timeDiffWithLastTime = (time - bars.OpenTimes.LastValue); if (bars.TimeFrame < TimeFrame.Daily) { var outsideTradingTime = symbol.GetOutsideTradingTimeAmount(bars.OpenTimes.LastValue, time, timeDiff); timeDiffWithLastTime = timeDiffWithLastTime.Add(-outsideTradingTime); } var futureIndex = (bars.Count - 1) + timeDiffWithLastTime.TotalHours / timeDiff.TotalHours; return(futureIndex); }