//@Name:GARP //@Description:Growth at a reasonable price. Small to mid-cap companies with EPS, ROCE and operating margin trending up. //@Returns:Number //@Width:60 //@Env:Production var minCap = 10; //min market cap (£M) var maxCap = 500; //max market cap (£M) var histEPSgrowth = 3; //positive historical EPS growth over last X years var projEPSgrowth = 1; //positive forecast EPS growth over next X years var minEPSgrowth = 10; //min year on year historical eps growth var minProjEPSgrowth = 10; //min year on year forecast eps growth var histROCEgrowth = 3; //positive historical ROCE growth over last X years var minROCE = 12; //min current ROCE value var histOMgrowth = 3; //positive historical Operating margin growth over last X years var maxPE = 20; //max P/E var relStPeriod = 252; //period over which relative strength is calculated var cond = [1,1,1,1,1,1,1]; function init(status) { if (status == Loading || status == Editing) { minCap = storage.getAt(0); maxCap = storage.getAt(1); minEPSgrowth = storage.getAt(2); minProjEPSgrowth = storage.getAt(3); maxPE = storage.getAt(4); relStPeriod = storage.getAt(5); histOMgrowth = Math.floor(storage.getAt(6)/1000); histROCEgrowth = Math.floor(storage.getAt(6)%1000/100); projEPSgrowth = Math.floor(storage.getAt(6)%100/10); histEPSgrowth = storage.getAt(6)%10; var tot = storage.getAt(7); for (var i=0;i=",cond[0]); dlg.addIntEdit("INT1",80,y+x*0,-1,-1,"","M and <=",minCap,0,99999); dlg.addIntEdit("INT2",150,y+x*0,-1,-1,"","M",maxCap,0,99999); dlg.addTickBox("TB2",8,y+x*1,65,14,"EPS growth >=",cond[1]); dlg.addNumEdit("NUM1",72,y+x*1,-1,-1,"","% for",minEPSgrowth,0.1,50); dlg.addIntEdit("INT3",130,y+x*1,-1,-1,"","years (historical)",histEPSgrowth,1,9); dlg.addTickBox("TB3",8,y+x*2,65,14,"EPS growth >=",cond[2]); dlg.addNumEdit("NUM2",72,y+x*2,-1,-1,"","% for",minProjEPSgrowth,0.1,50); dlg.addIntEdit("INT4",130,y+x*2,-1,-1,"","years (projected)",projEPSgrowth,1,3); dlg.addTickBox("TB4",8,y+x*3,70,14,"ROCE growth for",cond[3]); dlg.addIntEdit("INT5",78,y+x*3,-1,-1,"","years",histROCEgrowth,1,9); dlg.addTickBox("TB5",8,y+x*4,90,14,"Operating Margin growth for",cond[4]); dlg.addIntEdit("INT6",100,y+x*4,-1,-1,"","years",histOMgrowth,1,9); dlg.addTickBox("TB6",8,y+x*5,40,14,"P/E <=",cond[5]); dlg.addNumEdit("NUM3",45,y+x*5,-1,-1,"","",maxPE,0.1,50); dlg.addTickBox("TB7",8,y+x*6,85,14,"Relative Strength over",cond[6]); dlg.addIntEdit("INT7",95,y+x*6,-1,-1,"","days better than market",relStPeriod,2,5000); if (dlg.show()==Dialog.Cancel) return false; minCap = dlg.getValue("INT1"); maxCap = dlg.getValue("INT2"); minEPSgrowth = dlg.getValue("NUM1"); histEPSgrowth = dlg.getValue("INT3"); minProjEPSgrowth = dlg.getValue("NUM2"); projEPSgrowth = dlg.getValue("INT4"); histROCEgrowth = dlg.getValue("INT5"); histOMgrowth = dlg.getValue("INT6"); maxPE = dlg.getValue("NUM3"); relStPeriod = dlg.getValue("INT7"); for (var i=0;i=minCap && cap<=maxCap) counter++; //check historical eps growth var growthCount = 0; for (var i=-histEPSgrowth+1;i<=0;i++) { var eps1 = share.getResult(i-1, Result.EPS); var eps2 = share.getResult(i, Result.EPS); if (eps1 > 0 && eps2 > 0 && eps2/eps1>=minEPSgrowth/100+1) growthCount++; } if (cond[1] && growthCount==histEPSgrowth) counter++; //check projected eps growth var growthCount = 0; for (var i=1;i<=projEPSgrowth;i++) { var eps1 = share.getResult(i-1, Result.EPS); var eps2 = share.getResult(i, Result.EPS); if (eps1 > 0 && eps2 > 0 && eps2/eps1>=minProjEPSgrowth/100+1) growthCount++; } if (cond[2] && growthCount==projEPSgrowth) counter++; //check ROCE growth var growthCount = 0; for (var i=-histROCEgrowth+1;i<=0;i++) { var roce1 = share.getResult(i-1, Result.ROCE); var roce2 = share.getResult(i, Result.ROCE); if (roce1 > 0 && roce2 > 0 && roce2>roce1) growthCount++; } if (cond[3] && growthCount==histROCEgrowth) counter++; //check OM growth var growthCount = 0; for (var i=-histOMgrowth+1;i<=0;i++) { var om1 = share.getResult(i-1, Result.OperatingMargin); var om2 = share.getResult(i, Result.OperatingMargin); if (om1 > 0 && om2 > 0 && om2>om1) growthCount++; } if (cond[4] && growthCount==histOMgrowth) counter++; //check P/E var eps = share.getResult(0, Result.EPS); if (cond[5] && eps>=0 && share.getClose()/eps<=maxPE) counter++; //check relative strength if (share.getMarket()=="LSE") baseShare = getShare("UKI:UKX"); else baseShare = getShare("USI:GSPC"); var F1 = baseShare.getClose(relStPeriod); var S1 = share.getClose(relStPeriod); var F2 = baseShare.getClose(); var S2 = share.getClose(); var rel = ((((F1 / S1) * (S2 / F2)) - 1) * 100); if (cond[6] && rel>0) counter++; return counter; }