Untitled
using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.API.Internals; using System; namespace cAlgo { [Indicator(IsOverlay = true, TimeZone = TimeZones.EasternStandardTime, AccessRights = AccessRights.None)] public class TimeRangeBox : Indicator { [Parameter("From Time (HH:mm)", DefaultValue = "07:00")] public string FromTime { get; set; } [Parameter("To Time (HH:mm)", DefaultValue = "08:30")] public string ToTime { get; set; } [Parameter("Trendline Start Time (HH:mm)", DefaultValue = "09:30")] public string TrendlineStartTime { get; set; } [Parameter("Trendline End Time (HH:mm)", DefaultValue = "10:00")] public string TrendlineEndTime { get; set; } [Parameter("Box Name", DefaultValue = "Time Box")] public string BoxName { get; set; } [Parameter("Box Color", DefaultValue = "DodgerBlue")] public string BoxColor { get; set; } [Parameter("Box Opacity (0-100)", DefaultValue = 50)] public int BoxOpacity { get; set; } [Parameter("Trendline Color", DefaultValue = "Red")] public string TrendlineColor { get; set; } private TimeSpan fromTimeSpan; private TimeSpan toTimeSpan; private TimeSpan trendlineStartTimeSpan; private TimeSpan trendlineEndTimeSpan; private DateTime lastDrawnDate = DateTime.MinValue; protected override void Initialize() { fromTimeSpan = TimeSpan.Parse(FromTime); toTimeSpan = TimeSpan.Parse(ToTime); trendlineStartTimeSpan = TimeSpan.Parse(TrendlineStartTime); trendlineEndTimeSpan = TimeSpan.Parse(TrendlineEndTime); } public override void Calculate(int index) { var currentTime = MarketSeries.OpenTime[index]; DateTime today = currentTime.Date; DateTime fromDateTime = today + fromTimeSpan; DateTime toDateTime = today + toTimeSpan; DateTime trendlineStartDateTime = today + trendlineStartTimeSpan; DateTime trendlineEndDateTime = today + trendlineEndTimeSpan; if (currentTime < toDateTime || lastDrawnDate == today) return; lastDrawnDate = today; double highestHigh = double.MinValue; double lowestLow = double.MaxValue; for (int i = index; i >= 0; i--) { DateTime barTime = MarketSeries.OpenTime[i]; if (barTime >= fromDateTime && barTime <= toDateTime) { if (MarketSeries.High[i] > highestHigh) highestHigh = MarketSeries.High[i]; if (MarketSeries.Low[i] < lowestLow) lowestLow = MarketSeries.Low[i]; } if (barTime < fromDateTime) break; } if (highestHigh > double.MinValue && lowestLow < double.MaxValue) { double pipSize = Symbol.PipSize; double pipsRange = (highestHigh - lowestLow) / pipSize; Chart.DrawRectangle( $"TimeBox_{today}", fromDateTime, highestHigh, toDateTime, lowestLow, Color.FromName(BoxColor), BoxOpacity ); Chart.DrawText( $"Label_{today}", $"{BoxName} {pipsRange:F1} pips", fromDateTime.AddSeconds((toDateTime - fromDateTime).TotalSeconds / 2), lowestLow + (highestHigh - lowestLow) / 2, Color.FromName(BoxColor) ); Chart.DrawTrendLine( $"Trendline_High_{today}", trendlineStartDateTime, highestHigh, trendlineEndDateTime, highestHigh, Color.FromName(TrendlineColor), 1, LineStyle.LinesDots ); Chart.DrawTrendLine( $"Trendline_50p_{today}", trendlineStartDateTime,lowestLow + (highestHigh - lowestLow) / 2, trendlineEndDateTime, lowestLow + (highestHigh - lowestLow) / 2, Color.FromName(TrendlineColor), 1, LineStyle.DotsRare ); Chart.DrawTrendLine( $"Trendline_Low_{today}", trendlineStartDateTime, lowestLow, trendlineEndDateTime, lowestLow, Color.FromName(TrendlineColor), 1, LineStyle.LinesDots ); } } } }
Leave a Comment