i want to transfer a pine-script linreg function to php, and i need some help which values are exactly passed to the linreg function.
i.e. my linreg function in pine-script looks like this:
linreg(close, 20, 0)
for calculating the linear regression in php, i have the following function:
public static function linear_regression($x, $y) {
// calculate number points
$n = count($x);
// ensure both arrays of points are the same size
if ($n != count($y)) {
trigger_error("linear_regression(): Number of elements in coordinate arrays do not match.", E_USER_ERROR);
}
// calculate sums
$x_sum = array_sum($x);
$y_sum = array_sum($y);
$xx_sum = 0;
$xy_sum = 0;
for($i = 0; $i < $n; $i++) {
$xy_sum+=($x[$i]*$y[$i]);
$xx_sum+=($x[$i]*$x[$i]);
}
// calculate slope
$m = (($n * $xy_sum) - ($x_sum * $y_sum)) / (($n * $xx_sum) - ($x_sum * $x_sum));
// calculate intercept
$b = ($y_sum - ($m * $x_sum)) / $n;
// return result
return array("m"=>$m, "b"=>$b);
}
my question now is what data i have to pass to my php function to get the same result as in the pine-script.
I've created a pure Pine linreg function based on your PHP script. This produces exactly the same results as the builtin ta.linreg.
pine_linreg(src, len, offset=0) =>
// These are constants, we need to calculate them only on the 1st bar
var float x_sum = 0.0
var float xx_sum = 0.0
if bar_index == 0
for i = 0 to len - 1
x_sum += i
xx_sum += i * i
y_sum = math.sum(src, len)
xy_sum = 0.0
for i = len - 1 to 0
xy_sum += i * src[len - 1 - i]
// slope
slope = (len * xy_sum - x_sum * y_sum) / (len * xx_sum - x_sum * x_sum)
// intercept
intercept = (y_sum - slope * x_sum) / len
linreg = intercept + slope * (len - 1 - offset)
The trick is that the x array is the time axis, and always [0, 1, ..., len-1]. The y array is the source. Then the formula you should use is the last line in pine function, also documented in ta.linreg's documentation.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With