Обнаружил, что способ расчета DiPlus, DiMinus и, как следствие, ADX, не совпадает с описываемым тут а также со значениями из как минимум 2 программ теханализа (WLD, AlfaDirect). После моего фикса считает правильно.
Единственным исправлением было использование параметров по умолчанию у AverageTrueRange при расчете DiPart. (+удаление неиспользуемого DmTrueRange) Было:
protected DiPart()
{
_averageTrueRange = new AverageTrueRange(new ExponentialMovingAverage(), new DmTrueRange());
_movingAverage = new WilderMovingAverage();
}
Стало:
protected DiPart()
{
_averageTrueRange = new AverageTrueRange();
_movingAverage = new WilderMovingAverage();
}
в связи с чем у меня вопрос: Это вообще баг или расчет +-DI/ADX намеренно выполняется с использованием нестандартных параметров? Если это не баг, то каким образом коммитить фикс? Как отдельный индикатор?
Комментарии (1)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Мне самому нужна была формула для ADX, когда искал - нашел кучу вариаций, после чего написал в тех поддержку Альфы, они прислали мне код, правда он был не на C#, но смысл я понял.
Прикладываю класс индюка DiPart. Реализован не через Length indicator, а просто как класс. Полностью совпадает с альфой.
Получить Di+ можно свойством Dlpp, Di- свойством Dlmm.
Методом Process Добавляем готовую свечку(не через CandleIndicatorValue, а просто candle),
Также добавлен метод UpDate, чтобы индюк мог меняться внутри свечи(также добавляем туда candle). Также считает верно.