Обсуждение статьи "Рецепты MQL5 - Создаем кольцевой буфер для быстрого расчета индикаторов в скользящем окне" - страница 4
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Отличная статья, человек умеет программировать!
Если бы только немецкий перевод не был таким ужасным!!!!!
Здравствуйте,
Большое спасибо за подсказку. Перевод был исправлен.
С наилучшими пожеланиями
Доброго времени суток, Vasiliy Sokolov!
Ваши индикаторы созданные при помощи кольцевого буфера показывают как то не внятно, походу метод ChangeValue не работает, или может я что-то не так понял?
Я видел это. Я проверил приведенные вами примеры. Они показывают ту же проблему, что и у меня, когда я имею дело с обновлением значений во время работы рынка. Проверьте предоставленный вами Stochastic. Добавление нового значения не является проблемой, но когда мы пытаемся использовать Stoch.ChangeLast() или OnChangeValue() в классе CRiMaxMin, это не работает. Он не изменяет значение соответствующим образом. Если бы вы могли проверить это или прислать пример рабочего кода, это было бы очень здорово.
Спасибо.
Отличная работа, большое спасибо автору. Возможно, ошибка, которую вы наблюдаете, Савио, находится здесь:
int RingBuffer::iToRealInd(int iIndex)
{
if(iIndex >= iNumElements() || iIndex < 0)
return iBufferSize-1; //previous bug was caused by no -1 here
...
Я добавил -1 в последнюю цитируемую строку; раньше его там не было, и он приводил к возврату неправильного индекса. Обратите внимание, что я изменил имена переменных/методов в соответствии со своим стилем программирования, но идея та же.
Отличная работа, большое спасибо автору. Возможно, ошибка, которую вы наблюдаете, Савио, находится здесь:
int RingBuffer::iToRealInd(int iIndex)
{
if(iIndex >= iNumElements() || iIndex < 0)
return iBufferSize-1; //previous bug was caused by no -1 here
...
Я добавил -1 в последнюю цитируемую строку; раньше его там не было, и он приводил к возврату неправильного индекса. Обратите внимание, что я изменил имена переменных/методов в соответствии со своим стилем программирования, но идея та же.
Я попробовал ваше исправление, но оно все еще не обновляется правильно. Кажется, что чего-то не хватает, и я не могу найти проблему при попытке запустить кольцевой буфер при формировании нового бара. Когда рынок работает, линии High/Low полностью перепутываются. Код работает очень хорошо и быстро при обработке старых данных, но с новыми данными, поступающими во время формирования нового бара, он просто не работает для меня.
Если позволите, такие замечания:
1. В классе void CRiMaxMin::OnChangeValue(int index, double del_value, double new_value),в методе " OnChangeValue" в строке
Картинка:
опечатка - знак "меньше или равно".

2.При поиске Min и Max элементов массива, если использовать именно как кольцевой буфер (когда новые элементы начинают писаться в начало массива), min и мах определяются неправильно. Минимум больше максимума. В одном массиве. Стандартными методами (ArrayMinimum и ArrayMaximum) все работает.
Картинка:
Где-то сбивается индексация. Починить сам не могу. Если кто починит, будет здорово. Проверочный советник прикрепил.
У Вас там ошибочка закралась в ToRealInd(int index).
Должно быть: