public virtual BarSeries Compress(long newBarSize, TimeSpan sessionStart, TimeSpan sessionEnd, BarSlycing mode, bool weeklySlicingEnabled, bool clubWithPrevBar) { BarSeries barSeries = this.GetType().GetConstructor(new Type[0]).Invoke(new object[0]) as BarSeries; if (this.Count <= 0) return barSeries; long size = this[0].Size; if (newBarSize < size) throw new ArgumentException("newBarSize < size"); if (sessionStart >= sessionEnd) throw new ArgumentException("sessionStart >= sessionEnd"); long result; Math.DivRem(newBarSize, size, out result); // if (result != 0L) // throw new ArgumentException(oK6F3TB73XXXGhdieP.wF6SgrNUO(12074)); if (newBarSize == size) return this; double num1 = 0.0; double num2 = 0.0; double open = 0.0; double close = 0.0; long volume = 0L; long num3 = 0L; bool flag1 = true; DateTime datetime = this[0].DateTime.Date.Add(sessionStart); DateTime index1 = DateTime.MaxValue; long ticks1 = (sessionEnd - sessionStart).Ticks; int num4 = 0; bool flag2 = false; while (flag1) { if (flag2) { datetime = index1.AddDays(2.0).Date.Add(sessionStart); flag2 = false; } index1 = datetime.AddSeconds((double)newBarSize); DateTime dateTime = datetime.Date.Add(sessionEnd); if (index1 > dateTime) { long ticks2 = (index1 - dateTime).Ticks; index1 = datetime.Date.AddDays(1.0).Add(sessionStart); if (mode == BarSlycing.Equally) { index1 = index1.AddDays((double)(ticks2 / ticks1)); index1 = index1.AddTicks(ticks2 % ticks1); } if (this.LastDateTime > index1) { DateTime date = this[index1, EIndexOption.Next].DateTime.Date; while (index1 < date && (index1.DayOfWeek != DayOfWeek.Saturday || !weeklySlicingEnabled)) index1 = index1.AddDays(1.0); if (index1.DayOfWeek == DayOfWeek.Saturday && weeklySlicingEnabled) flag2 = true; } } int index2 = this.GetIndex(index1.AddTicks(-1L), EIndexOption.Prev); Bar bar1 = (Bar)null; for (int index3 = num4; index3 <= index2; ++index3) { bar1 = this[index3]; if (index3 == num4) { num1 = bar1.High; num2 = bar1.Low; open = bar1.Open; close = bar1.Close; volume = bar1.Volume; num3 = bar1.OpenInt; } else { num1 = Math.Max(num1, bar1.High); num2 = Math.Min(num2, bar1.Low); close = bar1.Close; volume += bar1.Volume; num3 += bar1.OpenInt; } } if (bar1 != null) { Bar bar2 = new Bar(datetime, open, num1, num2, close, volume, newBarSize); bar2.EndTime = !flag2 ? index1 : index1.Date.AddDays(-1.0).Add(sessionEnd); if (mode == BarSlycing.Normal && index1 > dateTime) bar2.EndTime = dateTime; bar2.OpenInt = num3; if (flag2 && clubWithPrevBar && (bar2.Duration.TotalSeconds * 2.0 < (double)newBarSize && barSeries.Count > 0)) { Bar last = barSeries.Last; bar2.Open = last.Open; bar2.High = Math.Max(bar2.High, last.High); bar2.Low = Math.Min(bar2.Low, last.Low); bar2.Volume += last.Volume; bar2.OpenInt += last.OpenInt; bar2.DateTime = last.BeginTime; } barSeries.Add(bar2); } num4 = index2 + 1; if (num4 > this.Count - 1) flag1 = false; datetime = index1; } return barSeries; }
public virtual BarSeries Compress(long newBarSize, TimeSpan sessionStart, TimeSpan sessionEnd, BarSlycing mode) { return this.Compress(newBarSize, sessionStart, sessionEnd, mode, true, true); }