Reference to Indicator - Make SL = S/R Levels
Reference to Indicator - Make SL = S/R Levels
15 Apr 2019, 19:48
I have a sticking point. I have a cbot, and I want the stop loss in the cbot to be placed where the S/R levels in the chart are.
So the S/R level code I'm referring to is this:
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.Red, LineStyle = LineStyle.DotsVeryRare)] public IndicatorDataSeries ExtremeHLStyle { get; set; } [Output("Day H/L Style", Color = Colors.Blue, LineStyle = LineStyle.DotsVeryRare)] public IndicatorDataSeries DayHLStyle { get; set; } [Output("S/R Style", Color = Colors.Orange, LineStyle = LineStyle.DotsVeryRare)] 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; } } } }
I got this code from this thread, posted by user forum member testpossessed, who was kind enough to provide the source code thereof.
How can I do it so that the stop loss of my positions automatically correspondends to the price where the S/R levels are located according to the S/R price indicator above? Is that even possible? If not, then maybe a code wherein if position is at an S/R level and at negative xx pips, then bot automatically closes the position.
I would appreciate help on this issue.
Thanks.
Replies
PanagiotisCharalampous
18 Apr 2019, 22:02
Hi ryanoia@gmail.com,
I don't think this is possible with the existing indicator since the S/R levels are not accessilbe. You will need to make considerable changes to achieve this.
Best Regards,
Panagiotis
@PanagiotisCharalampous
ryanoia@gmail.com
22 Apr 2019, 03:08
Considerable changes - does that mean almost changing the code from scratch or a major overhaul? Would appreciate your assessment on this. Thanks.
@ryanoia@gmail.com
ryanoia@gmail.com
22 Apr 2019, 03:10
How about making reference to this pivot point indicator:
using System; using cAlgo.API; using cAlgo.API.Internals; using cAlgo.API.Indicators; namespace cAlgo.Indicators { [Indicator(IsOverlay = true, TimeZone = TimeZones.EasternStandardTime, AccessRights = AccessRights.None)] public class AllPivots : Indicator { private DateTime _previousPeriodStartTime; private int _previousPeriodStartIndex; private TimeFrame PivotTimeFrame; private VerticalAlignment vAlignment = VerticalAlignment.Top; private HorizontalAlignment hAlignment = HorizontalAlignment.Right; public string PP; Colors pivotColor = Colors.Magenta; Colors supportColor = Colors.Red; Colors resistanceColor = Colors.DodgerBlue; Colors pmedioColor = Colors.Green; [Parameter("Show Labels", DefaultValue = true)] public bool ShowLabels { get; set; } [Parameter("Pivot Color", DefaultValue = "Magenta")] public string PivotColor { get; set; } [Parameter("Support Color", DefaultValue = "Red")] public string SupportColor { get; set; } [Parameter("Resistance Color", DefaultValue = "DodgerBlue")] public string ResistanceColor { get; set; } [Parameter("PMedio Color", DefaultValue = "Green")] public string PmedioColor { get; set; } [Parameter("Espessura Pivot", DefaultValue = 1)] public int Espessura { get; set; } [Parameter("Espessura Pivot Medio", DefaultValue = 1)] public int Espessura2 { get; set; } protected override void Initialize() { PivotTimeFrame = TimeFrame.Daily; PP = "P Daily"; /* if (TimeFrame < TimeFrame.Hour4) { PivotTimeFrame = TimeFrame.Daily; PP = "P Daily"; } if ((TimeFrame >= TimeFrame.Hour4) && (TimeFrame < TimeFrame.Weekly)) { PivotTimeFrame = TimeFrame.Weekly; PP = "P Weekly"; } if (TimeFrame >= TimeFrame.Weekly) { PivotTimeFrame = TimeFrame.Monthly; PP = "P Monthly"; } */ Enum.TryParse(PivotColor, out pivotColor); Enum.TryParse(SupportColor, out supportColor); Enum.TryParse(ResistanceColor, out resistanceColor); Enum.TryParse(PmedioColor, out pmedioColor); } private DateTime GetStartOfPeriod(DateTime dateTime) { return CutToOpenByNewYork(dateTime, PivotTimeFrame); } private DateTime GetEndOfPeriod(DateTime dateTime) { if (PivotTimeFrame == TimeFrame.Monthly) { return new DateTime(dateTime.Year, dateTime.Month, 1).AddMonths(1); } return AddPeriod(CutToOpenByNewYork(dateTime, PivotTimeFrame), PivotTimeFrame); } public override void Calculate(int index) { var currentPeriodStartTime = GetStartOfPeriod(MarketSeries.OpenTime[index]); if (currentPeriodStartTime == _previousPeriodStartTime) return; if (index > 0) CalculatePivots(_previousPeriodStartTime, _previousPeriodStartIndex, currentPeriodStartTime, index); _previousPeriodStartTime = currentPeriodStartTime; _previousPeriodStartIndex = index; } private void CalculatePivots(DateTime startTime, int startIndex, DateTime startTimeOfNextPeriod, int index) { var high = MarketSeries.High[startIndex]; var low = MarketSeries.Low[startIndex]; var close = MarketSeries.Close[startIndex]; var i = startIndex + 1; while (GetStartOfPeriod(MarketSeries.OpenTime[i]) == startTime && i < MarketSeries.Close.Count) { high = Math.Max(high, MarketSeries.High[i]); low = Math.Min(low, MarketSeries.Low[i]); close = MarketSeries.Close[i]; i++; } var pivotStartTime = startTimeOfNextPeriod; var pivotEndTime = GetEndOfPeriod(startTimeOfNextPeriod); var pivot = (high + low + close) / 3; var r1 = 2 * pivot - low; var s1 = 2 * pivot - high; var r2 = pivot + high - low; var s2 = pivot - high + low; var r3 = high + 2 * (pivot - low); var s3 = low - 2 * (high - pivot); var r4 = r3 + pivot - low; var s4 = s3 + pivot - high; var m0 = (s4 + s3) / 2; var m1 = (s3 + s2) / 2; var m2 = (s2 + s1) / 2; var m3 = (s1 + pivot) / 2; var m4 = (pivot + r1) / 2; var m5 = (r1 + r2) / 2; var m6 = (r2 + r3) / 2; var m7 = (r3 + r4) / 2; ChartObjects.DrawLine("pivot " + startIndex, pivotStartTime, pivot, pivotEndTime, pivot, pivotColor, Espessura, LineStyle.Solid); ChartObjects.DrawLine("r1 " + startIndex, pivotStartTime, r1, pivotEndTime, r1, resistanceColor, Espessura, LineStyle.Solid); ChartObjects.DrawLine("r2 " + startIndex, pivotStartTime, r2, pivotEndTime, r2, resistanceColor, Espessura, LineStyle.Solid); ChartObjects.DrawLine("r3 " + startIndex, pivotStartTime, r3, pivotEndTime, r3, Colors.Aqua, Espessura, LineStyle.Solid); ChartObjects.DrawLine("r4 " + startIndex, pivotStartTime, r4, pivotEndTime, r4, Colors.SlateBlue, Espessura, LineStyle.Solid); ChartObjects.DrawLine("s1 " + startIndex, pivotStartTime, s1, pivotEndTime, s1, supportColor, Espessura, LineStyle.Solid); ChartObjects.DrawLine("s2 " + startIndex, pivotStartTime, s2, pivotEndTime, s2, supportColor, Espessura, LineStyle.Solid); ChartObjects.DrawLine("s3 " + startIndex, pivotStartTime, s3, pivotEndTime, s3, Colors.Yellow, Espessura, LineStyle.Solid); ChartObjects.DrawLine("s4 " + startIndex, pivotStartTime, s4, pivotEndTime, s4, Colors.Orange, Espessura, LineStyle.Solid); ChartObjects.DrawLine("m0 " + startIndex, pivotStartTime, m0, pivotEndTime, m0, pmedioColor, Espessura2, LineStyle.DotsRare); ChartObjects.DrawLine("m1 " + startIndex, pivotStartTime, m1, pivotEndTime, m1, pmedioColor, Espessura2, LineStyle.DotsRare); ChartObjects.DrawLine("m2 " + startIndex, pivotStartTime, m2, pivotEndTime, m2, pmedioColor, Espessura2, LineStyle.DotsRare); ChartObjects.DrawLine("m3 " + startIndex, pivotStartTime, m3, pivotEndTime, m3, pmedioColor, Espessura2, LineStyle.DotsRare); ChartObjects.DrawLine("m4 " + startIndex, pivotStartTime, m4, pivotEndTime, m4, pmedioColor, Espessura2, LineStyle.DotsRare); ChartObjects.DrawLine("m5 " + startIndex, pivotStartTime, m5, pivotEndTime, m5, pmedioColor, Espessura2, LineStyle.DotsRare); ChartObjects.DrawLine("m6 " + startIndex, pivotStartTime, m6, pivotEndTime, m6, pmedioColor, Espessura2, LineStyle.DotsRare); ChartObjects.DrawLine("m7 " + startIndex, pivotStartTime, m7, pivotEndTime, m7, pmedioColor, Espessura2, LineStyle.DotsRare); if (!ShowLabels) return; ChartObjects.DrawText("Lpivot " + startIndex, PP + "=" + pivot.ToString("0.00000"), index, pivot, vAlignment, hAlignment, Colors.White); ChartObjects.DrawText("Lr1 " + startIndex, "R1=" + r1.ToString("0.00000"), index, r1, vAlignment, hAlignment, resistanceColor); ChartObjects.DrawText("Lr2 " + startIndex, "R2=" + r2.ToString("0.00000"), index, r2, vAlignment, hAlignment, resistanceColor); ChartObjects.DrawText("Lr3 " + startIndex, "R3=" + r3.ToString("0.00000"), index, r3, vAlignment, hAlignment, Colors.Aqua); ChartObjects.DrawText("Lr4 " + startIndex, "R4=" + r4.ToString("0.00000"), index, r4, vAlignment, hAlignment, Colors.SlateBlue); ChartObjects.DrawText("Ls1 " + startIndex, "S1=" + s1.ToString("0.00000"), index, s1, vAlignment, hAlignment, supportColor); ChartObjects.DrawText("Ls2 " + startIndex, "S2=" + s2.ToString("0.00000"), index, s2, vAlignment, hAlignment, supportColor); ChartObjects.DrawText("Ls3 " + startIndex, "S3=" + s3.ToString("0.00000"), index, s3, vAlignment, hAlignment, Colors.Yellow); ChartObjects.DrawText("Ls4 " + startIndex, "S4=" + s4.ToString("0.00000"), index, s4, vAlignment, hAlignment, Colors.Orange); } private static DateTime CutToOpenByNewYork(DateTime date, TimeFrame timeFrame) { if (timeFrame == TimeFrame.Daily) { var hourShift = (date.Hour + 24 - 17) % 24; return new DateTime(date.Year, date.Month, date.Day, date.Hour, 0, 0, DateTimeKind.Unspecified).AddHours(-hourShift); } if (timeFrame == TimeFrame.Weekly) return GetStartOfTheWeek(date); if (timeFrame == TimeFrame.Monthly) { return new DateTime(date.Year, date.Month, 1, 0, 0, 0, DateTimeKind.Unspecified); } throw new ArgumentException(string.Format("Unknown timeframe: {0}", timeFrame), "timeFrame"); } private static DateTime GetStartOfTheWeek(DateTime dateTime) { return dateTime.Date.AddDays((double)DayOfWeek.Sunday - (double)dateTime.Date.DayOfWeek).AddHours(-7); } public DateTime AddPeriod(DateTime dateTime, TimeFrame timeFrame) { if (timeFrame == TimeFrame.Daily) { return dateTime.AddDays(1); } if (timeFrame == TimeFrame.Weekly) { return dateTime.AddDays(7); } if (timeFrame == TimeFrame.Monthly) return dateTime.AddMonths(1); throw new ArgumentException(string.Format("Unknown timeframe: {0}", timeFrame), "timeFrame"); } } }
@ryanoia@gmail.com
PanagiotisCharalampous
22 Apr 2019, 10:35
Hi ryanoia@gmail.com,
You will need to add functionality to access the support and resistance levels from a cBot.
Best Regards,
Panagiotis
@PanagiotisCharalampous
ryanoia@gmail.com
22 Apr 2019, 10:50
Ok. So are you saying that with the second indicator, it is possible, it's just that I have to add functionality in the pivot point cBot code for the cBot to access the support and resistance levels in the indicator?
@ryanoia@gmail.com
ryanoia@gmail.com
22 Apr 2019, 10:51
I mean, pivot point support and resistance levels
@ryanoia@gmail.com
PanagiotisCharalampous
23 Apr 2019, 16:22
Hi ryanoia@gmail.com,
Ok. So are you saying that with the second indicator, it is possible, it's just that I have to add functionality in the pivot point cBot code for the cBot to access the support and resistance levels in the indicator?
Yes this is what I mean.
Best Regards,
Panagiotis
@PanagiotisCharalampous
ryanoia@gmail.com
18 Apr 2019, 10:33
Possible?
I just need to know if this is possible or not so that I know if I am wasting time trying to do this or not. The code is simple, instead of take profit or stop loss in the executemarketorder, I want to change it to the price levels indicated in the price S/R indicator.
@ryanoia@gmail.com