Untitled
unknown
plain_text
10 months ago
5.8 kB
4
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