Что-то я пропустил это сообщение 1.5 года назад.
Например так:
Но тут учтите, чть есть запаздывание в 1 день на часовом ТФ (или другом ТФ).
Мы будем видеть АТР не текущего, а предыдущего дня. Чтобы отрисовать на текущем ТФ АТР текущего дня придётся перерисовывать весь текущий день, т.е. менять значения на всех барах текущего дня. Поэтому привожу пример как отрисовать за предыдущий день АТР дня на текущем дне, так перерисовывать не надо.
Наверное, непонятно разъяснил


Код: Выделить всё
function Initialize()
{
IndicatorName = "ATRDay";
PriceStudy = false;
AddInput("Input", Inputs.Candle);
AddSeries("ATRDay", DrawAs.Line, Color.Red);
AddParameter("Period", 14, 350);
// для сохранения списков значений OHLC
AddGlobalVariable("O", Types.DoubleList);
AddGlobalVariable("H", Types.DoubleList);
AddGlobalVariable("L", Types.DoubleList);
AddGlobalVariable("C", Types.DoubleList);
AddGlobalVariable("A", Types.DoubleList); //ATR
}
function Evaluate()
{
// evge 03.06.2018 http://alfadirect4.ru
ATRDay[0] = ATRDay[1];
// новый день
if (BarDate(0) != BarDate(1))
{
// новый бар дня
O.Insert(0, Input.Open[0]); H.Insert(0, Input.High[0]); L.Insert(0, Input.Low[0]); C.Insert(0, Input.Close[0]);
if (O.Count > 1)
{
A.Insert(0, H[1] - L[1]);
}
// лишнее удаляем
var CN = O.Count;
if (CN > Period * 2) { O.RemoveAt(CN - 1); H.RemoveAt(CN - 1); L.RemoveAt(CN - 1); C.RemoveAt(CN - 1); }
}
if (O.Count > 0)
{
if (Input.Low[0] < L[0]) L[0] = Input.Low[0];
if (Input.High[0] > H[0]) H[0] = Input.High[0];
C[0] = Input.Close[0];
}
if (A.Count > 1)
{
if (C.Count > 2)
{
var TR = Math.Max(H[1] , C[2]) - Math.Min(L[1], C[2]);
A[0] = ((Period - 1.0) * A[1] + TR) / Period;
}
}
if (A.Count > 0) ATRDay[0] = A[0];
}
Скачать код индикатора: