Untitled

 avatar
unknown
csharp
11 days ago
5.0 kB
5
Indexable
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