Untitled

 avatar
unknown
plain_text
5 months ago
6.1 kB
3
Indexable
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using System;

namespace cAlgo
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.CentralEuropeStandardTime, AccessRights = AccessRights.None)]
    public class NewDayOpening : Indicator
    {
        [Parameter("Daily Line Color", DefaultValue = "DodgerBlue")]
        public string DailyLineColor { get; set; }

        [Parameter("Previous Day Close Line Color", DefaultValue = "DodgerBlue")]
        public string PreviousDayCloseLineColor { get; set; }

        [Parameter("Weekly Line Color", DefaultValue = "Green")]
        public string WeeklyLineColor { get; set; }

        [Parameter("Previous Week Close Line Color", DefaultValue = "Green")]
        public string PreviousWeekCloseLineColor { get; set; }

        [Parameter("Show NDOG", DefaultValue = true)]
        public bool IsShowNDOG { get; set; }

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

        [Parameter("Line Style", DefaultValue = LineStyle.Solid)]
        public LineStyle LineStyle { get; set; }

        private MarketSeries _dailySeries;
        private MarketSeries _weeklySeries;

        protected override void Initialize()
        {
            _dailySeries = MarketData.GetSeries(TimeFrame.Daily);
            _weeklySeries = MarketData.GetSeries(TimeFrame.Weekly);
        }

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

            

            if (IsShowNDOG)
            {
                DrawDailyOpeningLine(index, currentBarTime);
                DrawNdogLine(index, currentBarTime);
            }
                

            DrawWeeklyOpeningLine(index, currentBarTime);

            DrawPreviousWeekCloseLine(index, currentBarTime);
        }

        private void DrawDailyOpeningLine(int index, DateTime currentBarTime)
        {
            var currentDay = currentBarTime.Date;
            int dailyIndex = _dailySeries.OpenTime.GetIndexByTime(currentDay);
            if (dailyIndex < 0) return;

            double dailyOpenPrice = _dailySeries.Open[dailyIndex];
            int firstBarIndex = GetFirstBarIndexOfDay(currentDay);
            int lastBarIndex = index;

            Chart.DrawTrendLine($"DailyOpen_{currentDay}", MarketSeries.OpenTime[firstBarIndex], dailyOpenPrice, MarketSeries.OpenTime[lastBarIndex], dailyOpenPrice, DailyLineColor, LineThickness, LineStyle);
        }

        private void DrawNdogLine(int index, DateTime currentBarTime)
        {
            var previousDay = currentBarTime.Date.AddDays(-1);
            var currentDay = currentBarTime.Date;
            int firstBarIndex = GetFirstBarIndexOfDay(currentDay);
            int lastBarIndex = index;

            int previousDayIndex = _dailySeries.OpenTime.GetIndexByTime(previousDay);
            int dailyIndex = _dailySeries.OpenTime.GetIndexByTime(currentDay);

            if (dailyIndex < 0 || previousDayIndex < 0) return;

            double previousDayClosePrice = _dailySeries.Close[previousDayIndex];
            double dailyOpenPrice = _dailySeries.Open[dailyIndex];
            double midPrice = (dailyOpenPrice + previousDayClosePrice) / 2;

            Chart.DrawTrendLine($"PreviousDayClose_{previousDay}", MarketSeries.OpenTime[firstBarIndex], previousDayClosePrice, MarketSeries.OpenTime[lastBarIndex], previousDayClosePrice, PreviousDayCloseLineColor, LineThickness, LineStyle);
            Chart.DrawTrendLine($"Mid_NDOG_{previousDay}", MarketSeries.OpenTime[firstBarIndex], midPrice, MarketSeries.OpenTime[lastBarIndex], midPrice, PreviousDayCloseLineColor, LineThickness, LineStyle.DotsVeryRare);
        }

        private void DrawWeeklyOpeningLine(int index, DateTime currentBarTime)
        {
            var currentWeekStart = StartOfWeek(currentBarTime);
            int weeklyIndex = _weeklySeries.OpenTime.GetIndexByTime(currentWeekStart);
            if (weeklyIndex < 0) return;

            double weeklyOpenPrice = _weeklySeries.Open[weeklyIndex];
            int firstBarIndex = GetFirstBarIndexOfWeek(currentWeekStart);
            int lastBarIndex = index;

            Chart.DrawTrendLine($"WeeklyOpen_{currentWeekStart}", MarketSeries.OpenTime[firstBarIndex], weeklyOpenPrice, MarketSeries.OpenTime[lastBarIndex], weeklyOpenPrice, WeeklyLineColor, LineThickness, LineStyle);
        }

        private void DrawPreviousWeekCloseLine(int index, DateTime currentBarTime)
        {
            var previousWeekStart = StartOfWeek(currentBarTime).AddDays(-7);
            int previousWeekIndex = _weeklySeries.OpenTime.GetIndexByTime(previousWeekStart);
            if (previousWeekIndex < 0) return;

            double previousWeekClosePrice = _weeklySeries.Close[previousWeekIndex];
            int firstBarIndex = GetFirstBarIndexOfWeek(previousWeekStart.AddDays(7)); // Starting from the current week
            int lastBarIndex = index;

            Chart.DrawTrendLine($"PreviousWeekClose_{previousWeekStart}", MarketSeries.OpenTime[firstBarIndex], previousWeekClosePrice, MarketSeries.OpenTime[lastBarIndex], previousWeekClosePrice, PreviousWeekCloseLineColor, LineThickness, LineStyle);
        }

        private int GetFirstBarIndexOfDay(DateTime day)
        {
            for (int i = 0; i < MarketSeries.OpenTime.Count; i++)
                if (MarketSeries.OpenTime[i].Date == day)
                    return i;
            return 0;
        }

        private int GetFirstBarIndexOfWeek(DateTime weekStart)
        {
            for (int i = 0; i < MarketSeries.OpenTime.Count; i++)
                if (MarketSeries.OpenTime[i].Date >= weekStart)
                    return i;
            return 0;
        }

        private DateTime StartOfWeek(DateTime date)
        {
            int diff = date.DayOfWeek - DayOfWeek.Monday;
            if (diff < 0) diff += 7;
            return date.AddDays(-diff).Date;
        }
    }
}
Editor is loading...
Leave a Comment