-- More information about this indicator can be found at: -- http://fxcodebase.com/code/viewtopic.php?f=17&t=3715 --+------------------------------------------------------------------+ --| Copyright © 2018, Gehtsoft USA LLC | --| http://fxcodebase.com | --+------------------------------------------------------------------+ --| Developed by : Mario Jemic | --| mario.jemic@gmail.com | --+------------------------------------------------------------------+ --| Support our efforts by donating | --| Paypal: https://goo.gl/9Rj74e | --+------------------------------------------------------------------+ --| Patreon : https://goo.gl/GdXWeN | --| BitCoin : 15VCJTLaz12Amr7adHSBtL9v8XomURo9RF | --| BitCoin Cash: 1BEtS465S3Su438Kc58h2sqvVvHK9Mijtg | --| Ethereum : 0x8C110cD61538fb6d7A2B47858F0c0AaBd663068D | --| LiteCoin : LLU8PSY2vsq7B9kRELLZQcKf5nJQrdeqwD | --+------------------------------------------------------------------+ function Init() indicator:name("Polynomial regression indicator (Static and History)"); indicator:description("TMT Polynomial regression indicator (Static and History)"); indicator:requiredSource(core.Tick); indicator:type(core.Indicator); indicator.parameters:addGroup("Calculation"); indicator.parameters:addInteger("Period", "Period", "", 50); indicator.parameters:addInteger("Power", "Power", "", 2, 1, 9); indicator.parameters:addDouble("Deviation", "Deviation", "", 1); indicator.parameters:addGroup("Style"); indicator.parameters:addColor("clrReg", "Color regression", "Color regression", core.rgb(255, 0, 0)); indicator.parameters:addColor("clrBand", "Color band", "Color band", core.rgb(0, 0, 255)); indicator.parameters:addInteger("width", "width", "width", 1, 1, 5); indicator.parameters:addInteger("style", "style", "style", core.LINE_SOLID); indicator.parameters:setFlag("style", core.FLAG_LEVEL_STYLE); end local first; local source = nil; local Period; local Power; local Deviation; local BuffReg=nil; local BuffReg2=nil; local BuffBandUp=nil; local BuffBandDn=nil; local OneTime = true; function Prepare(nameOnly) source = instance.source; Period=instance.parameters.Period; Power=instance.parameters.Power; Deviation=instance.parameters.Deviation; first = source:first()+2; local name = profile:id() .. "(" .. source:name() .. ", " .. instance.parameters.Period .. ", " .. instance.parameters.Power .. ", " .. instance.parameters.Deviation .. ")"; instance:name(name); if (nameOnly) then return; end BuffReg0 = instance:addInternalStream(first, 0); BuffReg = instance:addStream("BuffReg", core.Line, name .. ".Regression", "Regression", instance.parameters.clrReg, first); BuffReg2 = instance:addStream("BuffReg2", core.Line, name .. ".Regression2", "Regression2", core.rgb(64, 64, 64), first); BuffBandUp = instance:addStream("BuffBandUp", core.Line, name .. ".BandUp", "BandUp", instance.parameters.clrBand, first); BuffBandDn = instance:addStream("BuffBandDn", core.Line, name .. ".BandDn", "BandDn", instance.parameters.clrBand, first); BuffReg:setWidth(instance.parameters.width); BuffReg:setStyle(instance.parameters.style); BuffBandUp:setWidth(instance.parameters.width); BuffBandUp:setStyle(instance.parameters.style); BuffBandDn:setWidth(instance.parameters.width); BuffBandDn:setStyle(instance.parameters.style); end function Update(period, mode) if (period==source:size()-1) then local i,ii; local sumxvalue={}; local sumyvalue={}; local constant={}; local matrix={}; local pos=period-Period+1; if OneTime == true then OneTime = false; for xy=first,period,1 do BuffReg2[xy]=PolyReg(xy); if BuffReg2[xy] > BuffReg2[xy-1] then BuffReg2:setColor(xy, core.rgb(0, 255, 0)); end if BuffReg2[xy] < BuffReg2[xy-1] then BuffReg2:setColor(xy, core.rgb(255, 0, 0)); end end end for i=0,Power+1,1 do sumyvalue[i]=0; constant[i]=0; matrix[i]={}; for ii=0,Power+1,1 do matrix[i][ii]=0; end end for i=0,2*Power+1,1 do sumxvalue[i]=0; end sumxvalue[0]=Period; local exp; for exp=1,2*Power,1 do local sumx=0; local sumy=0; local k; for k=1,Period,1 do sumx=sumx+math.pow(k,exp); if exp==1 then sumy=sumy+source[pos+k-1]; elseif exp<=Power+1 then sumy=sumy+source[pos+k-1]*math.pow(k,exp-1); end end sumxvalue[exp]=sumx; if sumy~=0 then sumyvalue[exp-1]=sumy; end end local row; local col; for row=0,Power,1 do for col=0,Power,1 do matrix[row][col]=sumxvalue[row+col]; end end local initialRow=1; local initialCol=1; for i=1,Power,1 do for row=initialRow,Power,1 do sumyvalue[row]=sumyvalue[row]-(matrix[row][i-1]/matrix[i-1][i-1])*sumyvalue[i-1]; for col=initialCol,Power,1 do matrix[row][col]=matrix[row][col]-(matrix[row][i-1]/matrix[i-1][i-1])*matrix[i-1][col]; end end initialCol=initialCol+1; initialRow=initialRow+1; end local j=0; for i=Power,0,-1 do if j==0 then constant[i]=sumyvalue[i]/matrix[i][i]; else local sum=0; local k; for k=j,1,-1 do sum=sum+constant[i+k]*matrix[i][i+k]; end constant[i]=(sumyvalue[i]-sum)/matrix[i][i]; end j=j+1; end k=1; for i=period-Period+1,period,1 do sum=0; for j=0,Power,1 do sum=sum+constant[j]*math.pow(k,j); end BuffReg[i]=sum; k=k+1; end BuffReg[period-Period]=nil; BuffReg2[period]=sum; if BuffReg2[period] > BuffReg2[period-1] then BuffReg2:setColor(period, core.rgb(0, 255, 0)); end if BuffReg2[period] < BuffReg2[period-1] then BuffReg2:setColor(period, core.rgb(255, 0, 0)); end sum=0; for i=period-Period+1,period,1 do sum=sum+math.pow(source[i]-BuffReg[i],2) end local variance=math.sqrt(sum/Period); for i=period-Period+1,period,1 do BuffBandUp[i]=BuffReg[i]+Deviation*variance; BuffBandDn[i]=BuffReg[i]-Deviation*variance; end BuffBandUp[period-Period]=nil; BuffBandDn[period-Period]=nil; end end function PolyReg(xyperiod) local i,ii; local sumxvalue={}; local sumyvalue={}; local constant={}; local matrix={}; local pos=xyperiod-Period+1; for i=0,Power+1,1 do sumyvalue[i]=0; constant[i]=0; matrix[i]={}; for ii=0,Power+1,1 do matrix[i][ii]=0; end end for i=0,2*Power+1,1 do sumxvalue[i]=0; end sumxvalue[0]=Period; local exp; for exp=1,2*Power,1 do local sumx=0; local sumy=0; local k; for k=1,Period,1 do sumx=sumx+math.pow(k,exp); if exp==1 then sumy=sumy+source[pos+k-1]; elseif exp<=Power+1 then sumy=sumy+source[pos+k-1]*math.pow(k,exp-1); end end sumxvalue[exp]=sumx; if sumy~=0 then sumyvalue[exp-1]=sumy; end end local row; local col; for row=0,Power,1 do for col=0,Power,1 do matrix[row][col]=sumxvalue[row+col]; end end local initialRow=1; local initialCol=1; for i=1,Power,1 do for row=initialRow,Power,1 do sumyvalue[row]=sumyvalue[row]-(matrix[row][i-1]/matrix[i-1][i-1])*sumyvalue[i-1]; for col=initialCol,Power,1 do matrix[row][col]=matrix[row][col]-(matrix[row][i-1]/matrix[i-1][i-1])*matrix[i-1][col]; end end initialCol=initialCol+1; initialRow=initialRow+1; end local j=0; for i=Power,0,-1 do if j==0 then constant[i]=sumyvalue[i]/matrix[i][i]; else local sum=0; local k; for k=j,1,-1 do sum=sum+constant[i+k]*matrix[i][i+k]; end constant[i]=(sumyvalue[i]-sum)/matrix[i][i]; end j=j+1; end k=1; for i=xyperiod-Period+1,xyperiod,1 do sum=0; for j=0,Power,1 do sum=sum+constant[j]*math.pow(k,j); end BuffReg0[i]=sum; k=k+1; end local sum2 = sum; BuffReg0[xyperiod-Period]=nil; sum=0; for i=xyperiod-Period+1,xyperiod,1 do sum=sum+math.pow(source[i]-BuffReg0[i],2) end return sum2; end