Untitled
unknown
plain_text
9 months ago
6.1 kB
4
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