Он возвращает последние значения не от текущей точки расчета, а вообще последние значения за всю историю. Поэтому в любой точке истории он перерисовывает индикатор текущими значениями.
Данный метод логически должен бы возвращать не все последние значения (даже будущего, как сейчас), а только начиная от текущей точки расчета и назад в историю.
Вообщем это проблемный метод, использовать его не советую

Поэтому такое странное поведение получаем в индикаторе.
Вот код работающий. Можно сделать лучше было, но не было у меня времени. Чуть-чуть можно будет потом улучшить, перенеся в глоб. переменные Lx, Hx, Ly, Hy и поиск их сделать по другому в процессе обхода, а не поиск в истории. Будет и быстрее даже. Хотя и так нормально.
но пока так, вот примеры работы:
Код: Выделить всё
function Initialize()
{
IndicatorName = "A-DOWN_VIII";
AddInput("Input", Inputs.Candle);
AddSeries("D", DrawAs.Custom, Color.Green);
AddSeries("U", DrawAs.Custom, Color.Red);
AddShadowSeries("S", DrawAs.Custom, Color.Blue);
AddGlobalVariable("Sum", Types.Double, 0);
AddGlobalVariable("LX", Types.Long, 0);
AddGlobalVariable("HX", Types.Long, 0);
PriceStudy = false;
AddParameter("P", 2000, 1);
}
function Evaluate()
{
if (BarDate(0) != BarDate(1)) Sum = 0;
var I = MY.индикатор(Input);
var Lx = 0;
var Hx = 0;
var Ly = 0.0;
var Hy = 0.0;
for (var x = 0; x < 999; x++)
{
if (I["L"][x] > 0) { Lx = x; Ly = I["L"][x]; }
if (I["H"][x] > 0) { Hx = x; Hy = I["H"][x]; }
if (Lx != 0 && Hx != 0) break;
}
if (Lx == 0 && Hx == 0 ) return;
if ( Lx > Hx )
D[1] = Hy - Ly;
else
U[1] = Hy - Ly;
if (HX != Hx || LX != Lx)
{
HX = Hx;
LX = Lx;
Sum += Hy - Ly;
}
S[0] = Sum;
D.DrawHistogram(Color.Red, Line.Solid, 1, Color.Red, 50);
U.DrawHistogram(Color.Green, Line.Solid, 1, Color.Green, 50);
S.DrawHistogram();
}