Посмотрим, что интересного появилось в коде.
Пожалуй, был только один интересный момент - это использование буфера линии внутри структуры, что позволяет избавится от громоздких наборов буферов линий. Это будет интересно скорее новичкам, либо просто застрявшим в старом 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.