private static bool IsTransformationValid(PeriodOption inputPeriod, PeriodOption outputPeriod) { var inputInstance = inputPeriod.CreateInstance(); var outputInstance = outputPeriod.CreateInstance(); if (inputInstance is IIntradayPeriod input) { return(!(outputInstance is IIntradayPeriod output) || (input.NumberOfSecond < output.NumberOfSecond)); } var input2 = inputInstance as IInterdayPeriod; if (outputInstance is IIntradayPeriod output2) { return(false); } var output3 = outputInstance as IInterdayPeriod; if (input2.OrderOfTransformation >= output3.OrderOfTransformation) { return(false); } return(true); }
public static Equity Transform(this Equity sourceEquity, PeriodOption targetPeriod) { if (sourceEquity.Period == targetPeriod) { return(sourceEquity); } if (!IsTransformationValid(sourceEquity.Period, targetPeriod)) { throw new InvalidTransformationException(sourceEquity.Period, targetPeriod); } var candles = new List <Candle>(); var periodInstance = targetPeriod.CreateInstance(); DateTime startTime = sourceEquity.First().DateTime; while (startTime <= sourceEquity.Last().DateTime) { var nextStartTime = periodInstance.NextTimestamp(startTime); if (periodInstance.IsTimestamp(startTime)) { var candle = ComputeCandle(sourceEquity, startTime, nextStartTime); if (candle != null) { candles.Add(candle); } } startTime = nextStartTime; } return(new Equity(sourceEquity.Name, candles, targetPeriod)); }