Support and Resistance level at Price change Series
Created at 15 Feb 2020, 14:44
DR
Support and Resistance level at Price change Series
15 Feb 2020, 14:44
Hello everyone !
Does anyone help me with with the following questions ? :
How can i modify the code of the Support & Resistance Level such that the indicators to show only the lines for H1 ?
For example i want on M1 Chart to see the support & resistance lines for H1.
Thank you !
The indicator's code is :
using System;
using System.Collections.Generic;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
namespace cAlgo
{
[Indicator("Support and Resistance At Price", IsOverlay = true, AccessRights = AccessRights.None)]
public class SRAtPrice : Indicator
{
private double extremeHigh = 0;
private double extremeLow = 0;
private double dayHi = 0;
private double dayLo = 0;
private SortedList<double, int> prices = new SortedList<double, int>();
private IList<Zone> zones = new List<Zone>();
private const string ExtremeHighName = "ExtremeHigh";
private const string ExtremeLowName = "ExtremeLow";
private const string DayHighName = "DayHigh";
private const string DayLowName = "DayLow";
[Parameter("Periods", DefaultValue = 100)]
public int Periods { get; set; }
[Parameter("Show Extreme H/L", DefaultValue = true)]
public bool ShowExtremeHL { get; set; }
[Parameter("Show Day H/L", DefaultValue = true)]
public bool ShowDayHL { get; set; }
[Parameter("Required Hits", DefaultValue = 5)]
public int RequiredHits { get; set; }
[Parameter("Zone Size", DefaultValue = 10)]
public int ZoneSize { get; set; }
[Parameter("Max Lines In Zone", DefaultValue = 3)]
public int MaxLinesInZone { get; set; }
[Output("Extreme H/L Style", Color = Colors.Pink, LineStyle = LineStyle.Solid, Thickness = 3)]
public IndicatorDataSeries ExtremeHLStyle { get; set; }
[Output("Day H/L Style", Color = Colors.Blue, LineStyle = LineStyle.Solid, Thickness = 3)]
public IndicatorDataSeries DayHLStyle { get; set; }
[Output("S/R Style", Color = Colors.Turquoise, LineStyle = LineStyle.Solid, Thickness = 2)]
public IndicatorDataSeries SRStyle { get; set; }
public override void Calculate(int index)
{
if (this.IsLastBar)
{
var currentOpenDate = this.MarketSeries.OpenTime[index].Date;
var earliest = index - this.Periods;
for (var i = index; i >= earliest; i--)
{
if (i >= 0)
{
var high = this.MarketSeries.High[i];
var nextHigh = this.MarketSeries.High[i + 1];
var low = this.MarketSeries.Low[i];
var nextLow = this.MarketSeries.Low[i + 1];
this.extremeHigh = Math.Max(high, this.extremeHigh);
this.extremeLow = this.extremeLow == 0 ? low : Math.Min(low, this.extremeLow);
if (this.TimeFrame < TimeFrame.Daily)
{
if (this.MarketSeries.OpenTime[i].Date == currentOpenDate)
{
this.dayHi = Math.Max(high, this.dayHi);
this.dayLo = this.dayLo == 0 ? low : Math.Min(low, this.dayLo);
}
}
if (nextHigh <= high)
{
this.AddOrUpdatePrice(high);
}
if (nextLow >= low)
{
this.AddOrUpdatePrice(low);
}
}
else
{
break;
}
}
this.zones.Clear();
var rangePipSize = (this.Symbol.PipSize * (double)this.ZoneSize);
for (var i = this.extremeLow + rangePipSize; i < this.extremeHigh - rangePipSize; i += rangePipSize + this.Symbol.PipSize)
{
this.zones.Add(new Zone
{
Start = i,
End = i + rangePipSize,
LinesRendered = 0
});
}
this.ChartObjects.RemoveAllObjects();
foreach (var price in this.prices.Keys)
{
this.RenderSRIfRequred(price, this.prices[price]);
}
if (this.ShowExtremeHL)
{
this.DrawExtremeHigh();
this.DrawExtremeLow();
}
if (this.TimeFrame < TimeFrame.Daily && this.ShowDayHL)
{
this.DrawDayHigh();
this.DrawDayLow();
}
}
}
private void RenderSRIfRequred(double price, int count)
{
if (count < this.RequiredHits)
{
return;
}
foreach (var range in this.zones)
{
if (price >= range.Start && price <= range.End)
{
if (range.LinesRendered != this.MaxLinesInZone)
{
range.LinesRendered++;
this.DrawSR(price);
}
return;
}
}
}
private void AddOrUpdatePrice(double priceValue)
{
if (this.prices.ContainsKey(priceValue))
{
this.prices[priceValue]++;
}
else
{
this.prices.Add(priceValue, 1);
}
}
private void DrawExtremeHigh()
{
this.DrawExtreme(ExtremeHighName, this.extremeHigh);
}
private void DrawExtremeLow()
{
this.DrawExtreme(ExtremeLowName, this.extremeLow);
}
private void DrawDayHigh()
{
this.DrawDay(DayHighName, this.dayHi);
}
private void DrawDayLow()
{
this.DrawDay(DayLowName, this.dayLo);
}
private void DrawExtreme(string name, double level)
{
var attribute = this.GetAttributeFrom<OutputAttribute>("ExtremeHLStyle");
this.ChartObjects.DrawHorizontalLine(name, level, attribute.Color, attribute.Thickness, attribute.LineStyle);
}
private void DrawDay(string name, double level)
{
var attribute = this.GetAttributeFrom<OutputAttribute>("DayHLStyle");
this.ChartObjects.DrawHorizontalLine(name, level, attribute.Color, attribute.Thickness, attribute.LineStyle);
}
private void DrawSR(double level)
{
var attribute = this.GetAttributeFrom<OutputAttribute>("SRStyle");
this.ChartObjects.DrawHorizontalLine(string.Format("SR {0}", level), level, attribute.Color, attribute.Thickness, attribute.LineStyle);
}
private T GetAttributeFrom<T>(string propertyName)
{
var attrType = typeof(T);
var property = this.GetType().GetProperty(propertyName);
return (T)property.GetCustomAttributes(attrType, false).GetValue(0);
}
private class Price
{
internal double Value { get; set; }
internal int Count { get; set; }
}
private class Zone
{
internal double Start { get; set; }
internal double End { get; set; }
internal int LinesRendered { get; set; }
}
}
}