private void OnNewData(object sender, ElapsedEventArgs elapsedEventArgs) { if (XVisibleRange != null) { lock (elapsedEventArgs) { if (_index >= _data.Length) { _timerNewDataUpdate.Stop(); } var newTick = _data[_index]; var date = _dataSeries0.XValues[_dataSeries0.Count - 1].AddMinutes(30); var volume = _random.Next(100); var bidOrAsk = _random.Next(2) == 0 ? BidOrAsk.Bid : BidOrAsk.Ask; if (_index % _ticksPerCandle == 0) { _filterDataSeries.Append(date, _movingAverage.Push(_cumulativeVolume).Current); _cumulativeVolume = default(double); var metaNew = new CandlestickMetaData(); metaNew.AddTick(new CandleTick { BidOrAsk = bidOrAsk, Price = newTick, Volume = volume, TimeStamp = date }); _cumulativeVolume += bidOrAsk.Equals(BidOrAsk.Ask) ? volume : -volume; var high = _cumulativeVolume > 0 ? _cumulativeVolume : 0; var low = _cumulativeVolume < 0 ? _cumulativeVolume : 0; _dataSeries1.Append(date, _cumulativeVolume, high, low, _cumulativeVolume); _dataSeries0.Append(date, newTick, newTick, newTick, newTick, metaNew); _candleCount = _dataSeries0.Count; var visibleRange = (IndexRange)XVisibleRange; if (visibleRange.Max + 2 >= _dataSeries0.Count) { var newRange = new IndexRange(visibleRange.Min + 1, visibleRange.Max + 1); XVisibleRange = newRange; } } else { var open = _dataSeries0.OpenValues[_candleCount - 1]; var high = _dataSeries0.HighValues[_candleCount - 1]; high = high > newTick ? high : newTick; var low = _dataSeries0.LowValues[_candleCount - 1]; low = low < newTick ? low : newTick; var metaData = (CandlestickMetaData)_dataSeries0.Metadata[_candleCount - 1]; metaData.AddTick(new CandleTick { BidOrAsk = bidOrAsk, Price = newTick, Volume = volume, TimeStamp = date }); _dataSeries0.Update(_candleCount - 1, open, high, low, newTick); _cumulativeVolume += bidOrAsk.Equals(BidOrAsk.Ask) ? volume : -volume; open = _dataSeries1.OpenValues[_candleCount - 1]; high = _dataSeries1.HighValues[_candleCount - 1]; high = high > _cumulativeVolume ? high : _cumulativeVolume; low = _dataSeries1.LowValues[_candleCount - 1]; low = low < _cumulativeVolume ? low : _cumulativeVolume; _dataSeries1.Update(_candleCount - 1, open, high, low, _cumulativeVolume); } ++_index; } } }
public void LoadRandomData(int candlesCount, int ticksPerCandle) { _ticksPerCandle = ticksPerCandle; _data = null; var dataSource = new RandomWalkGenerator(); var ticksCount = (candlesCount + 1) * ticksPerCandle; _data = dataSource.GetRandomWalkSeries(ticksCount).YData.ToArray(); _index = 0; //var baseDate = DateTime.Now; for (int j = 0; j < candlesCount; j++) { var date = _baseTime.AddMinutes(j * 30); var volume = _random.Next(100); var bidOrAsk = _random.Next(2) == 0 ? BidOrAsk.Bid : BidOrAsk.Ask; var cumulativeVolume = default(double); var metaData = new CandlestickMetaData(); metaData.AddTick(new CandleTick { BidOrAsk = bidOrAsk, Price = _data[_index], Volume = volume, TimeStamp = date }); cumulativeVolume += bidOrAsk.Equals(BidOrAsk.Ask) ? volume : -volume; var high = cumulativeVolume > 0 ? cumulativeVolume : 0; var low = cumulativeVolume < 0 ? cumulativeVolume : 0; _dataSeries1.Append(date, cumulativeVolume, high, low, cumulativeVolume); _dataSeries0.Append(date, _data[_index], _data[_index], _data[_index], _data[_index], metaData); _candleCount = _dataSeries0.Count; for (int i = 0; i < ticksPerCandle; i++) { _index++; volume = _random.Next(100); bidOrAsk = _random.Next(2) == 0 ? BidOrAsk.Bid : BidOrAsk.Ask; //date = date; var newTick = _data[_index]; var open = _dataSeries0.OpenValues[_candleCount - 1]; high = _dataSeries0.HighValues[_candleCount - 1]; high = high > newTick ? high : newTick; low = _dataSeries0.LowValues[_candleCount - 1]; low = low < newTick ? low : newTick; var meta = (CandlestickMetaData)_dataSeries0.Metadata[_candleCount - 1]; meta.AddTick(new CandleTick { BidOrAsk = bidOrAsk, Price = newTick, Volume = volume, TimeStamp = date }); _dataSeries0.Update(_candleCount - 1, open, high, low, newTick); cumulativeVolume += bidOrAsk.Equals(BidOrAsk.Ask) ? volume : -volume; open = _dataSeries1.OpenValues[_candleCount - 1]; high = _dataSeries1.HighValues[_candleCount - 1]; high = high > cumulativeVolume ? high : cumulativeVolume; low = _dataSeries1.LowValues[_candleCount - 1]; low = low < cumulativeVolume ? low : cumulativeVolume; _dataSeries1.Update(_candleCount - 1, open, high, low, cumulativeVolume); } _filterDataSeries.Append(date, _movingAverage.Push(cumulativeVolume).Current); } }