MultiStoch 7.0. Вариант для MT5

Ещё один индикатор получилось перевести на MT5 без особых усилий, хотя кода пришлось исправить много. Никаких дополнительных функций не появилось. Версию сменил, так как изменения в коде достаточно большие.

Посмотрим, что интересного появилось в коде.

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