//+------------------------------------------------------------------+ //| BarSeries.mqh | //| | //| KnitPkg for MetaTrader | //| | //| MIT License | //| Copyright (c) 2025 Douglas Rechia | //| | //| Typed series implementations for individual bar components. | //| Each class wraps a specific OHLCV field via the ITimeSeries | //| interface. | //| | //+------------------------------------------------------------------+ #include "Bar.mqh" //+------------------------------------------------------------------+ //| BaseBarTimeSeries — generic template base for bar series //+------------------------------------------------------------------+ template class BaseBarTimeSeries : public ITimeSeries { protected: IBar* m_bar; public: BaseBarTimeSeries(IBar *bar) { m_bar = bar; } virtual T ValueAtShift(int shift = 0) = 0; int Size() { return m_bar.Size(); } }; //+------------------------------------------------------------------+ //| BarTimeSeries — datetime series accessor //+------------------------------------------------------------------+ class BarTimeSeries : public BaseBarTimeSeries { public: BarTimeSeries(IBar *bar) : BaseBarTimeSeries(bar) {} virtual datetime ValueAtShift(int shift = 0) { return m_bar.Time(shift); }; }; //+------------------------------------------------------------------+ //| BarOpenTimeSeries — open price series accessor //+------------------------------------------------------------------+ class BarOpenTimeSeries : public BaseBarTimeSeries { public: BarOpenTimeSeries(IBar *bar) : BaseBarTimeSeries(bar) {} virtual double ValueAtShift(int shift = 0) { return m_bar.Open(shift); }; }; //+------------------------------------------------------------------+ //| BarHighTimeSeries — high price series accessor //+------------------------------------------------------------------+ class BarHighTimeSeries : public BaseBarTimeSeries { public: BarHighTimeSeries(IBar *bar) : BaseBarTimeSeries(bar) {} virtual double ValueAtShift(int shift = 0) { return m_bar.High(shift); }; }; //+------------------------------------------------------------------+ //| BarLowTimeSeries — low price series accessor //+------------------------------------------------------------------+ class BarLowTimeSeries : public BaseBarTimeSeries { public: BarLowTimeSeries(IBar *bar) : BaseBarTimeSeries(bar) {} virtual double ValueAtShift(int shift = 0) { return m_bar.Low(shift); }; }; //+------------------------------------------------------------------+ //| BarCloseTimeSeries — close price series accessor //+------------------------------------------------------------------+ class BarCloseTimeSeries : public BaseBarTimeSeries { public: BarCloseTimeSeries(IBar *bar) : BaseBarTimeSeries(bar) {} virtual double ValueAtShift(int shift = 0) { return m_bar.Close(shift); }; }; //+------------------------------------------------------------------+ //| BarVolumeTimeSeries — real volume series accessor //+------------------------------------------------------------------+ class BarVolumeTimeSeries : public BaseBarTimeSeries { public: BarVolumeTimeSeries(IBar *bar) : BaseBarTimeSeries(bar) {} virtual long ValueAtShift(int shift = 0) { return m_bar.Volume(shift); }; }; //+------------------------------------------------------------------+ //| BarTickVolumeTimeSeries — tick volume series accessor //+------------------------------------------------------------------+ class BarTickVolumeTimeSeries : public BaseBarTimeSeries { public: BarTickVolumeTimeSeries(IBar *bar) : BaseBarTimeSeries(bar) {} virtual long ValueAtShift(int shift = 0) { return m_bar.TickVolume(shift); }; }; //+------------------------------------------------------------------+