#property copyright "Copyleft © 2007, GammaRatForex" #property link "http://www.gammarat.com/Forex/" //design based on the principles similar to the MetaTrader STD Channel // LSQ line fitting to the a number of samples. // The trendline is the leading point in the fit; // the bands are calculated somewhat differently, check the math below and adapt to // your own needs as appropriate // also the point estimate is given by the geometric mean // MathPow(HCCC,.025) (see function "get_avg" below) rather than // more standard estimates. // It's computationally fairly intensive // //#property indicator_separate_window //#property indicator_minimum 0 //#property indicator_maximum 100 #property indicator_chart_window #property indicator_buffers 5 #property indicator_color1 Aqua #property indicator_color2 Aqua #property indicator_color3 Aqua #property indicator_color4 Red #property indicator_color5 Red #property indicator_style1 0 #property indicator_style2 2 #property indicator_style3 2 #property indicator_style4 2 #property indicator_style5 2 //---- input parameters extern int Samples=60; extern int LookAhead = 0; extern double StdLevel1 = 2; extern double StdLevel2 =4.; //---- buffers double LeadingEdgeBuffer[]; double LeadingEdgeBufferPlus1[]; double LeadingEdgeBufferNeg1[]; double LeadingEdgeBufferPlus2[]; double LeadingEdgeBufferNeg2[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators if(LookAhead <0)LookAhead=0; SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,LeadingEdgeBuffer); SetIndexShift(0,LookAhead); SetIndexDrawBegin(0,LookAhead+Samples+1); SetIndexLabel(0,"LeadingEdge Trend"); if(MathAbs(StdLevel1) > 0) { SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,LeadingEdgeBufferPlus1); SetIndexShift(1,LookAhead); SetIndexDrawBegin(1,LookAhead+Samples+1); SetIndexLabel(1,"LeadingEdge +" + DoubleToStr(StdLevel1,1) + " STD"); SetIndexStyle(2,DRAW_LINE); SetIndexBuffer(2,LeadingEdgeBufferNeg1); SetIndexShift(2,LookAhead); SetIndexDrawBegin(2,LookAhead+Samples+1); SetIndexLabel(2,"LeadingEdge -" + DoubleToStr(StdLevel1,1) + " STD"); } if(MathAbs(StdLevel2) > 0){ SetIndexStyle(3,DRAW_LINE); SetIndexBuffer(3,LeadingEdgeBufferPlus2); SetIndexShift(3,LookAhead); SetIndexDrawBegin(3,LookAhead+Samples+1); SetIndexLabel(3,"LeadingEdge +" + DoubleToStr(StdLevel2,1) + " STD"); SetIndexStyle(4,DRAW_LINE); SetIndexBuffer(4,LeadingEdgeBufferNeg2); SetIndexShift(4,LookAhead); SetIndexDrawBegin(4,LookAhead+Samples+1); SetIndexLabel(4,"LeadingEdge -" + DoubleToStr(StdLevel2,1) + " STD"); } //compute(); //---- return(0); } //| Point and figure | //+------------------------------------------------------------------+ int start() { compute(); return(0); } int compute(){ int i,j,counted_bars=IndicatorCounted(); static double a[2][2],b[2][2]; double base_det,c0,c1,v1,v2,alpha,beta; static int a_loaded=0; double s0,s1; double c01,c11; //---- if(Bars=0;i--){ if(i >=Bars-Samples){ continue; } c0 = 0; c1 = 0; for(j=0;j0){ LeadingEdgeBufferPlus1[i] = LeadingEdgeBuffer[i]+StdLevel1*c0*Point; LeadingEdgeBufferNeg1[i] = LeadingEdgeBuffer[i]-StdLevel1*c1*Point; } if(MathAbs(StdLevel2)>0){ LeadingEdgeBufferPlus2[i] = LeadingEdgeBuffer[i]+StdLevel2*c0*Point; LeadingEdgeBufferNeg2[i] = LeadingEdgeBuffer[i]-StdLevel2*c1*Point; } } } double get_avg(int k){ return(MathPow((High[k]*Low[k]*Close[k]*Close[k]),1/4.)/Point); } double det2(double a[][]){ return (a[0][0]*a[1][1]-a[1][0]*a[0][1]); } //+------------------------------------------------------------------+