воскресенье, 31 января 2016 г.

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.

Комментариев нет:

Отправить комментарий