Support Board
Date/Time: Tue, 21 Oct 2025 14:11:39 +0000
Post From: polynomial regression channel
[2025-10-03 16:42:33] |
User411320 - Posts: 348 |
Hello John, Isn't the following the source code? /*==========================================================================*/
// // PRC - Polynomial Regression Channel // // 20110329 - written by aslan // 20100330 - added redraw option // SCSFExport scsf_PolynomialRegressionChannel(SCStudyInterfaceRef sc) { SCInputRef Input_PolyDegree = sc.Input[0]; SCInputRef Input_Period = sc.Input[1]; SCInputRef Input_StdDev1 = sc.Input[2]; SCInputRef Input_StdDev2 = sc.Input[3]; SCInputRef Input_Redraw = sc.Input[4]; SCSubgraphRef Subgraph_Fx = sc.Subgraph[0]; SCSubgraphRef Subgraph_Upper2 = sc.Subgraph[1]; SCSubgraphRef Subgraph_Upper1 = sc.Subgraph[2]; SCSubgraphRef Subgraph_Lower1 = sc.Subgraph[3]; SCSubgraphRef Subgraph_Lower2 = sc.Subgraph[4]; if (sc.SetDefaults) { sc.GraphName = "Polynomial Regression Channel"; sc.StudyDescription = "Polynomial Regression Channel"; Input_PolyDegree.Name = "Polynomial Degree (1-4)"; Input_PolyDegree.SetInt(3); Input_PolyDegree.SetIntLimits(1, 4); Input_Period.Name = "PRC Period"; Input_Period.SetInt(150); Input_Period.SetIntLimits(1, 10000); Input_StdDev1.Name = "Standard Deviation Level 1"; Input_StdDev1.SetFloat(1.618f); Input_StdDev1.SetFloatLimits(0, 1000); Input_StdDev2.Name = "Standard Deviation Level 2"; Input_StdDev2.SetFloat(2.0); Input_StdDev2.SetFloatLimits(0, 1000); Input_Redraw.Name = "Use Redraw"; Input_Redraw.SetYesNo(1); Subgraph_Fx.Name = "Mid"; Subgraph_Fx.DrawZeros = false; Subgraph_Fx.DrawStyle = DRAWSTYLE_LINE; Subgraph_Fx.LineWidth = 1; Subgraph_Fx.LineStyle = LINESTYLE_DOT; Subgraph_Fx.PrimaryColor = COLOR_GRAY; Subgraph_Upper2.Name = "Upper 2"; Subgraph_Upper2.DrawZeros = false; Subgraph_Upper2.DrawStyle = DRAWSTYLE_TRANSPARENT_FILL_TOP; Subgraph_Upper2.PrimaryColor = COLOR_RED; Subgraph_Upper1.Name = "Upper 1"; Subgraph_Upper1.DrawZeros = false; Subgraph_Upper1.DrawStyle = DRAWSTYLE_TRANSPARENT_FILL_BOTTOM; Subgraph_Upper1.PrimaryColor = COLOR_RED; Subgraph_Lower1.Name = "Lower 1"; Subgraph_Lower1.DrawZeros = false; Subgraph_Lower1.DrawStyle = DRAWSTYLE_TRANSPARENT_FILL_TOP; Subgraph_Lower1.PrimaryColor = COLOR_BLUE; Subgraph_Lower2.Name = "Lower 2"; Subgraph_Lower2.DrawZeros = false; Subgraph_Lower2.DrawStyle = DRAWSTYLE_TRANSPARENT_FILL_BOTTOM; Subgraph_Lower2.PrimaryColor = COLOR_BLUE; sc.AutoLoop = true; sc.DrawZeros = false; sc.GraphRegion = 0; sc.GlobalDisplayStudySubgraphsNameAndValue = 0; sc.DisplayStudyName = 0; sc.DisplayStudyInputValues = 0; return; } struct s_PRCData { double ai[10][10]; double b[10]; double x[10]; double sx[20]; }; int& lastIndex = sc.GetPersistentInt(1); int& nn = sc.GetPersistentInt(2); s_PRCData *p_PRCMemory = (s_PRCData *) sc.GetPersistentPointer(1); if (sc.LastCallToFunction) { // This study is being removed from the chart or the chart is being closed - cleanup if (p_PRCMemory != 0) { sc.FreeMemory(p_PRCMemory); p_PRCMemory = 0; sc.SetPersistentPointer(1, p_PRCMemory); } return; } if (sc.Index == 0) { lastIndex = -1; sc.ValueFormat = sc.BaseGraphValueFormat; if (p_PRCMemory != 0) sc.FreeMemory(p_PRCMemory); p_PRCMemory = (s_PRCData*)sc.AllocateMemory(sizeof(s_PRCData)); sc.SetPersistentPointer(1,p_PRCMemory); if (p_PRCMemory == 0) return; // set up static vars s_PRCData& PRCData = *p_PRCMemory; nn = Input_PolyDegree.GetInt() + 1; //----------------------sx------------ PRCData.sx[1] = Input_Period.GetInt() + 1; for(int i=1;i<=nn*2-2;i++) { double sum = 0.0; for(int n=0;n<=Input_Period.GetInt();n++) { sum+=pow(static_cast<double>(n),i); } PRCData.sx[i+1]=sum; } } // make sure we have enough bars to start if (sc.Index < Input_Period.GetInt()) return; // erase old data on new bar if (sc.Index != lastIndex) { lastIndex = sc.Index; if (Input_Redraw.GetYesNo()) { Subgraph_Fx[sc.Index-Input_Period.GetInt()-1] = 0; Subgraph_Upper2[sc.Index-Input_Period.GetInt()-1] = 0; Subgraph_Upper1[sc.Index-Input_Period.GetInt()-1] = 0; Subgraph_Lower1[sc.Index-Input_Period.GetInt()-1] = 0; Subgraph_Lower2[sc.Index-Input_Period.GetInt()-1] = 0; } } // now lets do the real work if (p_PRCMemory == 0) return; s_PRCData& PRCData = *p_PRCMemory; //----------------------syx----------- for(int i=1;i<=nn;i++) { double sum=0.0; for(int n=0;n<=Input_Period.GetInt();n++) { if(i==1) sum+=sc.Close[sc.Index-n]; else sum+=sc.Close[sc.Index-n]*pow(static_cast<double>(n),i-1); } PRCData.b[i]=sum; } //===============Matrix=============== for(int j=1;j<=nn;j++) { for(int i=1; i<=nn; i++) { int k=i+j-1; PRCData.ai[i][j]=PRCData.sx[k]; // reset ai matrix } } //===============Gauss================ for(int k=1; k<=nn-1; k++) { int l=0; double m=0.0; for(int i=k; i<=nn; i++) { if(abs(PRCData.ai[i][k])>m) { m=abs(PRCData.ai[i][k]); l=i; } } if(l==0) return; if (l!=k) { double tt = 0.0; for(int j=1; j<=nn; j++) { tt=PRCData.ai[k][j]; PRCData.ai[k][j]=PRCData.ai[l][j]; PRCData.ai[l][j]=tt; } tt=PRCData.b[k]; PRCData.b[k]=PRCData.b[l]; PRCData.b[l]=tt; } for(int i=k+1;i<=nn;i++) { double qq=PRCData.ai[i][k]/PRCData.ai[k][k]; for(int j=1;j<=nn;j++) { if(j==k) PRCData.ai[i][j]=0; else PRCData.ai[i][j]=PRCData.ai[i][j]-qq*PRCData.ai[k][j]; } PRCData.b[i]=PRCData.b[i]-qq*PRCData.b[k]; } } PRCData.x[nn]=PRCData.b[nn]/PRCData.ai[nn][nn]; for(int i=nn-1;i>=1;i--) { double tt=0.0; for(int j=1;j<=nn-i;j++) { tt=tt+PRCData.ai[i][i+j]*PRCData.x[i+j]; PRCData.x[i]=(1/PRCData.ai[i][i])*(PRCData.b[i]-tt); } } //==================================== for(int n=0;n<=Input_Period.GetInt();n++) { double sum=0.0; for(int k=1;k<=Input_PolyDegree.GetInt();k++) { sum+=PRCData.x[k+1]*pow(static_cast<double>(n),k); } if (n==0 || Input_Redraw.GetYesNo()) Subgraph_Fx[sc.Index-n] = static_cast<float>(PRCData.x[1]+sum); } //-------------------Std-------------- double sq=0.0, sq1=0.0, sq2=0.0; for(int n=0;n<=Input_Period.GetInt();n++) { sq+=pow(sc.Close[sc.Index-n]-Subgraph_Fx[sc.Index-n],2); } sq=sqrt(sq/(Input_Period.GetInt()+1)); sq1=sq*Input_StdDev1.GetFloat(); sq2=sq*Input_StdDev2.GetFloat(); for(int n=0;n<=Input_Period.GetInt();n++) { if (n==0 || Input_Redraw.GetYesNo()) { Subgraph_Upper1[sc.Index-n] = static_cast<float>(Subgraph_Fx[sc.Index-n]+sq1); Subgraph_Lower1[sc.Index-n] = static_cast<float>(Subgraph_Fx[sc.Index-n]-sq1); Subgraph_Upper2[sc.Index-n] = static_cast<float>(Subgraph_Fx[sc.Index-n]+sq2); Subgraph_Lower2[sc.Index-n] = static_cast<float>(Subgraph_Fx[sc.Index-n]-sq2); } } } I'm not a coder, so I can be wrong |