示例#1
0
            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);
            }
示例#2
0
        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);
		}