Skip to main content

Trend detection function for Amibroker (AFL)

isozaki over 14 years ago Amibroker (AFL)

  • Rating:
    3 / 5 (Votes 5)
  • Tags:
    amibroker, trend, function

This AFL function Trend(Price,Length) checks if there is trend in given number of data bars in the array. Returns 1 for increasing trend, -1 for decreasing and 0 for none. Uses Mann-Kendall method and detects trend with 95% probability

Indicator / Formula

Copy & Paste Friendly
function Trend(Price,Length) {

	Result = 0;

	

	for (k=Length;k<BarCount;k++) {

		S = 0;

		for (i=k-Length+1;i<k;i++) {			
			for (j=k-Length;j<i-1;j++) {
				Signum = sign(Price[i]-Price[j]);
				S += Signum;
			}			
		}
		
		Variance =( Length*(Length-1.0)*(2*Length+5.0))/18.0;		
		StdDev = sqrt(Variance);

		zScore = 0;
		if (S >= 0) {
			zScore=((S-1)/StdDev);
		}else {
			zScore=(S+1)/StdDev;
		}

		Result[k] = 0; //0- no trend, -1 - decreasing trend, 1 - increasing trend

		isTrend = False;
		if ((zScore>=1.65)||(zScore<=-1.65)) { 
			isTrend=True;
		}

		if (isTrend)	{		
			if (S<0){
				Result[k] = -1;
			}else {
				Result[k] = 1;
			}
		}

	}

	return Result;
}

13 comments

3. sam21
over 14 years ago

YUP Afl is not working…though no error but nothing is displayed in Price chart

over 14 years ago

Hey, this is good, thanks a lot
For the others complaining about the script, this is just a function, you need to add your own statement.

7. morgen
over 14 years ago

wisewisely, be so kind, please, explain how “to add your own statement”.
With an example, please.

8. JaNa
over 14 years ago

You complaining guys are so dumb it’s unbelievable. Learn AFL before complaining!! Jesus Christ.

over 14 years ago
_SECTION_BEGIN("Mann-Kendall");
Length= Param( "Period", 21, 5, 200, 1 ); 
function Trend(Price,Length) {
 Price=C;
    Result = 0;
 
     
 
    for (k=Length;k<BarCount;k++) {
 
        S = 0;
 
        for (i=k-Length+1;i<k;i++) {         
            for (j=k-Length;j<i-1;j++) {
                Signum = sign(Price[i]-Price[j]);
                S += Signum;
            }           
        }
         
        Variance =( Length*(Length-1.0)*(2*Length+5.0))/18.0;       
        StdDev = sqrt(Variance);
 
        zScore = 0;
        if (S >= 0) {
            zScore=((S-1)/StdDev);
        }else {
            zScore=(S+1)/StdDev;
        }
 
        Result[k] = 0; //0- no trend, -1 - decreasing trend, 1 - increasing trend
 
        isTrend = False;
        if ((zScore>=1.65)||(zScore<=-1.65)) { 
            isTrend=True;
        }
 
        if (isTrend)    {       
            if (S<0){
                Result[k] = -1;
            }else {
                Result[k] = 1;
            }
        }
 
    }
 
    return Result;
}
Plot(C,"",colorRed,styleCandle);
Plot(Trend(C,Length),"",colorRed,styleLine+styleThick|styleOwnScale);
_SECTION_END();
11. isozaki
over 14 years ago

Thanks investor_tr for making this an indicator. I din’t add this 3 lines, thought it was obvious, sorry.

Leave Comment

Please login here to leave a comment.