Untitled
unknown
plain_text
a year ago
4.7 kB
4
Indexable
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using System;
namespace cAlgo.Indicators
{
[Indicator(IsOverlay = true, TimeZone = TimeZones.UTC)]
public class Us30BreakerBox : Indicator
{
[Parameter("Start Time (Hour)", DefaultValue = 19)]
public int StartHour { get; set; }
[Parameter("Start Time (Minute)", DefaultValue = 0)]
public int StartMinute { get; set; }
[Parameter("End Time (Hour)", DefaultValue = 23)]
public int EndHour { get; set; }
[Parameter("End Time (Minute)", DefaultValue = 59)]
public int EndMinute { get; set; }
[Parameter("UTC Shift", DefaultValue = -5)]
public int UtcShift { get; set; }
private DateTime _sessionStart, _sessionEnd;
private double _sessionHigh, _sessionLow;
private string _currentBoxName;
private string _currentPipLabelName;
protected override void Initialize()
{
_sessionHigh = double.MinValue;
_sessionLow = double.MaxValue;
UpdateSessionTimes(MarketSeries.OpenTime.LastValue);
}
public override void Calculate(int index)
{
var barTime = MarketSeries.OpenTime[index];
// Check if we need to reset the box for a new day
if (barTime.AddHours(UtcShift).Date != _sessionStart.Date)
{
// Finalize and draw the box for the previous day
if (_sessionHigh > double.MinValue && _sessionLow < double.MaxValue)
{
DrawBox(_sessionStart, _sessionEnd, _sessionHigh, _sessionLow);
}
// Reset for the new day
UpdateSessionTimes(barTime);
_sessionHigh = double.MinValue;
_sessionLow = double.MaxValue;
}
// Update session high and low during the session
if (barTime >= _sessionStart && barTime <= _sessionEnd)
{
_sessionHigh = Math.Max(_sessionHigh, MarketSeries.High[index]);
_sessionLow = Math.Min(_sessionLow, MarketSeries.Low[index]);
// Dynamically draw or update the box for the current session
DrawCurrentSessionBox(_sessionStart, barTime, _sessionHigh, _sessionLow);
}
}
private void UpdateSessionTimes(DateTime currentTime)
{
_sessionStart = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, StartHour - UtcShift, StartMinute, 0, DateTimeKind.Utc);
if (StartHour > EndHour || (StartHour == EndHour && StartMinute > EndMinute))
{
_sessionEnd = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, EndHour - UtcShift, EndMinute, 0, DateTimeKind.Utc).AddDays(1);
}
else
{
_sessionEnd = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, EndHour - UtcShift, EndMinute, 0, DateTimeKind.Utc);
}
}
private void DrawBox(DateTime startTime, DateTime endTime, double high, double low)
{
string boxName = $"SessionBox_{startTime:yyyyMMdd}";
string pipLabelName = $"PipLabel_{startTime:yyyyMMdd}";
Chart.RemoveObject(boxName);
Chart.RemoveObject(pipLabelName);
var rectangle = Chart.DrawRectangle(boxName, startTime, high, endTime, low, Color.Yellow);
rectangle.IsFilled = false;
// Calculate pips and display the value on the chart
double pipDifference = (high - low) / Symbol.PipSize;
Chart.DrawText(pipLabelName, $"{pipDifference:F1} pips", startTime, high, Color.Yellow);
}
private void DrawCurrentSessionBox(DateTime startTime, DateTime currentTime, double high, double low)
{
_currentBoxName = $"CurrentSessionBox";
_currentPipLabelName = $"CurrentPipLabel";
Chart.RemoveObject(_currentBoxName);
Chart.RemoveObject(_currentPipLabelName);
var rectangle = Chart.DrawRectangle(_currentBoxName, startTime, high, currentTime, low, Color.Green);
rectangle.IsFilled = false;
// Calculate pips and display the value on the chart
double pipDifference = (high - low) / Symbol.PipSize;
Chart.DrawText(_currentPipLabelName, $"{pipDifference:F1} pips", startTime, high, Color.Green);
}
}
}
Editor is loading...
Leave a Comment