Индикаторы: Лучший объем - страница 2

oomeysh #:
Я применил этот индикатор на mt5, но ничего не отображается... вверх
Зайдите в настройки входа индикатора и измените параметр - Type Of Volume Used с Real volume на Tick Volume.
Непонятно какой цвет показывает индикатор при бычьей или медвежьей свече все показывает одним цветом, желтый и зеленый цвет вообще непонятно что показывает.

Я ввел это в программу «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, и индикатор завершает работу с ошибкой«массив выходит за пределы диапазона». Исправление:

mql5

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. Данные с нулевым объемом вызывают ложные сигналы, а значение по умолчанию представляет собой ловушку.

  • По умолчанию используется 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 ? ... : ... было бы аккуратнее объединить в одну небольшую вспомогательную функцию.


    Прилагается версия, исправленная Клодом и переведённая на английский. (Нажмите «перейти к обсуждению», чтобы увидеть файл)
Файлы: