Посмотрим, что интересного появилось в коде.
Пожалуй, был только один интересный момент - это использование буфера линии внутри структуры, что позволяет избавится от громоздких наборов буферов линий. Это будет интересно скорее новичкам, либо просто застрявшим в старом MQL4. У меня мало подобных индикаторов (с кучей линий), поэтому вопрос обходился стороной долгое время.
В старой версии MultiStoch было 8 отдельных массивов буферов, и каждый из них приходилось обрабатывать вручную по отдельности. Такой вот ужас:
// Буферы линий
double V1[], V2[], V3[], V4[], V5[], V6[], V7[], V8[];
...
void EmptyBar(int bar)
{
V1[bar] = EMPTY_VALUE;
V2[bar] = EMPTY_VALUE;
V3[bar] = EMPTY_VALUE;
V4[bar] = EMPTY_VALUE;
V5[bar] = EMPTY_VALUE;
V6[bar] = EMPTY_VALUE;
V7[bar] = EMPTY_VALUE;
V8[bar] = EMPTY_VALUE;
}
...
if (startInFront)
{
SetIndexBuffer(7 + indexShift, v1);
SetIndexBuffer(6 + indexShift, v2);
SetIndexBuffer(5 + indexShift, v3);
SetIndexBuffer(4 + indexShift, v4);
SetIndexBuffer(3 + indexShift, v5);
SetIndexBuffer(2 + indexShift, v6);
SetIndexBuffer(1 + indexShift, v7);
SetIndexBuffer(0 + indexShift, v8);
}
else
{
SetIndexBuffer(0 + indexShift, v1);
SetIndexBuffer(1 + indexShift, v2);
SetIndexBuffer(2 + indexShift, v3);
SetIndexBuffer(3 + indexShift, v4);
SetIndexBuffer(4 + indexShift, v5);
SetIndexBuffer(5 + indexShift, v6);
SetIndexBuffer(6 + indexShift, v7);
SetIndexBuffer(7 + indexShift, v8);
}
...
if (p == 0)
V1[i] = stoch;
else if (p == 1)
V2[i] = stoch;
else if (p == 2)
V3[i] = stoch;
else if (p == 3)
V4[i] = stoch;
else if (p == 4)
V5[i] = stoch;
else if (p == 5)
V6[i] = stoch;
else if (p == 6)
V7[i] = stoch;
else if (p == 7)
Теперь я делаю вот что. Беру простенькую структуру, внутри которой находится переменная для буфера линии.
struct Plot
{
double Buffer[]; // буфер линии
};
После чего доступ к буферам уже может осуществляться через индекс. Вот то же самое в новом виде.
Plot _stochs[];
...
void EmptyBar(int bar)
{
for (int i = 0; i < _lineCount; i++)
_stochs[i].Buffer[bar] = EMPTY_VALUE;
}
...
for (int i = 0; i < _lineCount; i++)
{
int p = StartInFront ? _lineCount - 1 - i : i;
SetIndexBuffer(i, _stochs[p].Buffer);
}
...
_stochs[p].Buffer[i] = stoch;
Особенно хорошо получилось заменить последний блок с установкой значения в нужный буфер, он меня больше всего напрягал.
Больше ничего интересного в обновлении не было, скачать можно со странички индикатора MultiStoch.