MT4 iMAOnArray и iBandsOnArray влияние количества элементов на расчёты

 

Собственно сабж. Если мне не нужно считать весь массив, а нужны только последние N элементов.

Не совсем понимаю логику расчёта этих функций при ограничении. Есть массив таймсерия (один из буферов индикатора), если оставить количество элементов равное 0 вопросов нет, всё считается и получается, но при уменьшении количества элементов участвующих в расчётах по тем же смещениям я получаю только первичные. Проще говоря есть массив 5000 элементов (баров на графике), для экономии времени мне нужно посчитать только последние 300, но при указании во втором параметре значения 300 я получаю первичные 5000-4700 элементов, но по смещению 300-0, и далее значения при вызове не меняются. Какой смысл использования этого параметра?

 
Sergey Efimenko:

Собственно сабж. Если мне не нужно считать весь массив, а нужны только последние N элементов.

Не совсем понимаю логику расчёта этих функций при ограничении. Есть массив таймсерия (один из буферов индикатора), если оставить количество элементов равное 0 вопросов нет, всё считается и получается, но при уменьшении количества элементов участвующих в расчётах по тем же смещениям я получаю только первичные. Проще говоря есть массив 5000 элементов (баров на графике), для экономии времени мне нужно посчитать только последние 300, но при указании во втором параметре значения 300 я получаю первичные 5000-4700 элементов, но по смещению 300-0, и далее значения при вызове не меняются. Какой смысл использования этого параметра?

Приведите пример кода, для полного понимания вопроса.
 
Alexander Voronkov:
Приведите пример кода, для полного понимания вопроса.

так работает нормально:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i);

так не работает нормально:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i); 

 
Sergey Efimenko:

так работает нормально:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i);

так не работает нормально:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i); 

Для экономии времени и посчитать только последние 300 (баров на графике) используйте значения операторов for() или if().
 
Alexander Voronkov:
Для экономии времени и посчитать только последние 300 (баров на графике) используйте значения операторов for() или if().

Как бы сказать помягче... Вы вообще понимаете о чём идёт речь? Вы когда-нибудь использовали в коде указанные в заголовке функции и пытались рассчитать в них часть массива, а не целиком? Так вот попробуйте, может тогда поймёте "наглядно" о чём речь. Ни for, ни if в данном случае ничем не помогут, ваше предложение актуально при расчёте баров или прочих ситуаций, где можно явно указать, сколько мне нужно считать, но никак не массива при помощи этих функций. Выше показана часть кода и она абсолютно идентичная, разница лишь в том, что в первом случае я считаю весь массив, а во втором только 300 его значений, но значения считаются в конце массива при том, что ссылки используются на начало. Может быть я неясно описываю ситуацию, но код поможет это посмотреть, если его приложить в какой-либо индикатор и сравнить получаемый результат...

PS О "самописном" варианте альтернативных аналогов функций понятно, но хотелось бы получить нужный результат средствами языка.

 
Sergey Efimenko:

Как бы сказать помягче... Вы вообще понимаете о чём идёт речь? Вы когда-нибудь использовали в коде указанные в заголовке функции и пытались рассчитать в них часть массива, а не целиком? Так вот попробуйте, может тогда поймёте "наглядно" о чём речь. Ни for, ни if в данном случае ничем не помогут, ваше предложение актуально при расчёте баров или прочих ситуаций, где можно явно указать, сколько мне нужно считать, но никак не массива при помощи этих функций. Выше показана часть кода и она абсолютно идентичная, разница лишь в том, что в первом случае я считаю весь массив, а во втором только 300 его значений, но значения считаются в конце массива при том, что ссылки используются на начало. Может быть я неясно описываю ситуацию, но код поможет это посмотреть, если его приложить в какой-либо индикатор и сравнить получаемый результат...

PS О "самописном" варианте альтернативных аналогов функций понятно, но хотелось бы получить нужный результат средствами языка.

Да говорите как есть, ничего страшного.

Значит я вас не правильно понял. 

 
Неужели никто не использует эти функции и не сталкивался с такой ситуацией?
 
Sergey Efimenko:

так работает нормально:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i);

так не работает нормально:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i); 

А что ты ожидаешь в результате и как должно работать нормально?
 
Alexey Viktorov:
А что ты ожидаешь в результате и как должно работать нормально?
В смысле что ожидаю? Я же написал выше, что мне нужны 300 последних (текущих) актуальных значений, а не 300 первых (начальных), при том, что я обращаюсь к массиву по смещению 299-0, а получаю данные по смещению от "конца массива" до "конца массива - 300" значений (в моём случае от 4999 до 4700), то есть по смещению 299 находится значение которое должно находиться по смещению 4999 и аналогично по смещению 0 находится значение, которое должно находится по смещению 4700. Актуально при сокращении количества расчёта массивов получать не начальные исторические данные, а текущие, спрашивается с какой целью идёт расчёт самых старых значений при том, что расчёт текущих не производится?
 
Sergey Efimenko:
В смысле что ожидаю? Я же написал, что мне нужны 300 последних (текущих) актуальных значений, а не 300 первых (начальных), при том, что я обращаюсь к массиву по смещению 300-0, а получаю данные по смещению от "конца массива" до "конца массива - 300" значений (в моём случае от 4999 до 4700), то есть по смещению 300 находится значение которое должно находиться по смещению 4999 и аналогично по смещению 0 находится значение, которое должно находится по смещению 4700. Актуально при сокращении количества расчёта массивов получать не начальные исторические данные, а текущие, спрашивается с какой целью идёт расчёт самых старых значений при том, что расчёт текущих не производится?

ArraySetAsSeries() помогает?

Сталкивался один раз с такой фигнёй - не победил, и бросил. Сделал без iMAOnArray()

 
Artyom Trishkin:

ArraySetAsSeries() помогает?

Сталкивался один раз с такой фигнёй - не победил, и бросил. Сделал без iMAOnArray()

В том и проблема, что массив изначально "серийный" буфер. Да и порядок следования получаемых значений нормальный, проблема возникает именно в ограничении количества расчётов, как уже писал, при использовании расчёта всего массива данные нормальные, но неприятно тормозят терминал при инициализации и ещё сильнее при использовании несколько индикаторов на разные ТФ, а уж об оптимизации эксперта на подобном индикаторе вообще промолчу, и насколько я могу понять проблема имеет внутренний характер МТ4, то есть получается, что выход только использовать собственный аналог указанных функций, а хотелось бы обойтись стандартными :(

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

Причина обращения: