public void Calculate(int barIndex) { DateTime barOpenTime = _marketSeries.OpenTime[barIndex].Add(-_gmtOffset); if (_lastBar == null || barOpenTime >= _nextBarTime) { _barStartIndex = barIndex; _barEndIndex = barIndex + 1; _barStartTime = _marketSeries.OpenTime[_barStartIndex]; _barEndTime = _marketSeries.OpenTime[_barStartIndex].Add(_marketSeriesTimeFrameSpan); _lastBar = new OhlcBar { Open = _marketSeries.Open[barIndex], Index = Index + 1, Time = _marketSeries.OpenTime[barIndex].Add(-_gmtOffset) }; _nextBarTime = _lastBar.Time.Add(_timeFrameSpan); } else { _barEndIndex = barIndex + 1; _barEndTime = _marketSeries.OpenTime[barIndex].Add(_marketSeriesTimeFrameSpan); } _lastBar.High = _marketSeries.High.Maximum(_barStartIndex, barIndex); _lastBar.Low = _marketSeries.Low.Minimum(_barStartIndex, barIndex); _lastBar.Close = _marketSeries.Close[barIndex]; Insert(_lastBar); }
public void OnTick() { var price = _symbol.Bid; if (price == _previousBidPrice) { return; } _previousBidPrice = price; if (double.IsNaN(Open.LastValue)) { Insert(0, price, price, price, price, 0, Algo.Server.TimeInUtc); } var range = Math.Abs(this.GetBarRange(Index, true)); if (range >= _size && (Index == 0 || this.GetBarType(Index) == this.GetBarType(Index - 1)) || range >= _size * 2) { var bar = new OhlcBar { Index = Index + 1, Open = Close[Index], High = Close[Index], Low = Close[Index], Close = Close[Index], Volume = 0, Time = Algo.Server.TimeInUtc }; Insert(bar); OnBar?.Invoke(this, bar, this.GetBar(Index - 1)); } Insert(Index, TickVolume.LastValue + 1, SeriesType.TickVolume); Insert(Index, price, SeriesType.Close); if (price > High[Index]) { Insert(Index, price, SeriesType.High); } if (price < Low[Index]) { Insert(Index, price, SeriesType.Low); } }
public void Insert(OhlcBar bar) { Insert(bar.Index, bar.Open, bar.High, bar.Low, bar.Close, bar.Volume, bar.Time); }