Как использовать trader_bbands в php?

Возникла необходимость посчиать значение линий Боллинджера на php
Есть vds на Ubuntu, там устанволена php7.2
установил расширение Trader для php и добавил расширение в php.ini
Результатом выполенения функции trader_bbands является три массива, которые являются вычисленными значениями линий Боллинджера
Проблема в том что значения во всех трех массивах одинаковые, в чем может быть проблема?
входной массив:
$arValues = [
  0 => 0.0017875
  1 => 0.001791
  2 => 0.0017904
  3 => 0.0017912
  4 => 0.001783
  5 => 0.0017821
  6 => 0.0017821
  7 => 0.001783
  8 => 0.0017888
  9 => 0.0017871
  10 => 0.0017877
  11 => 0.0017883
  12 => 0.0017869
  13 => 0.001783
  14 => 0.0017866
  15 => 0.0017879
  16 => 0.0017911
  17 => 0.0017936
  18 => 0.0017896
  19 => 0.0017902
  20 => 0.0017839
  21 => 0.0017818
  22 => 0.0017835
  23 => 0.0017836
  24 => 0.0017831
  25 => 0.0017832
  26 => 0.0017812
  27 => 0.0017816
  28 => 0.0017819
  29 => 0.0017803
]


вызов функции:
$bol = trader_bbands($arValues, 30, 2.0, 2.0);
Результат:
$bol = [
  0 => [
    29 => 0.0017858
  ]
  1 => [
    29 => 0.0017858
  ]
  2 => [
    29 => 0.0017858
  ]
]
  • Вопрос задан
  • 142 просмотра
Пригласить эксперта
Ответы на вопрос 2
leni_m
@leni_m
ЧупаКобрус
если вам фукнция возвращает не то, значит в ней и проблема.
Ответ написан
Комментировать
@indimions
Ваша проблема в том, что в данной функции неправильно работает расчет стандартного отклонения
формула StdDev = SQRT (SUM ((CLOSE — SMA (CLOSE, N))^2, N)/N),
так вот почему то CLOSE с значениями 0.0017812 , 0.00017812 и т.д. именно данная функция округляет до нуля, хотя в данной библиотеке все стальные работают нормально.

Поэтому нужно написать данный индикатор самому
Полосы Боллинджера представляют собой три линии:
1. Средняя линия ML (обычное скользящее среднее) рассчитывается по формуле:
ML = SUM (CLOSE, N) / N = SMA (CLOSE, N),
где:
— SUM (…, N) — сумма за N периодов;
— CLOSE — цена закрытия;
— N — количество периодов, используемых для расчета;
— SMA — простая скользящая средняя.
2. Верхняя линия TL (средняя линия ML, смещенная вверх на определенное число D стандартных отклонений StdDev) рассчитывается по формуле:
TL = ML + (D * StdDev),
3. Нижняя линия BL (средняя линия ML, смещенная вниз на число стандартных D отклонений StdDev) рассчитывается по формуле:
BL = ML — (D * StdDev).
StdDev – стандартное отклонение рассчитывается как:
StdDev = SQRT (SUM ((CLOSE — SMA (CLOSE, N))^2, N)/N),
где SQRT — квадратный корень.

код на php
$arValues = [
    0.0017875,
  0.001791,
  0.0017904,
  0.0017912,
  0.001783,
  0.0017821,
  0.0017821,
  0.001783,
  0.0017888,
  0.0017871,
  0.0017877,
  0.0017883,
  0.0017869,
  0.001783,
  0.0017866,
  0.0017879,
  0.0017911,
  0.0017936,
  0.0017896,
  0.0017902,
  0.0017839,
  0.0017818,
  0.0017835,
  0.0017836,
  0.0017831,
  0.0017832,
  0.0017812,
  0.0017816,
  0.0017819,
  0.0017803
];

   function standard_deviation(array $a, $sample = false)
    {
        $n = count($a);
        if ($n === 0) {
            trigger_error("The array has zero elements", E_USER_WARNING);

            return false;
        }
        if ($sample && $n === 1) {
            trigger_error("The array has only 1 element", E_USER_WARNING);

            return false;
        }

        $mean = array_sum($a) / $n;
        $carry = 0.0;
        foreach ($a as $val) {
            $d = ((double) $val) - $mean;
            $carry += $d * $d;
        };
        if ($sample) {
            --$n;
        }

        return sqrt($carry / $n);
    }

 function trader_stddev($data, $period) {
        $stds = [];
        $current = [];

        foreach ($data as $i => $close) {
            $current[] = $close;
            if ($i < $period) {
                $stds[$i] = false;
            } else {
                $stds[$i] = TechnicalAnalysis::standard_deviation($current);
                array_shift($current);
            }
        }
        return $stds;
    }


  function  mytraderBbands ($array_rates, $time_period, $upper_deviation_multiplier, $lower_deviation_multiplier,$ma_type = null) {
        $trader_sma = trader_sma($array_rates, $time_period);
        $StdDev = trader_stddev ($array_rates,$time_period);

        $bb_up = end($trader_sma ) +
            ($upper_deviation_multiplier * end($StdDev));
        $bb_down = end($trader_sma ) -
            ($lower_deviation_multiplier * end($StdDev));
        return [$bb_up, $trader_sma, $bb_down];
    }

$bb =    mytraderBbands ($arValues, 20, 2, 2);
print_r ($bb );


функция trader_sma - это стандартная функция данной библиотеки

пс: Смотрю, прям ответами люди помогают, а главное подробно и конструктивно.

ПСПС: увидел почему разработчики решили не работать с числами с тысячными, при таких цифрах стандарная формула отклонения выдает немного не точный результат и чем больше нулей после запятой тем более он неточный. Но все равно, с приведенным мной кодом, вполне можно работать, неточность минимальная.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
от 300 000 до 500 000 ₽
07 мая 2024, в 23:46
3000 руб./за проект
07 мая 2024, в 23:32
1200 руб./в час
07 мая 2024, в 23:27
1000 руб./за проект