Непонятно какой цвет показывает индикатор при бычьей или медвежьей свече все показывает одним цветом, желтый и зеленый цвет вообще непонятно что показывает.
Я ввел это в программу «Claude Sonnet 5.5», и она выдала следующее:
Что хорошо
Расположение буферов правильное: 3 буфера для 2 графиков (данные гистограммы + цветовой индекс, плюс линия скользящего среднего).
Список цветов соответствует классической палитре Better Volume. Индексы от 0 до 5 совпадают с комментариями.
Проверки равенства, такие как IntTimesRange == IntMaxTimesRange, в данном случае безопасны. Максимум окна вычисляется с помощью идентичного выражения, поэтому значения типа double точно совпадают, когда текущий бар является максимальным.
Пересчёт по формуле «prev_calculated - 1» корректно обновляет формирующийся бар.
Ошибки, начиная с самых серьезных
1. Сбой из-за выхода за пределы диапазона при короткой истории (строки 63–69). Ограничение ` ` фиксируется только при первом вызове. Допустим, недельный или месячный график содержит 50 баров, а `minbars` равен 100. При первом вызове цикл пропускается, и возвращается значение rates_total. На следующем тике prev_calculated равно 50, поэтому предел составляет 49. Затем цикл скользящей средней интерпретирует n = -1, и индикатор завершает работу с ошибкой«массив выходит за пределы диапазона». Исправление:
2. Сигнал «Climax Churn» (маджента) теряется на медвежьих барах (строки 116–121). Блок «Climax Sell» запускается после «Climax Churn» и перезаписывает его. Таким образом, бар, являющийся одновременно пиком по объему и диапазону и баром «churn», отображается пурпурным цветом только в том случае, если он закрылся выше средней точки. Если он закрылся ниже, он отображается обычным белым цветом. Предполагаемый приоритет заключается в том, что «climax churn» имеет преимущество перед всем остальным.
3. «Дополнительная проверка волатильности» никогда не срабатывает (строки 123–125). IntCandleRange > IntMiddlePrice * 2 расшифровывается как high - low > high + low, что верно только в том случае, если low < 0. Для любого обычного инструмента это условие является мёртвым кодом. Вероятно, задумывалось сравнение со средним диапазоном или чем-то подобным, поэтому требуется не просто исправление, а переопределение.
4. Жестко заданное значение 20 игнорирует InpLookBack (строка 105). Всё остальное использует InpLookBack, но проверка на низкий объём использует i - 19, 20. Любое значение, отличное от 20, приводит к несогласованности классов. Если InpLookBack установлено выше 20, обнаружение низкого объёма по-прежнему учитывает только 20 баров.
5. Данные с нулевым объемом вызывают ложные сигналы, а значение по умолчанию представляет собой ловушку.
По умолчанию используется VOLUME_REAL, что для большинства валютных и CFD-символов равно 0.
При объёме, состоящем исключительно из нулей, выполняются условия IntTimesRange (0) == IntMaxTimesRange (0) и IntDividedRange (0) == IntMaxDividedRange (0). График заполняется цветами, характерными для фаз кульминации и коллебаний после кульминации.
Обеспечьте, чтобы флаги были не меньше 0, а значением по умолчанию был VOLUME_TICK.
6. Отсутствует проверка входных данных в OnInit. InpMAPeriod <= 0 приводит к делению на ноль. InpLookBack <= 0 нарушает логику работы окна. В таких случаях следует возвращать INIT_PARAMETERS_INCORRECT.
Мелкие замечания
NormalizeDouble(..., 0) округляет скользящее среднее (MA) до целого числа, что искажает линию на символах с низким объемом. В этом нет необходимости.
Бары, предшествующие minbars, никогда не записываются, и PLOT_DRAW_BEGIN не установлен. Установите его и инициализируйте буферы, чтобы ранние бары не отображали мусор.
Скользящая средняя может начинаться с MAPeriod - 1, а не с MAPeriod. Использование скользящей суммы вместо повторного суммирования 100 баров за каждый бар также ускорит работу.
Повторяющиеся тернарные операторы InpVolumeType == VOLUME_TICK ? ... : ... было бы аккуратнее объединить в одну небольшую вспомогательную функцию.
Прилагается версия, исправленная Клодом и переведённая на английский. (Нажмите «перейти к обсуждению», чтобы увидеть файл)
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Я применил этот индикатор на mt5, но ничего не отображается... вверх
Я ввел это в программу «Claude Sonnet 5.5», и она выдала следующее:
Что хорошо
Ошибки, начиная с самых серьезных
1. Сбой из-за выхода за пределы диапазона при короткой истории (строки 63–69). Ограничение `
` фиксируется только при первом вызове. Допустим, недельный или месячный график содержит 50 баров, а `minbars` равен 100. При первом вызове цикл пропускается, и возвращается значение rates_total. На следующем тике prev_calculated равно 50, поэтому предел составляет 49. Затем цикл скользящей средней интерпретирует n = -1, и индикатор завершает работу с ошибкой«массив выходит за пределы диапазона». Исправление:
if(rates_total <= minbars) return(0); limit = (prev_calculated == 0) ? minbars : MathMax(prev_calculated - 1, minbars);
2. Сигнал «Climax Churn» (маджента) теряется на медвежьих барах (строки 116–121).
Блок «Climax Sell» запускается после «Climax Churn» и перезаписывает его. Таким образом, бар, являющийся одновременно пиком по объему и диапазону и баром «churn», отображается пурпурным цветом только в том случае, если он закрылся выше средней точки. Если он закрылся ниже, он отображается обычным белым цветом. Предполагаемый приоритет заключается в том, что «climax churn» имеет преимущество перед всем остальным.
3. «Дополнительная проверка волатильности» никогда не срабатывает (строки 123–125).
IntCandleRange > IntMiddlePrice * 2 расшифровывается как high - low > high + low, что верно только в том случае, если low < 0. Для любого обычного инструмента это условие является мёртвым кодом. Вероятно, задумывалось сравнение со средним диапазоном или чем-то подобным, поэтому требуется не просто исправление, а переопределение.
4. Жестко заданное значение 20 игнорирует InpLookBack (строка 105).
Всё остальное использует InpLookBack, но проверка на низкий объём использует i - 19, 20. Любое значение, отличное от 20, приводит к несогласованности классов. Если InpLookBack установлено выше 20, обнаружение низкого объёма по-прежнему учитывает только 20 баров.
5. Данные с нулевым объемом вызывают ложные сигналы, а значение по умолчанию представляет собой ловушку.
6. Отсутствует проверка входных данных в OnInit.
InpMAPeriod <= 0 приводит к делению на ноль. InpLookBack <= 0 нарушает логику работы окна. В таких случаях следует возвращать INIT_PARAMETERS_INCORRECT.
Мелкие замечания
Прилагается версия, исправленная Клодом и переведённая на английский. (Нажмите «перейти к обсуждению», чтобы увидеть файл)