Multi Time Frame Indicator and HLOC price
Multi Time Frame Indicator and HLOC price
11 Mar 2021, 15:33
I'm working to make multi time frame bollingerband indicator, and I want user to choose which price they use to calculate, like open, close, high, low, as source parameter. At this moment my code is below.
[Parameter("Source",)]
public DataSeries Source { get; set; }
private BollingerBands bollingerBands;
Bars _bars;
protected override void Initialize() {
_bars = MarketData.GetBars(TimeFrame);
bollingerBands = Indicators.BollingerBands(_bars.ClosePrices, BandPeriod, std, MAType);
}
Please tell me how can I do this.
amusleh
11 Mar 2021, 15:54
Try this:
using cAlgo.API; using cAlgo.API.Indicators; using System; namespace cAlgo { [Cloud("Top", "Bottom", Opacity = 0.2)] [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class BollingerBandsMTF : Indicator { private BollingerBands _bollingerBands; private Bars _baseBars; [Parameter("Base TimeFrame", DefaultValue = "Daily")] public TimeFrame BaseTimeFrame { get; set; } [Parameter("Source", DefaultValue = DataSeriesType.Close)] public DataSeriesType DataSeriesType { get; set; } [Parameter("Periods", DefaultValue = 14, MinValue = 0)] public int Periods { get; set; } [Parameter("Standard Deviation", DefaultValue = 2, MinValue = 0)] public double StandardDeviation { get; set; } [Parameter("MA Type", DefaultValue = MovingAverageType.Simple)] public MovingAverageType MaType { get; set; } [Output("Main", LineColor = "Yellow", PlotType = PlotType.Line, Thickness = 1)] public IndicatorDataSeries Main { get; set; } [Output("Top", LineColor = "Red", PlotType = PlotType.Line, Thickness = 1)] public IndicatorDataSeries Top { get; set; } [Output("Bottom", LineColor = "Red", PlotType = PlotType.Line, Thickness = 1)] public IndicatorDataSeries Bottom { get; set; } protected override void Initialize() { _baseBars = MarketData.GetBars(BaseTimeFrame); var baseSeries = GetBaseSeries(); _bollingerBands = Indicators.BollingerBands(baseSeries, Periods, StandardDeviation, MaType); } public override void Calculate(int index) { var baseIndex = _baseBars.OpenTimes.GetIndexByTime(Bars.OpenTimes[index]); Main[index] = _bollingerBands.Main[baseIndex]; Top[index] = _bollingerBands.Top[baseIndex]; Bottom[index] = _bollingerBands.Bottom[baseIndex]; } private DataSeries GetBaseSeries() { switch (DataSeriesType) { case DataSeriesType.Open: return _baseBars.OpenPrices; case DataSeriesType.High: return _baseBars.HighPrices; case DataSeriesType.Low: return _baseBars.LowPrices; case DataSeriesType.Close: return _baseBars.ClosePrices; default: throw new ArgumentOutOfRangeException("DataSeriesType"); } } } public enum DataSeriesType { Open, High, Low, Close } }
@amusleh