Спрошу тогда по другому Как для индикатора, безопасно и без лагов графика, пересчитывать все бары в истории на каждом тике и по типу первый старт Т.е. при первом старте пересчитываются все бары в истории и далее добавляется новый бар, вот и нужно постоянно пересчитывать все бары в истории
Так ведь на подобной логике и работают почти все индикаторы. Код, показанный Вами, именно это и делает. Проблема, скорее всего, в том, что все это перенесено в OnTimer, для которого IndicatorCounted() некорректно работает. В таком случае нужно просто повторить логику IndicatorCounted своими силами, запоминая количество посчитанных баров на последней итерации:
int g_nPrevCalculated = 0;
voidOnTimer()
{
int counted_bars = g_nPrevCalculated;
...
g_nPrevCalculated = iBars(NULL, PERIOD_CURRENT);
}
У меня закачена история с 1999 года Есть какой нибудь быстрый цикл баров истории с ограничением отображения по дате а не по барам ? У индикатора отображать объекты на графике не по всей истории а с определённой даты, например с начала 2020 года
Или может есть быстрый цикл по всей истории но чтоб не тормозил график ?
Такой цикл не подходит, тяжело тащит
В прошлую пятницу меня попросили решить эту проблему. Времени в субботу и воскресенье не было, сделал во вторник, или в среду - не помню.
Просто, не отображайте индикатор на всей истории, ограничьте глубину ретроспективы. Это не просто, а очень просто. У меня так:
int i=0, j=0, LastBottomBar=0, LastTopBar=0,
History=Bars-1, BarsLost=History-IndicatorCounted();
if( BarsLost<History ){
if( BarsLost<1 ) return(0); // Не повторять на том-же баре
i=BarsLost+RightWing2; // Число баров пересчета
}
else i=History-LeftWing1; // Просмотр на всей историиif( LastBottomTime > 0 ) LastBottomBar=iBarShift(NULL,0,LastBottomTime);
if( LastTopTime > 0 ) LastTopBar =iBarShift(NULL,0,LastTopTime);
if( BarsLimit > 0 && i > BarsLimit ) i=BarsLimit;
Лучше бы Вы выложили код индикатора, и тогда можно было бы что-то посоветовать конкретное.
Общая рекомендация делать код без дополнительных циклов, а дальше уже нужно смотреть, где у Вас "тяжёлые" расчёты.
То, что Вы спрашиваете про основной цикл по всем барам, это нужная часть кода, чтобы сделать расчёты на всей истории. И этот цикл не займёт особого времени на любом временном интервале.
Это работает так. При первом запуске индикатора IndicatorCounted() вернёт 0 баров, и цикл пройдёт по всем барам истории допустим 2000 баров.
Затем на следующем тике IndicatorCounted() вернёт число 2000, и основной цикл уже будет считать только последние два бара.
if (counted_bars>0) counted_bars--;
если 2000>0 тогда 2000-1=1999
limit = MathMin(Bars-counted_bars,Bars-1);
лимит будет равен 2000-1999=1.
for(i=limit; i>=0; i--)
цикл от 1 до 0.
И цикл при каждом последующем тике пересчитывает всего один предыдущий и один текущий бар.
Вот и всё, цикл ничего не весит. А все тормоза у Вас скорее всего в коде внутри этого цикла, но мы этот код не видим.
И главная причина непонимания на форуме: нужно говорить о том, что Вы хотите получить, а не то почему не работает, то что Вы делаете? Никто ведь не знает, какие идеи у Вас в голове. И возможно есть более простые решения этого вопроса.
Если смотреть на тот кусок, который Вы показали, возникает много вопросов:
- функция start() не используется в индикаторах, вместо неё используется OnCalculate,
- зачем использовать OnTimer, когда для приёма тиков предназначен OnCalculate,
- зачем Вы используете странную конструкцию if (counted_bars==0) {limit--; limit-=10;} else limit++;
Лучше скажите, что Вы хотите получить и выложите весь код полностью. Тогда есть шанс на быструю помощь, без 20 страниц пустых разговоров.
Пытаюсь ответить на пост - мне под курсор засовывают предложение скачать МТ5 (скачал уже 5 раз, кому от этого полегчало?). Пытаюсь раскрасить кусок кода - раскрашивается кусок текста сообщения.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Спрошу тогда по другому
Как для индикатора, безопасно и без лагов графика, пересчитывать все бары в истории на каждом тике и по типу первый старт
Т.е. при первом старте пересчитываются все бары в истории и далее добавляется новый бар, вот и нужно постоянно пересчитывать все бары в истории
Так ведь на подобной логике и работают почти все индикаторы. Код, показанный Вами, именно это и делает. Проблема, скорее всего, в том, что все это перенесено в OnTimer, для которого IndicatorCounted() некорректно работает. В таком случае нужно просто повторить логику IndicatorCounted своими силами, запоминая количество посчитанных баров на последней итерации:
У меня закачена история с 1999 года
Есть какой нибудь быстрый цикл баров истории с ограничением отображения по дате а не по барам ?
У индикатора отображать объекты на графике не по всей истории а с определённой даты, например с начала 2020 года
Или может есть быстрый цикл по всей истории но чтоб не тормозил график ?
Такой цикл не подходит, тяжело тащит
В прошлую пятницу меня попросили решить эту проблему. Времени в субботу и воскресенье не было, сделал во вторник, или в среду - не помню.
Просто, не отображайте индикатор на всей истории, ограничьте глубину ретроспективы. Это не просто, а очень просто. У меня так:
Я не совсем понимаю Ваш вопрос.
Лучше бы Вы выложили код индикатора, и тогда можно было бы что-то посоветовать конкретное.
Общая рекомендация делать код без дополнительных циклов, а дальше уже нужно смотреть, где у Вас "тяжёлые" расчёты.
То, что Вы спрашиваете про основной цикл по всем барам, это нужная часть кода, чтобы сделать расчёты на всей истории. И этот цикл не займёт особого времени на любом временном интервале.
Это работает так. При первом запуске индикатора IndicatorCounted() вернёт 0 баров, и цикл пройдёт по всем барам истории допустим 2000 баров.
Затем на следующем тике IndicatorCounted() вернёт число 2000, и основной цикл уже будет считать только последние два бара.
если 2000>0 тогда 2000-1=1999
лимит будет равен 2000-1999=1.
цикл от 1 до 0.
И цикл при каждом последующем тике пересчитывает всего один предыдущий и один текущий бар.
Вот и всё, цикл ничего не весит. А все тормоза у Вас скорее всего в коде внутри этого цикла, но мы этот код не видим.
И главная причина непонимания на форуме: нужно говорить о том, что Вы хотите получить, а не то почему не работает, то что Вы делаете? Никто ведь не знает, какие идеи у Вас в голове. И возможно есть более простые решения этого вопроса.
Если смотреть на тот кусок, который Вы показали, возникает много вопросов:
- функция start() не используется в индикаторах, вместо неё используется OnCalculate,
- зачем использовать OnTimer, когда для приёма тиков предназначен OnCalculate,
- зачем Вы используете странную конструкцию if (counted_bars==0) {limit--; limit-=10;} else limit++;
Лучше скажите, что Вы хотите получить и выложите весь код полностью. Тогда есть шанс на быструю помощь, без 20 страниц пустых разговоров.
ЗЫ Жутко работает форум.
Пытаюсь ответить на пост - мне под курсор засовывают предложение скачать МТ5 (скачал уже 5 раз, кому от этого полегчало?). Пытаюсь раскрасить кусок кода - раскрашивается кусок текста сообщения.
Спасибо добрые люди за помощь!!
По моим требованиям мне больше подходит такое решение, работает чисто, без лагов :
Подскажите пожалуйста что значит отмеченное и что ожидается если >0