Untitled

 avatar
unknown
plain_text
4 months ago
5.8 kB
3
Indexable
using cAlgo.API;
using cAlgo.API.Internals;
using System;
using System.Reflection;

namespace cAlgo
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.EasternStandardTime, AccessRights = AccessRights.None)]
    public class OpeningRange930 : Indicator
    {
        [Parameter("Previous Close Line Color", DefaultValue = "Red")]
        public string PreviousCloseColor { get; set; }

        [Parameter("Today Open Line Color", DefaultValue = "Green")]
        public string TodayOpenColor { get; set; }

        [Parameter("Line Thickness", DefaultValue = 2)]
        public int LineThickness { get; set; }

        [Parameter("Pre Day Hour", DefaultValue = 16)]
        public int PreDayHour { get; set; }
        
        [Parameter("Pre Day Hour", DefaultValue = 14)]
        public int PreDayMinute { get; set; }

        [Parameter("Is Show Quarter", DefaultValue = true)]
        public bool IsShowQuarter { get; set; }

        private double previousClosePrice = double.NaN;
        private bool linesDrawn = false;
        private MarketSeries _minuteSeries;

        protected override void Initialize()
        {
            // No special initialization needed
            _minuteSeries = MarketData.GetSeries(TimeFrame.Minute);
        }

        public override void Calculate(int index)
        {
            var currentBarTime = MarketSeries.OpenTime[index];

            // Ensure we are on a 1-minute timeframe
            if (TimeFrame != TimeFrame.Minute)
                return;

            // Retrieve the previous day's close price at 16:14 PM
            if (double.IsNaN(previousClosePrice))
                previousClosePrice = GetPreviousDayClosePrice(index);

            if (double.IsNaN(previousClosePrice)) return;

            // At 9:30 AM today, retrieve the open price and draw both lines
            if (currentBarTime.Hour == 9 && currentBarTime.Minute == 30 && !linesDrawn)
            {
                
                double todayOpenPrice = MarketSeries.Open[index];

                DateTime startTime = currentBarTime;
                DateTime endTime = currentBarTime.AddMinutes(30); // Extend to 10:00 AM
                Print($"Today {todayOpenPrice}");
                Print($"Previ {previousClosePrice}");
                // Draw Previous Day Close Price Line
                Chart.DrawTrendLine(
                    $"PreviousCloseLine {index}",
                    startTime, previousClosePrice,
                    endTime, previousClosePrice,
                    PreviousCloseColor,
                    LineThickness,
                    LineStyle.Solid
                );

                // Draw Today Open Price Line
                Chart.DrawTrendLine(
                    $"TodayOpenLine {index}",
                    startTime, todayOpenPrice,
                    endTime, todayOpenPrice,
                    TodayOpenColor,
                    LineThickness,
                    LineStyle.Solid
                );

                // Middle level
                var middlePrice = (todayOpenPrice + previousClosePrice) / 2;
                Chart.DrawTrendLine(
                    $"Opening Range middle line {index}",
                    startTime, middlePrice,
                    endTime, middlePrice,
                    TodayOpenColor,
                    1,
                    LineStyle.DotsRare
                );

                if(IsShowQuarter)
                {
                    // Middle level
                    Chart.DrawTrendLine(
                        $"Opening Range middle 0.25 line {index}",
                        startTime, (todayOpenPrice + middlePrice) / 2,
                        endTime, (todayOpenPrice + middlePrice) / 2,
                        TodayOpenColor,
                        1,
                        LineStyle.DotsRare
                    );

                    Chart.DrawTrendLine(
                        $"Opening Range middle 0.75 line {index}",
                        startTime, (previousClosePrice + middlePrice) / 2,
                        endTime, (previousClosePrice + middlePrice) / 2,
                        TodayOpenColor,
                        1,
                        LineStyle.DotsRare
                    );

                    // RECTANGLE DrawRectangle(string name, DateTime time1, double y1, DateTime time2, double y2, Color color);
                    var rect = Chart.DrawRectangle($"Opening Range Rect {index}", startTime, todayOpenPrice, endTime, previousClosePrice, "#1401AF50");
                    rect.IsFilled = true;
                }
                

                // Mark as drawn to prevent duplicates
                linesDrawn = true;
            }

            // Reset at the start of a new day
            if (currentBarTime.Hour == 0 && currentBarTime.Minute == 0)
            {
                linesDrawn = false;
                previousClosePrice = double.NaN; // Reset previous close price for the new day
            }
        }

        private double GetPreviousDayClosePrice(int index)
        {
            // Find the close price at 16:14 PM on the previous day
            DateTime previousDayTargetTime = MarketSeries.OpenTime[index].AddHours(PreDayHour).AddMinutes(PreDayMinute).AddDays(-1);

            Print("previous date ", previousDayTargetTime);

            for (int i = 0; i < MarketSeries.OpenTime.Count; i++)
            {
                if (MarketSeries.OpenTime[i] == previousDayTargetTime)
                    return MarketSeries.Close[i];
            }

            return double.NaN; // Return NaN if not found
        }
    }
}
Editor is loading...
Leave a Comment