Polynomial Regression Channel (PRC) free

by qualitiedx2 in category Volatility at 25/05/2012
Description

The PRC indicator applies a polynomial function to the linear regression function to adapt itself to the flow of market prices. Since they are regression bands that self adjust for volatility.

Polynomial Regression Channel

Notification Publishing copyrighted material is strictly prohibited. If you believe there is copyrighted material in this section you may use the Copyright Infringement Notification form to submit a claim.
Formula / Source Code
Language: C#
Trading Platform: cAlgocTrader
using System;
using cAlgo.API;
using cAlgo.API.Indicators;

namespace cAlgo.Indicators
{
    [Indicator(IsOverlay = true, AccessRights = AccessRights.None)]
    public class PRC : Indicator
    {
        [Parameter(DefaultValue = 3.0,MinValue = 1, MaxValue = 4)]
        public int degree { get; set; }

        [Parameter(DefaultValue = 120)]
        public int period { get; set; }
    	
        [Parameter(DefaultValue = 1.62)]
        public double strdDev { get; set; }
		
        [Parameter(DefaultValue = 2)]
        public double strdDev2 { get; set; }
		
        [Output("PRC",Color=Colors.Gray)]
        public IndicatorDataSeries prc { get; set; }
        
        [Output("SQH",Color=Colors.Red)]
        public IndicatorDataSeries sqh { get; set; }
        
        [Output("SQL",Color=Colors.Blue)]
        public IndicatorDataSeries sql { get; set; }
        
        [Output("SQL2",Color=Colors.Blue)]
        public IndicatorDataSeries sql2 { get; set; }
        
        [Output("SQH2",Color=Colors.Red)]
        public IndicatorDataSeries sqh2 { get; set; }
		
		private double[,] ai = new double[10,10];
		private double[] b = new double[10];
		private double[] x = new double[10];
		private double[] sx = new double[10];
		private double sum;
		private int ip;
		private int p;
		private int n;
		private int f;
		private double qq;
		private double mm;
		private double tt;
		private int ii;
		private int jj;
		private int kk;
		private int ll;
		private int nn;
		private double sq;
		private double sq2;
		private int i0 = 0;
		private int mi;
        
        public override void Calculate(int index)
        {
			ip = period;
			p = ip;
			sx[1] = p + 1;
			nn = degree + 1;
			//----------------------sx-------------------------------------------------------------------
			for(mi=1;mi<=nn*2-2;mi++) // 
			{
				sum=0;
				for(n=i0;n<=i0+p;n++)
				{
				sum+=Math.Pow(n,mi);
				}
				sx[mi+1]=sum;
			}
			//----------------------syx-----------
			for(mi=1;mi<=nn;mi++)
			{
				sum=0.00000;
				for(n=i0;n<=i0+p;n++)
				{
				if(mi==1) sum+=MarketSeries.Close[index-n];
				else sum+=MarketSeries.Close[index-n]*Math.Pow(n,mi-1);
				}
				b[mi]=sum;
			}
			//===============Matrix=======================================================================================================
			for(jj=1;jj<=nn;jj++)
			{
				for(ii=1; ii<=nn; ii++)
				{
				kk=ii+jj-1;
				ai[ii,jj]=sx[kk];
				}
			}
			//===============Gauss========================================================================================================
			for(kk=1; kk<=nn-1; kk++)
			{
				ll=0;
				mm=0;
				for(ii=kk; ii<=nn; ii++)
				{
				if(Math.Abs(ai[ii,kk])>mm)
				{
					mm=Math.Abs(ai[ii,kk]);
					ll=ii;
				}
				}
				if(ll==0) return;   
				if (ll!=kk)
				{
				for(jj=1; jj<=nn; jj++)
				{
					tt=ai[kk,jj];
					ai[kk,jj]=ai[ll,jj];
					ai[ll,jj]=tt;
				}
				tt=b[kk];
				b[kk]=b[ll];
				b[ll]=tt;
				}  
				for(ii=kk+1;ii<=nn;ii++)
				{
				qq=ai[ii,kk]/ai[kk,kk];
				for(jj=1;jj<=nn;jj++)
				{
					if(jj==kk) ai[ii,jj]=0;
					else ai[ii,jj]=ai[ii,jj]-qq*ai[kk,jj];
				}
				b[ii]=b[ii]-qq*b[kk];
				}
			}  
			x[nn]=b[nn]/ai[nn,nn];
			for(ii=nn-1;ii>=1;ii--)
			{
				tt=0;
				for(jj=1;jj<=nn-ii;jj++)
				{
				tt=tt+ai[ii,ii+jj]*x[ii+jj];
				x[ii]=(1/ai[ii,ii])*(b[ii]-tt);
				}
			}
			sq=0.0;
			sq2=0.0;
			for(n=i0;n<=i0+p;n++)
			{
				sum=0;
				for(kk=1;kk<=degree;kk++)
				{
				sum+=x[kk+1]*Math.Pow(n,kk);
				}
				prc[index-n]=(x[1]+sum);
				sq+=Math.Pow(MarketSeries.Close[index-n]-prc[index-n],2);
				sq2+=Math.Pow(MarketSeries.Close[index-n]-prc[index-n],2);
			}	
			sq=Math.Sqrt(sq/(p+1))*strdDev;
			sq2=Math.Sqrt(sq2/(p+1))*strdDev2;
			for(n=i0;n<=i0+p;n++)
			{
				sqh[index-n]=(prc[index-n]+sq);
				sql[index-n]=(prc[index-n]-sq);
				sqh2[index-n]=(prc[index-n]+sq2);
				sql2[index-n]=(prc[index-n]-sq2);
			}
        }
    }
}
Comments

pdagodfather - January 04, 2015 @ 19:54

Hey qualitiedx2, really a big thanks for all your indicators you provided. They are all really helpful!

JS15 - January 26, 2015 @ 16:57

Hi,

This indicator is amazing. Would you by and chance have the cAlgo code for a Regression line also known as Linear Regression Forecast. Cheers JS

char1 - March 24, 2016 @ 19:16

How to translate to another API this code.

On that.
http://orderflowtrading.ru/indicators/index.html

Teach please who knows.

junathannt86@gmail.com - May 20, 2018 @ 05:12

Hye  qualitiedx2, im really appreciate your works... i need your help, can u translate this script into pine script or any type of script..  do u have that? tq..

5