Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Хотя всё верно. Мне нужно было 2 повышающихся вершины, а это значит что счётчик будет не 3, а 2. Такой вариант работает. Тока если я уберу строку:
Из функции OnCalculate(), то индикатор сообщает ошибку времени выполнения:
Это ещё почему?
Я понимаю, что происходит выход за пределы массива. Но где, не понятно.
Виктор, выход за пределы массива происходит тогда, когда на графике 1000, например, баров и цикл строится от 0 до 1000, но нумеруются они от 0 до 999 и потом ты ещё проверяешь 2 или 3 бара на соответствие твоему условию. В старых билдах такие ошибки просто игнорировались, а теперь за этим надо следить. Хотя если убрать #property strict то тоже эта ошибка будет игнорироваться.
Посмотри эту реализацию
А почему ты не хочешь проверять полное соответствие условию на каждом баре? Тоесть, на каждом баре условие if(1 бар соответствует && 2 бар соответствует && 3 бар соответствует) ... условие выполнено рисуем стрелку...
Наверное как всегда хочешь универсальность, возможность изменять количество проверяемых баров... Ну можно построить цикл от i-того бара до i+n где и проверять соответствие условию...
Виктор, выход за пределы массива происходит тогда, когда на графике 1000, например, баров и цикл строится от 0 до 1000, но нумеруются они от 0 до 999 и потом ты ещё проверяешь 2 или 3 бара на соответствие твоему условию. В старых билдах такие ошибки просто игнорировались, а теперь за этим надо следить. Хотя если убрать #property strict то тоже эта ошибка будет игнорироваться.
Посмотри эту реализацию
Как я понял, выход за пределы массива возникает в самом начале работы индикаторе, а точнее в момент его запуска. Ведь когда limit = , скажем так 999 из всего 1000 имеющихся баров на графике, то
в момент когда сравниваются соседние бары на первой итерации цикла, то можно смело накинуть 2 бара в стороны 1000... выйдет 999 + 2. Это если мы по счётчику достигаем 2 бара, которые сравниваем. А если их, например, 100, то выход будет на 99 т.е. к 1099-му бару, которого нет в истории. Тут понятно.
А почему ты не хочешь проверять полное соответствие условию на каждом баре? Тоесть, на каждом баре условие if(1 бар соответствует && 2 бар соответствует && 3 бар соответствует) ... условие выполнено рисуем стрелку...
Алексей, у меня позиция такова, что индикатор нужен только в случае прибавки производительности работы системы в целом. Если пересчёт всех данных будет на каждом баре, то это не есть адекватно, на мой взгляд. Тоже самое можно рализовать в эксперте. Тогда какой резон вообще от индикатора?
Как я понимаю, назначение индикатора запоминать ситуацию на предыдущих барах (либо в буфер, либо в переменные), и досчитывать не обработанные бары. Но никак не пересчитывать всё...
Я понимаю, что, конечно, это не весь график, а лишь пересчёт на последней итерации в пределах от нулевого или первого бара до limit, но всё же..
Наверное как всегда хочешь универсальность, возможность изменять количество проверяемых баров... Ну можно построить цикл от i-того бара до i+n где и проверять соответствие условию...
Да, в данном методе нужно только один входной параметр.. кол-во проеряемых баров. Больше ничего. Это ж вполне очевидно.
shanty:
Как я понял, выход за пределы массива возникает в самом начале работы индикаторе, а точнее в момент его запуска. Ведь когда limit = , скажем так 999 из всего 1000 имеющихся баров на графике, то
в момент когда сравниваются соседние бары на первой итерации цикла, то можно смело накинуть 2 бара в стороны 1000... выйдет 999 + 2. Это если мы по счётчику достигаем 2 бара, которые сравниваем. А если их, например, 100, то выход будет на 99 т.е. к 1099-му бару, которого нет в истории. Тут понятно.
Я не совсем уверен, но возможно проверяется весь массив и не запускается. Возможно сначала нормально рассчитывает, а потом когда появляется ошибка индикатор выгружается и соответственно не оставляет на графике ничего.
Так зачем такой пример где 1000 и 100? Достаточно того, что на графике 1000 баров... Проверяем на 0... соответственно надо посчитать 1 и 2 бары... А когда дошли до 998 надо проверить 999 и 1000 а его уже нет. Соответственно если брать в расчёт 3 бара ошибка выскочит уже на 997м баре.
Алексей, у меня позиция такова, что индикатор нужен только в случае прибавки производительности работы системы в целом. Если пересчёт всех данных будет на каждом баре, то это не есть адекватно, на мой взгляд. Тоже самое можно рализовать в эксперте. Тогда какой резон вообще от индикатора?
Как я понимаю, назначение индикатора запоминать ситуацию на предыдущих барах (либо в буфер, либо в переменные), и досчитывать не обработанные бары. Но никак не пересчитывать всё...
Я понимаю, что, конечно, это не весь график, а лишь пересчёт на последней итерации в пределах от нулевого или первого бара до limit, но всё же..
Наверное ты не так понял... Пересчёт на каждом баре не означает пересчёт всей истории. Вся история пересчитывается 1 раз при запуске индикатора, а дальше только нулевой...
shanty:
Да, в данном методе нужно только один входной параметр.. кол-во проеряемых баров. Больше ничего. Это ж вполне очевидно.Так именно это я и предложил последним предложением
Вот и получается, что в зависимости от n начало будет от n-ного с конца бара... если баров 1000, то начинаем от 997-го, проверяем 998 и 999. На следующем 997 и 998 и т.д. на нулевом первый и второй...
Я не совсем уверен, но возможно проверяется весь массив и незапускается. Возможно сначала нормально рассчитывает, а потом когдапоявляется ошибка индикатор выгружается и соответственно не оставляет награфике ничего.
Так зачем такой пример где 1000 и 100? Достаточно того,что на графике 1000 баров... Проверяем на 0... соответственно надопосчитать 1 и 2 бары... А когда дошли до 998 надо проверить 999 и 1000 аего уже нет. Соответственно если брать в расчёт 3 бара ошибка выскочитуже на 997м баре.
Наверное ты не так понял... Пересчёт на каждом баре не означает пересчёт всей истории. Вся история пересчитывается 1 раз при запуске индикатора, а дальше только нулевой...
Алексей, возможно я объяснил не совсем доходчиво, что думаю, либо Вы меня не верно поняли. Суть вот в чём:
Я прекрасно понимаю, что пересчёт данных всей истории не происходит на каждом баре. Для того и придуман limit. Вопрос в другом. Возьмём на примере Вашего кода:
В поле:
Мы производим расчёты на барах, которые не просчитаны. Тут всё очевидно. А вот в поле:
Происходит пересчёт "состояния" на всех барах, которых ровно столько сколько в вводном параметре n. Вообще странно, что на барах, которые расчитываются нужно расчитывать все бары n. Я же предложил другой вариант. При проходе по истории, ровно как и при расчётах баров, которые не досчитаны расчитывать не всех n баров, а лишь последний. Понимаете?
Т.е. теоритически, будет так:
1-ый расчёт, сравниваем текущий бар с индексов [i] с предыдущим [i+1]. Добавили к счётчику 1.
2-ой расчёт, сдвинулись в историю на 1. Сравниваем снова бары [i] и [i+1]. Добавили к счётчику 1.
3-ий расчёт, сдвинулись в историю на 1. Сравниваем снова бары [i] и [i+1]. Добавили к счётчику 1.
Если на каком-то расчёте не соблюдается условие, то счётчик обнуляем и начинается на следующем расчёте всё с начала.
Но такой вариант не работает вообще адекватно. Стрелки рисуются не там где нужно. Почему?
Ну так в твоём примере примерно то-же самое. Посмотри комментарии в коде.
Т.е. теоритически, будет так:
1-ый расчёт, сравниваем текущий бар с индексов [i] с предыдущим [i+1]. Добавили к счётчику 1.
2-ой расчёт, сдвинулись в историю на 1. Сравниваем снова бары [i] и [i+1]. Добавили к счётчику 1.
3-ий расчёт, сдвинулись в историю на 1. Сравниваем снова бары [i] и [i+1]. Добавили к счётчику 1.
Если на каком-то расчёте не соблюдается условие, то счётчик обнуляем и начинается на следующем расчёте всё с начала.
Но такой вариант не работает вообще адекватно. Стрелки рисуются не там где нужно. Почему?
А в принципе и такой метод должен работать. Только надо вовремя обнулить счётчик.
А ещё... не получается-ли у тебя так, что на трёх тиках проверяется одна пара баров и рисует стрелку где попало? Для такого индикатора надо сделать пересчёт только один раз на баре.
Всё-то, конечно, хорошо, но, на данный момент, вопрос не решён. Написал без каких-либо классов, самым обычным способом:
Что не так? Индикатор в пару строк...
Ещё раз повторю. Задача такая: нужно нарисовать стрелку вверх, если хаи баров повышаются на fi_CountCamparedBars баров, и стрелку вниз, если хай баров понижаются на протяжении fi_CountCamparedBars баров.
Не совсем. Вот переделка с вариантом, который предложен Вами:
Если параметр вводной переменной равен 3, то индюк работает корректно. А если ставлю 2, то выход за пределы массива. Не понятно как такое может быть!
Пишет, что мол: