т.е. теперь должно быть соответствие значений High, Low от таймфрейма значениям Hi, Lo серий для аналогичного таймфрейму значения параметра Hours
Код: Выделить всё
function Initialize()
{
IndicatorName = "RangeHours";
AddInput("Input", Inputs.Candle);
PriceStudy = true;
AddSeries("Hi", DrawAs.Custom, Color.Green); // максимум предыдущего часа
AddSeries("Lo", DrawAs.Custom, Color.Red); // минимум предыдущего часа
AddSeries("Mid", DrawAs.Custom, Color.Silver); // средняя цена
AddParameter("MinScan", 163, 2); // подзагрузка истории количество 5-минутных баров
AddParameter("CDType", 1); // Current Data Type - тип текущего часа, 0 - продолжать отображение экстремумов предыдущего часа, 1 - экстремумы текущего часа (будут меняться динамически в течение часа)
AddParameter("Hours", 4); // кол-во часов
AddGlobalVariable("High", Types.Double, 0);
AddGlobalVariable("Low", Types.Double, 0);
AddGlobalVariable("Open", Types.Double, 0);
AddGlobalVariable("Close", Types.Double, 0);
AddGlobalVariable("LastHigh", Types.Double, 0);
AddGlobalVariable("LastLow", Types.Double, 0);
AddGlobalVariable("SI", Types.Int, 0);
AddGlobalVariable("SIO", Types.Int, 0);
AddGlobalVariable("HRS", Types.Double, 0);
}
function Evaluate()
{
// evge 27.04.2020 https://alfadirect4.ru
// RangeHours - Индикатор рисует экстремумы предыдущих часов и текущего часа, в зависимости от параметров, продолжая экстремумы предыдущего часа (кол-ва часов Hours) или расчитывая в текущем часе динамически.
// 14.08.2020 добавлен параметр Hours, где можно задать количество часов для вычисления диапазона.
// 14.08.2020 добавлен пересчет часов под реальный таймфрейм. Для совпадения показаний индикатора с данными графика в указанном таймфрейме (в часах) H1, H2, H3, H4, H6, H8, H12
bool isH = false;
int[] HH = {0,0,0,1,2,0,4,0,2,0,0,0,10};
//первая свечка часа
//сохранаем текущий индекс и последние найденные High, Low
if ( BarTime().Hours != BarTime(1).Hours)
{
bool NewDay = BarTime(0).Hours < BarTime(1).Hours;
HRS = BarTime(0).Hours > BarTime(1).Hours ? HRS + BarTime(0).Hours - BarTime(1).Hours : Hours > 0 && Hours <= 12 ? HH[(int)Hours] : BarTime(0).Hours;
if (HRS >= Hours || NewDay)
{
isH = true;
if (!NewDay) HRS = 0;
SIO = SI;
SI = CurrentIndex;
LastHigh = High;
LastLow = Low;
//перерисовываем
if (SIO != 0)
for (var x=0; x <= CurrentIndex - SIO; x++)
{
Hi[x] = High;
Lo[x] = Low;
Mid[x] = (Low + High) * 0.5;
}
}
}
if ((BarTime().Hours != DateTime.Today.Hour) || CDType != 0)
if (isH)
{
High = Input.High[0];
Low = Input.Low[0];
Open = Input.Open[0];
Close = Input.Close[0];
}
else if (BarTime() > AsTime(0, 0, 0))
{
if ( Input.High[0] > High) High = Input.High[0];
if ( Input.Low[0] < Low) Low = Input.Low[0];
Close = Input.Close[0];
}
if (CDType == 0)
{
if (LastHigh !=0 && LastLow !=0)
{
Hi[0] = LastHigh;
Lo[0] = LastLow;
Mid[0] = (LastLow + LastHigh) * 0.5;
Hi.DrawDash();
Lo.DrawDash();
Mid.DrawDash();
}
} else
{
if (SI != 0)
for (var x=0; x <= CurrentIndex - SI; x++)
{
Hi[x] = High;
Lo[x] = Low;
Mid[x] = (Low + High) * 0.5;
}
Hi.DrawDash();
Lo.DrawDash();
Mid.DrawDash();
}
}