private Candle CreateFilledCandle(Candle candle) { if (candle == null) { throw new ArgumentNullException(nameof(candle)); } var filledCandle = candle.GetType().CreateInstance <Candle>(); //filledCandle.Series = candle.Series; filledCandle.Security = candle.Security; filledCandle.Arg = CloneArg(candle.Arg, candle.Security); filledCandle.OpenTime = candle.OpenTime; filledCandle.CloseTime = candle.CloseTime; //filledCandle.TotalVolume = candle.TotalVolume; //filledCandle.TotalPrice = candle.TotalPrice; filledCandle.OpenPrice = candle.ClosePrice; //filledCandle.OpenVolume = candle.CloseVolume; filledCandle.ClosePrice = candle.ClosePrice; //filledCandle.CloseVolume = candle.CloseVolume; filledCandle.HighPrice = candle.ClosePrice; //filledCandle.HighVolume = candle.CloseVolume; filledCandle.LowPrice = candle.ClosePrice; //filledCandle.LowVolume = candle.CloseVolume; filledCandle.State = CandleStates.Finished; return(filledCandle); }
public IEnumerable <Candle> ProcessCandle(Candle candle) { return(GetFormedBuffers(candle) .Select(buffer => { var openPrice = TryCalculate(buffer, c => c.OpenPrice); if (openPrice == null) { return null; } var indexCandle = candle.GetType().CreateInstance <Candle>(); indexCandle.Security = _security; indexCandle.Arg = CloneArg(candle.Arg, _security); indexCandle.OpenTime = buffer.OpenTime; indexCandle.CloseTime = buffer.CloseTime; indexCandle.TotalVolume = Calculate(buffer, c => c.TotalVolume); indexCandle.TotalPrice = Calculate(buffer, c => c.TotalPrice); indexCandle.OpenPrice = (decimal)openPrice; indexCandle.OpenVolume = Calculate(buffer, c => c.OpenVolume ?? 0); indexCandle.ClosePrice = Calculate(buffer, c => c.ClosePrice); indexCandle.CloseVolume = Calculate(buffer, c => c.CloseVolume ?? 0); indexCandle.HighPrice = Calculate(buffer, c => c.HighPrice); indexCandle.HighVolume = Calculate(buffer, c => c.HighVolume ?? 0); indexCandle.LowPrice = Calculate(buffer, c => c.LowPrice); indexCandle.LowVolume = Calculate(buffer, c => c.LowVolume ?? 0); // если некоторые свечи имеют неполные данные, то и индекс будет таким же неполным if (indexCandle.OpenPrice == 0 || indexCandle.HighPrice == 0 || indexCandle.LowPrice == 0 || indexCandle.ClosePrice == 0) { var nonZeroPrice = indexCandle.OpenPrice; if (nonZeroPrice == 0) { nonZeroPrice = indexCandle.HighPrice; } if (nonZeroPrice == 0) { nonZeroPrice = indexCandle.LowPrice; } if (nonZeroPrice == 0) { nonZeroPrice = indexCandle.LowPrice; } if (nonZeroPrice != 0) { if (indexCandle.OpenPrice == 0) { indexCandle.OpenPrice = nonZeroPrice; } if (indexCandle.HighPrice == 0) { indexCandle.HighPrice = nonZeroPrice; } if (indexCandle.LowPrice == 0) { indexCandle.LowPrice = nonZeroPrice; } if (indexCandle.ClosePrice == 0) { indexCandle.ClosePrice = nonZeroPrice; } } } if (indexCandle.HighPrice < indexCandle.LowPrice) { var high = indexCandle.HighPrice; indexCandle.HighPrice = indexCandle.LowPrice; indexCandle.LowPrice = high; } if (indexCandle.OpenPrice > indexCandle.HighPrice) { indexCandle.HighPrice = indexCandle.OpenPrice; } else if (indexCandle.OpenPrice < indexCandle.LowPrice) { indexCandle.LowPrice = indexCandle.OpenPrice; } if (indexCandle.ClosePrice > indexCandle.HighPrice) { indexCandle.HighPrice = indexCandle.ClosePrice; } else if (indexCandle.ClosePrice < indexCandle.LowPrice) { indexCandle.LowPrice = indexCandle.ClosePrice; } indexCandle.State = CandleStates.Finished; return indexCandle; }) .Where(c => c != null)); }
private Candle CreateFilledCandle(Candle candle) { if (candle == null) throw new ArgumentNullException(nameof(candle)); var filledCandle = candle.GetType().CreateInstance<Candle>(); //filledCandle.Series = candle.Series; filledCandle.Security = candle.Security; filledCandle.Arg = CloneArg(candle.Arg, candle.Security); filledCandle.OpenTime = candle.OpenTime; filledCandle.CloseTime = candle.CloseTime; //filledCandle.TotalVolume = candle.TotalVolume; //filledCandle.TotalPrice = candle.TotalPrice; filledCandle.OpenPrice = candle.ClosePrice; //filledCandle.OpenVolume = candle.CloseVolume; filledCandle.ClosePrice = candle.ClosePrice; //filledCandle.CloseVolume = candle.CloseVolume; filledCandle.HighPrice = candle.ClosePrice; //filledCandle.HighVolume = candle.CloseVolume; filledCandle.LowPrice = candle.ClosePrice; //filledCandle.LowVolume = candle.CloseVolume; filledCandle.State = CandleStates.Finished; return filledCandle; }
public IEnumerable <Candle> ProcessCandle(Candle candle) { return(GetFormedBuffers(candle) .Select(buffer => { var indexCandle = candle.GetType().CreateInstance <Candle>(); indexCandle.Security = _security; indexCandle.Arg = CloneArg(candle.Arg, _security); indexCandle.OpenTime = buffer.OpenTime; indexCandle.CloseTime = buffer.CloseTime; try { indexCandle.OpenPrice = Calculate(buffer, true, c => c.OpenPrice); indexCandle.ClosePrice = Calculate(buffer, true, c => c.ClosePrice); indexCandle.HighPrice = Calculate(buffer, true, c => c.HighPrice); indexCandle.LowPrice = Calculate(buffer, true, c => c.LowPrice); if (_security.CalculateExtended) { indexCandle.TotalVolume = Calculate(buffer, false, c => c.TotalVolume); indexCandle.TotalPrice = Calculate(buffer, true, c => c.TotalPrice); indexCandle.OpenVolume = Calculate(buffer, false, c => c.OpenVolume ?? 0); indexCandle.CloseVolume = Calculate(buffer, false, c => c.CloseVolume ?? 0); indexCandle.HighVolume = Calculate(buffer, false, c => c.HighVolume ?? 0); indexCandle.LowVolume = Calculate(buffer, false, c => c.LowVolume ?? 0); } } catch (ArithmeticException ex) { if (!_ignoreErrors) { throw; } ex.LogError(); return null; } // если некоторые свечи имеют неполные данные, то и индекс будет таким же неполным if (indexCandle.OpenPrice == 0 || indexCandle.HighPrice == 0 || indexCandle.LowPrice == 0 || indexCandle.ClosePrice == 0) { var nonZeroPrice = indexCandle.OpenPrice; if (nonZeroPrice == 0) { nonZeroPrice = indexCandle.HighPrice; } if (nonZeroPrice == 0) { nonZeroPrice = indexCandle.LowPrice; } if (nonZeroPrice == 0) { nonZeroPrice = indexCandle.LowPrice; } if (nonZeroPrice != 0) { if (indexCandle.OpenPrice == 0) { indexCandle.OpenPrice = nonZeroPrice; } if (indexCandle.HighPrice == 0) { indexCandle.HighPrice = nonZeroPrice; } if (indexCandle.LowPrice == 0) { indexCandle.LowPrice = nonZeroPrice; } if (indexCandle.ClosePrice == 0) { indexCandle.ClosePrice = nonZeroPrice; } } } if (indexCandle.HighPrice < indexCandle.LowPrice) { var high = indexCandle.HighPrice; indexCandle.HighPrice = indexCandle.LowPrice; indexCandle.LowPrice = high; } if (indexCandle.OpenPrice > indexCandle.HighPrice) { indexCandle.HighPrice = indexCandle.OpenPrice; } else if (indexCandle.OpenPrice < indexCandle.LowPrice) { indexCandle.LowPrice = indexCandle.OpenPrice; } if (indexCandle.ClosePrice > indexCandle.HighPrice) { indexCandle.HighPrice = indexCandle.ClosePrice; } else if (indexCandle.ClosePrice < indexCandle.LowPrice) { indexCandle.LowPrice = indexCandle.ClosePrice; } indexCandle.State = CandleStates.Finished; return indexCandle; }) .Where(c => c != null)); }
public IEnumerable<Candle> ProcessCandle(Candle candle) { return GetFormedBuffers(candle) .Select(buffer => { var openPrice = TryCalculate(buffer, c => c.OpenPrice); if (openPrice == null) return null; var indexCandle = candle.GetType().CreateInstance<Candle>(); indexCandle.Security = _security; indexCandle.Arg = CloneArg(candle.Arg, _security); indexCandle.OpenTime = buffer.OpenTime; indexCandle.CloseTime = buffer.CloseTime; indexCandle.TotalVolume = Calculate(buffer, c => c.TotalVolume); indexCandle.TotalPrice = Calculate(buffer, c => c.TotalPrice); indexCandle.OpenPrice = (decimal)openPrice; indexCandle.OpenVolume = Calculate(buffer, c => c.OpenVolume ?? 0); indexCandle.ClosePrice = Calculate(buffer, c => c.ClosePrice); indexCandle.CloseVolume = Calculate(buffer, c => c.CloseVolume ?? 0); indexCandle.HighPrice = Calculate(buffer, c => c.HighPrice); indexCandle.HighVolume = Calculate(buffer, c => c.HighVolume ?? 0); indexCandle.LowPrice = Calculate(buffer, c => c.LowPrice); indexCandle.LowVolume = Calculate(buffer, c => c.LowVolume ?? 0); // если некоторые свечи имеют неполные данные, то и индекс будет таким же неполным if (indexCandle.OpenPrice == 0 || indexCandle.HighPrice == 0 || indexCandle.LowPrice == 0 || indexCandle.ClosePrice == 0) { var nonZeroPrice = indexCandle.OpenPrice; if (nonZeroPrice == 0) nonZeroPrice = indexCandle.HighPrice; if (nonZeroPrice == 0) nonZeroPrice = indexCandle.LowPrice; if (nonZeroPrice == 0) nonZeroPrice = indexCandle.LowPrice; if (nonZeroPrice != 0) { if (indexCandle.OpenPrice == 0) indexCandle.OpenPrice = nonZeroPrice; if (indexCandle.HighPrice == 0) indexCandle.HighPrice = nonZeroPrice; if (indexCandle.LowPrice == 0) indexCandle.LowPrice = nonZeroPrice; if (indexCandle.ClosePrice == 0) indexCandle.ClosePrice = nonZeroPrice; } } if (indexCandle.HighPrice < indexCandle.LowPrice) { var high = indexCandle.HighPrice; indexCandle.HighPrice = indexCandle.LowPrice; indexCandle.LowPrice = high; } if (indexCandle.OpenPrice > indexCandle.HighPrice) indexCandle.HighPrice = indexCandle.OpenPrice; else if (indexCandle.OpenPrice < indexCandle.LowPrice) indexCandle.LowPrice = indexCandle.OpenPrice; if (indexCandle.ClosePrice > indexCandle.HighPrice) indexCandle.HighPrice = indexCandle.ClosePrice; else if (indexCandle.ClosePrice < indexCandle.LowPrice) indexCandle.LowPrice = indexCandle.ClosePrice; indexCandle.State = CandleStates.Finished; return indexCandle; }) .Where(c => c != null); }