2014-12-01 2 views
1

Там, кажется, ошибка в расчете små в коде ниже ... может кто-то указать, где ..Simple Moving Average в PHP - Ошибка

/** * Простая скользящая средняя (сма) * *

Скользящее среднее - это индикатор, показывающий среднее значение цены цен в течение определенного периода времени. При вычислении скользящей средней производится математический анализ среднего значения безопасности в течение заданного периода времени. По мере изменения цены безопасности ее средняя цена движется вверх или вниз.

* *

Простая или средняя арифметическая скользящая средняя рассчитывается путем добавления цены закрытия ценной бумаги в течение ряда периодов времени (например, 12 дней), а затем деления этой суммы на количество периодов времени. Результатом является средняя цена за безопасность в течение периода времени. Простые скользящие средние дают равный вес каждой ежедневной цене.

* *

формула:

* * - SUM (Закрывает из п периодов)/п */

<?php 
$data = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); 

class sma 
{ 
/** 
* @var double[] 
*/ 
private $sma; 
/** 
* @param double[] $data 
* @param int $range 
* @return double[] 
*/ 
function get($data, $range) 
{ 
    $position = 0; 
    while (empty($data[ $position ])) { 
     $position++; 
    } 
    $i = $position; 
    while (true) { 
     if (empty($data[ $i + $range - 1 ])) { 
      break; 
     } 
     $temp_sum = 0; 
     for ($j = $i; $j < $i + $range; $j++) { 
      $temp_sum += $data[ $j ]; 
     } 
     $this->sma[ $i + $range - 1 ] = $temp_sum/$range; 
     $i++; 
    } 
    return $this->sma; 
} 
} 

$mysma = new sma(); 
$mysma->get($data,5); $sma = $mysma->get(); 
echo mysma; 

?> 

Также см расчета в другом коде, кажется, проще .. несколько примеров здесь .. если кто-то сделал это в php аналогично .. ??

(defn moving-average 
[coll n] 
(cond 
(< n 1) nil 
(= n 1) coll 
:else (let [sums (reductions + 0 coll)] 
      (map #(/ (- %1 %2) n) (drop n sums) sums)))) 

(time (doall (moving-average coll n))) 
# "Elapsed time: 9.184 msecs" 

Кроме того, это ..

double[] MovingAverage(int period, double[] source) 
{ 
    var ma = new double[source.Length]; 

    double sum = 0; 
    for (int bar = 0; bar < period; bar++) 
     sum += source[bar]; 

    ma[period - 1] = sum/period; 

    for (int bar = period; bar < source.Length; bar++) 
     ma[bar] = ma[bar - 1] + source[bar]/period 
           - source[bar - period]/period; 

    return ma; 
} 
+0

«Там, кажется, ошибка в вычислении små в код ниже "и ошибка? –

+0

диапазон должен быть меньше .. да 5, изменено .. ошибка есть нет выхода .. он переходит в цикл .. "" Предупреждение: Отсутствует аргумент 1 для sma :: get(), вызываемый в P: \ MOWES WAMP REL \ MOWES \ www \ sma.php в строке 51 и определен в P: \ MOWES WAMP REL \ MOWES \ www \ sma.php в строке 28 Внимание! Отсутствует аргумент 2 для sma :: get(), вызываемый в P: \ MOWES WAMP REL \ MOWES \ www \ sma.php в строке 51 и определен в P: \ MOWES WAMP REL \ MOWES \ www \ sma.php в строке 28 Неустранимая ошибка: Максимальное время выполнения 120 секунд превышено в P: \ MOWES WAMP REL \ MOWES \ www \ sma.php в строке 31 "" – Ajmal

+0

Вывод '[4 => 3,5 => 4,6 => 5 и т. Д.]', Когда вы удаляете '$ mysma- > get(); 'call и' var_dump ($ mysma-> get ($ data, 5); '. –

ответ

1

Вот перевод на основе последнего куска кода в вашем вопросе:

function get(array $data, $range) 
{ 
    $sum = array_sum(array_slice($data, 0, $range)); 

    $result = array($range - 1 => $sum/$range); 

    for ($i = $range, $n = count($data); $i != $n; ++$i) { 
     $result[$i] = $result[$i - 1] + ($data[$i] - $data[$i - $range])/$range; 
    } 

    return $result; 
}