Пользовательские индикаторы > ФИЛЬТР КАЛМАНА!

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
Аватара пользователя
Den
Сообщения: 377
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 17 раз
Поблагодарили: 5 раз

Re: ФИЛЬТР КАЛМАНА!

Непрочитанное сообщение Den » 28 ноя 2024, 03:12

ensh писал(а):
Den писал(а):Изменения в kalmanEstimate и kalmanErrorCovariance не включены: Код, связанный с фильтром Калмана, пока не включен, чтобы сначала убедиться, что индикатор отображает правильно значения HMA. После этого можно будет добавить и отладить код Калмана, чтобы улучшить сглаживание данных.

только вот проблема - компилятор не выдает вообще никакого сообщения при компилировании. :D

и не должен) сборка в папочке появилась - все норм


в общем получилось, что фильтр Калмана не всегда применим.

на скринах изначальный индикатор, к которому применен фильтр и тот же индикатор после применения фильтра.

В общем фильтр Калмана в текущей реализации для устранения шума при поиске экстремумов не годится
Вложения
Image 79.png
Image 77.png

Аватара пользователя
Den
Сообщения: 377
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 17 раз
Поблагодарили: 5 раз

Re: ФИЛЬТР КАЛМАНА!

Непрочитанное сообщение Den » 28 ноя 2024, 03:19

сам код

Код: Выделить всё

function Initialize() {
    // Установка имени индикатора
    IndicatorName = "KALMAN";

    // Добавление входного параметра типа свечи
    AddInput("Input", Inputs.Candle);   

    // Установка индикатора в область графика цены
    PriceStudy = true;   

    // Добавление серий для отображения на графике
    AddSeries("H", DrawAs.Custom, Color.Coral);   
    AddSeries("L", DrawAs.Custom, Color.LightGreen);
    AddSeries("D", DrawAs.Custom, Color.HotPink);  // Добавление серии D для визуальных маркеров

    // Добавление параметров и глобальных переменных
    AddParameter("P2", 0.21, "", 1);
    AddGlobalVariable("CurrentPosition", Types.Int, 0);

    // Инициализация переменных фильтра Калмана через AddGlobalVariable
    AddGlobalVariable("kalmanEstimateHigh", Types.Double, 0.0);
    AddGlobalVariable("kalmanErrorCovarianceHigh", Types.Double, 1.0);
    AddGlobalVariable("kalmanEstimateLow", Types.Double, 0.0);
    AddGlobalVariable("kalmanErrorCovarianceLow", Types.Double, 1.0);
    AddGlobalVariable("processNoise", Types.Double, 0.01);
    AddGlobalVariable("measurementNoise", Types.Double, 1.0);
}

function Evaluate() {
    // Получение глобальных переменных фильтра Калмана
    kalmanErrorCovarianceHigh += processNoise;
    var kalmanGainHigh = kalmanErrorCovarianceHigh / (kalmanErrorCovarianceHigh + measurementNoise);
    kalmanEstimateHigh = kalmanEstimateHigh + kalmanGainHigh * (Input.High[0] - kalmanEstimateHigh);
    kalmanErrorCovarianceHigh = (1 - kalmanGainHigh) * kalmanErrorCovarianceHigh;
    var smoothedHigh = kalmanEstimateHigh;

    // Визуальный маркер для сглаженного High
    H[0] = smoothedHigh;

    // Логика фильтра Калмана для сглаживания Low
    kalmanErrorCovarianceLow += processNoise;
    var kalmanGainLow = kalmanErrorCovarianceLow / (kalmanErrorCovarianceLow + measurementNoise);
    kalmanEstimateLow = kalmanEstimateLow + kalmanGainLow * (Input.Low[0] - kalmanEstimateLow);
    kalmanErrorCovarianceLow = (1 - kalmanGainLow) * kalmanErrorCovarianceLow;
    var smoothedLow = kalmanEstimateLow;

    // Визуальный маркер для сглаженного Low
    L[0] = smoothedLow;

    // Сравнение значений индикаторов для поиска экстремумов
    var isHighExtremum = (Input.High[0] > Input.High[1] && Input.High[1] > Input.High[2]);
    var isLowExtremum = (Input.Low[0] < Input.Low[1] && Input.Low[1] < Input.Low[2]);

    if (MY.индикатор(Input, P2).GetValue("W", 0) == MY.индикатор(Input).GetValue("H", 0) && isHighExtremum) {
        // Отрисовываем только, если это локальный максимум
        H.DrawVertical(Color.OrangeRed, LineStyles.Dot, 1);
        D[0] = smoothedHigh;
    }

    if (MY.индикатор(Input, P2).GetValue("W", 0) == MY.индикатор(Input).GetValue("L", 0) && isLowExtremum) {
        // Отрисовываем только, если это локальный минимум
        L.DrawVertical(Color.Aqua, LineStyles.Dot, 1);
        D[0] = smoothedLow;
    }
}




Вернуться в «Пользовательские индикаторы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя