Untitled
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