просьба подсказать где я накосячил?..
Без полного кода можно только предполагать. Так, если буфера индикатора - это BBMainBuffer, BBUpBuffer и BBDownBuffer, то при вызове iBandsOnArray всегда используется один и тот же индекс бара - 0. Зачем тогда цикл? Логичнее передать функции переменную цикла - i.
Без полного кода можно только предполагать. Так, если буфера индикатора - это BBMainBuffer, BBUpBuffer и BBDownBuffer, то при вызове iBandsOnArray всегда используется один и тот же индекс бара - 0. Зачем тогда цикл? Логичнее передать функции переменную цикла - i.
По поводу массива BB - знаю что лишний, т.к можно использовать основной буфер. Но у меня пока не получается заставить корректно работать функцию iBandsOnArray - не могу понять как shift работает. Поэтому перегоняю в небольшой массив и с 0-ым shiftom всегда возвращает корректные значения. Я грешу на rates_total - prev_calculated, т.к ощущение, что какой то бар пропускается просто.
Если хотите реальной помощи, то прикрепите полный код индикатора (файлом). Чтобы найти причину, недостаточно просто взгляда на индикатор. Нужно его запустить его и понять, что как и где рассчитывается. Кроме того, никто не будет дописывать более-менее очевидные вещи (объявление переменных и расстановку буферов), чтобы запустить у себя. Да и догадаться, что делает функция Summl вряд ли кто-то сможет. Поэтому нужен весь код.
Если хотите реальной помощи, то прикрепите полный код индикатора (файлом). Чтобы найти причину, недостаточно просто взгляда на индикатор. Нужно его запустить его и понять, что как и где рассчитывается. Кроме того, никто не будет дописывать более-менее очевидные вещи (объявление переменных и расстановку буферов), чтобы запустить у себя. Да и догадаться, что делает функция Summl вряд ли кто-то сможет. Поэтому нужен весь код.
Советник во вложении. Параметры:
Такую конструкцию советник нарисовал при открытии. Если нажать "ОК" в параметрах - то рисует то, что нужно.
Такую конструкцию советник нарисовал при открытии. Если нажать "ОК" в параметрах - то рисует то, что нужно.
Ага, понял, в чем дело. Нужно вот так сделать:
BBMainBuffer[i] = iBandsOnArray(BB, 0, BandsPeriod, BandsDeviation, 0, MODE_MAIN, 0); BBUpBuffer[i] = iBandsOnArray(BB, 0, BandsPeriod, BandsDeviation, 0, MODE_UPPER, 0); BBDownBuffer[i] = iBandsOnArray(BB, 0, BandsPeriod, BandsDeviation, 0, MODE_LOWER, 0);
Ага, понял, в чем дело. Нужно вот так сделать:
Да, спасибо большое! Похоже в этом дело. Все таки функции вида ХХХonArray для меня загадкой остаются. Работают без нареканий только если подать на вход массив размера точно такого, который нужен для вычислений. Хотя, судя по параметрам могут работать и на больших массивах с выбором диапазона для расчета значений.
В данном случае переписал так:
ArrayResize(BB, BandsPeriod);
ArrayResize(MaS, MaShortPeriod);
ArrayResize(MaL, MaShortPeriod + MaLongPeriodDelta);
if (i + Depth < rates_total) {
for (int a = i; a < i + Depth; a++){
int num = a - i;
double val = SummI(a);
if (num < BandsPeriod) BB[num] = val;
if (num < MaShortPeriod) MaS[num] = val;
if (num < MaShortPeriod + MaLongPeriodDelta) MaL[num] = val;
}
}
BBMainBuffer[i] = iBandsOnArray(BB, 0, BandsPeriod, BandsDeviation, 0, MODE_MAIN, 0);
BBUpBuffer[i] = iBandsOnArray(BB, 0, BandsPeriod, BandsDeviation, 0, MODE_UPPER, 0);
BBDownBuffer[i] = iBandsOnArray(BB, 0, BandsPeriod, BandsDeviation, 0, MODE_LOWER, 0);
MaShort[i] = iMAOnArray(MaS, 0, MaShortPeriod, 0, MODE_EMA, 0);
MaLong[i] = iMAOnArray(MaL, 0, MaShortPeriod + MaLongPeriodDelta, 0, MODE_EMA, 0);
На истории "волшебство" прекратилось. У правого края графика иногда наблюдаются странные скачки на период 1-2 секунды. Выглядят так:
Обновленную версию прикрепил к сообщению, буду благодарен, если есть мысли откуда они появляются.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день,
Когда запускаю индикатор - он работает норм.
Но через некоторое время - начинает рисовать горбы на том месте, где их недавно не было.
Скрины с периодичностью в 2 минуты с одного и того же графика. Никак не могу понять - где я накосячил. Вот основной код индикатора:
if (prev_calculated > 0) {
startI = rates_total - prev_calculated;
} else {
startI = rates_total - 1;
};
for (int i = startI; i >=0; i--)
{
SummBuffer[i] = SummI(i, fprice1, fprice2, fprice3);
BBMainBuffer[i] = 0;
BBUpBuffer[i] = 0;
BBDownBuffer[i] = 0;
MaShort[i] = 0;
MaLong[i] = 0;
double BB[];
ArrayResize(BB, Depth);
if (i + Depth < rates_total) {
for (int a = i; a < i + Depth; a++){
BB[a - i] = SummI(a, fprice1, fprice2, fprice3);
}
}
//if (i==0){
// for (int bz = 0; bz < BandsPeriod; bz++)
// {
// Alert(BB[bz]);
// }
// Alert(i);
//};
BBMainBuffer[i] = iBandsOnArray(BB, BandsPeriod, BandsPeriod, BandsDeviation, 0, MODE_MAIN, 0);
BBUpBuffer[i] = iBandsOnArray(BB, BandsPeriod, BandsPeriod, BandsDeviation, 0, MODE_UPPER, 0);
BBDownBuffer[i] = iBandsOnArray(BB, BandsPeriod, BandsPeriod, BandsDeviation, 0, MODE_LOWER, 0);
MaShort[i] = iMAOnArray(BB, MaShortPeriod, MaShortPeriod, 0, MODE_EMA, 0);
MaLong[i] = iMAOnArray(BB, MaShortPeriod + MaLongPeriodDelta, MaShortPeriod + MaLongPeriodDelta, 0, MODE_EMA, 0);
//Print(iTime(Symbol(), 0, i), " ", BBUpBuffer[i]);
}
просьба подсказать где я накосячил?..