Обнаружил, что способ расчета 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 намеренно выполняется с использованием нестандартных параметров? Если это не баг, то каким образом коммитить фикс? Как отдельный индикатор?
Comments (1)
Login or Create account, Log in or register to leave a comment
Мне самому нужна была формула для ADX, когда искал - нашел кучу вариаций, после чего написал в тех поддержку Альфы, они прислали мне код, правда он был не на C#, но смысл я понял.
Прикладываю класс индюка DiPart. Реализован не через Length indicator, а просто как класс. Полностью совпадает с альфой.
Получить Di+ можно свойством Dlpp, Di- свойством Dlmm.
Методом Process Добавляем готовую свечку(не через CandleIndicatorValue, а просто candle),
Также добавлен метод UpDate, чтобы индюк мог меняться внутри свечи(также добавляем туда candle). Также считает верно.