Собственно сабж. Если мне не нужно считать весь массив, а нужны только последние N элементов.
Не совсем понимаю логику расчёта этих функций при ограничении. Есть массив таймсерия (один из буферов индикатора), если оставить количество элементов равное 0 вопросов нет, всё считается и получается, но при уменьшении количества элементов участвующих в расчётах по тем же смещениям я получаю только первичные. Проще говоря есть массив 5000 элементов (баров на графике), для экономии времени мне нужно посчитать только последние 300, но при указании во втором параметре значения 300 я получаю первичные 5000-4700 элементов, но по смещению 300-0, и далее значения при вызове не меняются. Какой смысл использования этого параметра?
Приведите пример кода, для полного понимания вопроса.
так работает нормально:
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);
так работает нормально:
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().
Как бы сказать помягче... Вы вообще понимаете о чём идёт речь? Вы когда-нибудь использовали в коде указанные в заголовке функции и пытались рассчитать в них часть массива, а не целиком? Так вот попробуйте, может тогда поймёте "наглядно" о чём речь. Ни for, ни if в данном случае ничем не помогут, ваше предложение актуально при расчёте баров или прочих ситуаций, где можно явно указать, сколько мне нужно считать, но никак не массива при помощи этих функций. Выше показана часть кода и она абсолютно идентичная, разница лишь в том, что в первом случае я считаю весь массив, а во втором только 300 его значений, но значения считаются в конце массива при том, что ссылки используются на начало. Может быть я неясно описываю ситуацию, но код поможет это посмотреть, если его приложить в какой-либо индикатор и сравнить получаемый результат...
PS О "самописном" варианте альтернативных аналогов функций понятно, но хотелось бы получить нужный результат средствами языка.
Как бы сказать помягче... Вы вообще понимаете о чём идёт речь? Вы когда-нибудь использовали в коде указанные в заголовке функции и пытались рассчитать в них часть массива, а не целиком? Так вот попробуйте, может тогда поймёте "наглядно" о чём речь. Ни for, ни if в данном случае ничем не помогут, ваше предложение актуально при расчёте баров или прочих ситуаций, где можно явно указать, сколько мне нужно считать, но никак не массива при помощи этих функций. Выше показана часть кода и она абсолютно идентичная, разница лишь в том, что в первом случае я считаю весь массив, а во втором только 300 его значений, но значения считаются в конце массива при том, что ссылки используются на начало. Может быть я неясно описываю ситуацию, но код поможет это посмотреть, если его приложить в какой-либо индикатор и сравнить получаемый результат...
PS О "самописном" варианте альтернативных аналогов функций понятно, но хотелось бы получить нужный результат средствами языка.
Да говорите как есть, ничего страшного.
Значит я вас не правильно понял.
так работает нормально:
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 последних (текущих) актуальных значений, а не 300 первых (начальных), при том, что я обращаюсь к массиву по смещению 300-0, а получаю данные по смещению от "конца массива" до "конца массива - 300" значений (в моём случае от 4999 до 4700), то есть по смещению 300 находится значение которое должно находиться по смещению 4999 и аналогично по смещению 0 находится значение, которое должно находится по смещению 4700. Актуально при сокращении количества расчёта массивов получать не начальные исторические данные, а текущие, спрашивается с какой целью идёт расчёт самых старых значений при том, что расчёт текущих не производится?
ArraySetAsSeries() помогает?
Сталкивался один раз с такой фигнёй - не победил, и бросил. Сделал без iMAOnArray()
ArraySetAsSeries() помогает?
Сталкивался один раз с такой фигнёй - не победил, и бросил. Сделал без iMAOnArray()
В том и проблема, что массив изначально "серийный" буфер. Да и порядок следования получаемых значений нормальный, проблема возникает именно в ограничении количества расчётов, как уже писал, при использовании расчёта всего массива данные нормальные, но неприятно тормозят терминал при инициализации и ещё сильнее при использовании несколько индикаторов на разные ТФ, а уж об оптимизации эксперта на подобном индикаторе вообще промолчу, и насколько я могу понять проблема имеет внутренний характер МТ4, то есть получается, что выход только использовать собственный аналог указанных функций, а хотелось бы обойтись стандартными :(
PS Для себя тоже использую собственный аналог iMAOnArray, но тут исходник будет не только у меня, хотя как вариант использование библиотек, да ещё и iBands нужен, со средней решаемо, а вот расчёт отклонений придётся написать. В общем жаль, что такая ситуация со стандартными функциями.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Собственно сабж. Если мне не нужно считать весь массив, а нужны только последние N элементов.
Не совсем понимаю логику расчёта этих функций при ограничении. Есть массив таймсерия (один из буферов индикатора), если оставить количество элементов равное 0 вопросов нет, всё считается и получается, но при уменьшении количества элементов участвующих в расчётах по тем же смещениям я получаю только первичные. Проще говоря есть массив 5000 элементов (баров на графике), для экономии времени мне нужно посчитать только последние 300, но при указании во втором параметре значения 300 я получаю первичные 5000-4700 элементов, но по смещению 300-0, и далее значения при вызове не меняются. Какой смысл использования этого параметра?