PureBytes Links
Trading Reference Links
|
Below is the complete AFL code for Markos Katsano's 'Flags and
Pennants' Trading System. Markos articles appeared in the April and
May 2005 TASC issues. The May 2005 issue had the Metastock code for
the trading system. I've simply translated the Metastock code to
AFL. To check for accuracy, I attempted to run the AFL code against
the examples illustrated in the articles. My AFL translation DID NOT
pick up the 'flags and pennants' shown in the examples. That makes
me suspect that my translation is not absolutely correct. However, I
backtested the AFL code against a small database of stocks (over a 5
year period) and the backtest/scan was able to pick out 'flags and
pennants' breakouts with no problems. For e.g., LJPC went on to make
a 77% profit in a mth after being identified as making a breakout by
the code. Another e.g is IDEV which went on to make 82% in less than
5 wks.......there are many more. Of course, some breakouts failed
but the AFL sell rules quickly eliminated them. This system works
best on small caps and you would need more than 300 bars of data for
the trading rules to work (one of the indicators, VFI, needs more
than a year of data). Also, the 'flags and pennants' don't occur too
frequently so you would need to scan a large database of stocks (at
least a 1000) to get a decent number of buy signals or to get a large
sample size for valid backtesting. More signals are picked up during
overall market bull periods. Some small caps have 3-4 'flags and
pennants' occurring over a period of 1-2 years.
BOTTOM LINE - THE CODE WORKS AND IS A GREAT SCAN FOR BREAKOUT STOCKS
BUT WOULD, PROBABLY, NEED TO BE TWEAKED BY AN 'METASTOCK TO AFL'
GURU. I've included the Metastock code below the AFL for
afficianados to find my errors, if any. All comments are welcome.
Also - Markos Katsanos uses the FVE, VFI, Stoch and ADX indicator
to 'strengthen' his system. I don't believe its really necessary to
include those to find 'flags and pennants'. You can remove the
sections - "FVE indicator code", "VFI indicator code" and Buy
Conditions 6 and 7 and still have a great system (call it 'F&P
Lite'). You would then need only 2 mths of data to run the system.
Enough talk - here's the AFL code........
*****************************************************************
// Translation of Markos Katsanos Metastock Code for 'Flags and
Pennants' Trading System
ZZ = Zig(C,17);
X = BarsSince(ZZ<Ref(ZZ,-1) AND Ref(ZZ,-1)> Ref(ZZ,-2));
X1 = LastValue(X) + 1;
X2 = X1 + 1;
SD = StDev(C,X2);
// FVE indicator code
PERIOD = 22;
COEFF = 0.1;
intRA = log(H) - log(L);
VINTRA = StDev(intRA, PERIOD);
intER = log(Avg)-log(Ref(Avg,-1));
VINTER = StDev(intER,PERIOD);
CUTOFF = COEFF*(VINTER + VINTRA)*C;
MF = C - (H+L)/2 + Avg - Ref(Avg,-1);
MFV = IIf(MF>CUTOFF,V,IIf(MF<-CUTOFF,-V,0));
FVE = Sum(MFV,PERIOD)/MA(V,PERIOD)/PERIOD*100;
// VFI indicator code
PERIOD1 = 130;
COEF = 0.2;
VCoef = 2.5;
VINTER1 = StDev(intER, 30);
Cutoff1 = COEF * VINTER1 * C;
VAVE = Ref(MA(V, PERIOD1), -1);
VMAX = VAVE * VCoef;
Vc = Min (V, VMAX);
MF1 = Avg - Ref(Avg, -1);
VCP = IIf( MF1 > Cutoff1, Vc, IIf (MF1 < -Cutoff1, -Vc, 0));
VFI = Sum(VCP, PERIOD1)/VAVE;
// Buy Conditions
Buy = X1<21 AND X1>2 AND //CONDITION 1
Ref(LinRegSlope(C,13)/Ref(C,-13)*100, -X1)>2.2 //CONDITION 2
AND Ref(LinRegSlope(C,X2)/Ref(C,-X2),-1)*100<.2
AND LinRegSlope(C,X1)/Ref(C,-X1)>-1.2 //CONDITION 3
AND Ref(LinRegSlope(V,X2)/Ref(V,-X2),-1)*100<-2 //CONDITION 4
AND Ref(LinRegSlope(SD,X1),-1)<0 //CONDITION 5
AND StochK(20,3)>55 AND ADX(10)>30 //CONDITION 6
AND FVE>10 AND VFI>-3 //CONDITION 7
AND C>Ref(C,-1) AND C>O; //CONDITION 8
//SELL ORDER
D1 = ApplyStop(stopTypeNBar,stopModeBars, 24, True); D2 = LastValue
(D1);
zz = Zig(Ref(C,-D2),17);
X = BarsSince(ZZ<Ref(ZZ,-1) AND Ref(ZZ,-1)> Ref(ZZ,-2));
X1 = LastValue(X) + 1; //FLAG DURATION
C1 = LLV(C,(D2+40)); //POLE BASE
C2 = Ref(HHV(C,22),-D2); //POLE TOP
BREAK1 = ApplyStop(stopTypeNBar,stopModePercent, 45, True);
POLE = (C2-C1)/C1*100; //POLE HEIGHT %
// EXIT CONDITIONS
Sell = BREAK1 > 1.94*(POLE^0.724) //EXIT CONDITION 1 PROFIT TARGET
OR C<Ref(LLV(C,X1), -D2) //EXIT CONDITION 2 STOP LOSS ON BREAKING OF
LOWER FLAG TRENDLINE
OR (D2>14 AND BREAK1<.25*POLE) //EXIT CONDITION 3 - INACTIVITY
OR (D2>3 AND C<.9*HHV(C,4)) //EXIT CONDITION 4 - TRAILING STOP LOSS
OR D2>24; //EXIT CONDITION 5 - TIME EXIT
****************************************************************
****************************************************************
//MARKOS KATSANOS METASTOCK CODE FOR DETECTING BREAKOUTS IN FLAGS AND
PENNANTS//
//Enter Long
ZZ: = Zig(C,17,%);
X: = BarsSince(ZZ<Ref(ZZ,-1) AND Ref(ZZ,-1)> Ref(ZZ,-2));
X1: = LastValue(X) + 1; //FLAG DURATION
X2: = X1 + 1;
SD: = StDev(C,X2);
PERIOD: = 22;
COEFF: = 0.1;
INTRA: = log(H) - log(L);
VINTRA: = StDev(INTRA, PERIOD);
INTER: = log(Typical())-log(Ref(Typical(),-1));
VINTER: = StDev(INTER,PERIOD);
CUTOFF: = COEFF*(VINTER + VINTRA)*C;
MF = C - (H+L)/2 + Typical() - Ref(Typical(),-1);
FVE = Sum(If(MF>CUTOFF,+V,IF(MF<-CUTOFF,-V,0)),PERIOD)/Mov
(V,PERIOD,S)/PERIOD*100;
X1<21 AND X1>2 AND //CONDITION 1
Ref(LinRegSlope(C,13)/Ref(C,-13)*100, -X1)>2.2 //CONDITION 2
AND Ref(LinRegSlope(C,X2)/Ref(C,-X2),-1)*100<.2
AND LinRegSlope(C,X1)/Ref(C,-X1)>-1.2 //CONDITION 3
AND Ref(LinRegSlope(V,X2)/Ref(V,-X2),-1)*100<-2 //CONDITION 4
AND Ref(LinRegSlope(SD,X1),-1)<0 //CONDITION 5
AND Stoch(20,3)>55 AND ADX(10)>30 //CONDITION 6
AND FVE>10 AND Fml("VFI")>-3 //CONDITION 7 //AFL GURUS - CODE FOR VFI
IS BELOW
AND C>Ref(C,-1) AND C>O; //CONDITION 8
//SELL ORDER
D1: = Simulation.CurrentPositionAge; D2: = LastValue(D1);
zz: = Zig(Ref(C,-D2),17,%);
X: = BarsSince(ZZ<Ref(ZZ,-1) AND Ref(ZZ,-1)> Ref(ZZ,-2));
X1: = LastValue(X) + 1; //FLAG DURATION
c1: = LLV(C,(D2+40)); //POLE BASE
c2: = Ref(HHV(C,22),-D2); //POLE TOP
BREAK1: = Simulation.CurrentPositionPerformance*100;
POLE: = (C2-C1)/C1*100; //POLE HEIGHT %
//EXIT CONDITIONS
BREAK1 > 1.94*Power(Pole,.724) //EXIT CONDITION 1 PROFIT TARGET - (in
article he has profit target as 1.94*pole^0.724)//
OR C<Ref(LLV(C,X1), -D2) //EXIT CONDITION 2 STOP LOSS ON BREAKING OF
LOWER FLAG TRENDLINE
OR (D2>14 AND BREAK1<.25*POLE) //EXIT CONDITION 3 - INACTIVITY
OR (D2>3 AND C<.9*HHV(C,4)) //EXIT CONDITION 4 - TRAILING STOP LOSS
OR D2>24; //EXIT CONDITION 5 - TIME EXIT
//METASTOCK CODE FOR VFI FORMULA//
PERIOD: = Input("PERIOD FOR VFI",5,1300,130);
COEF: = .2;
VCOEF: = Input("MAX VOLUME CUTOFF",0,50,2.5);
INTER: = Log(Typical())-Log(Ref(Typical(),-1));
VINTER: = Stdev(INTER,30);
CUTOFF: = COEF*VINTER*C;
VAVE: = Ref(Mov(V,PERIOD,S),-1);
VMAX: = VAVE*VCOEF;
VC: = If(V<VMAX,V,VMAX);
MF: = Typical()-Ref(Typical(),-1);
VFI: = Sum(If(MF>CUTOFF,+VC,If(MF<-CUTOFF,-VC,0)),PERIOD)/VAVE;
Mov(VFI,3,E);
------------------------ Yahoo! Groups Sponsor --------------------~-->
Has someone you know been affected by illness or disease?
Network for Good is THE place to support health awareness efforts!
http://us.click.yahoo.com/Rcy2bD/UOnJAA/cosFAA/GHeqlB/TM
--------------------------------------------------------------------~->
Please note that this group is for discussion between users only.
To get support from AmiBroker please send an e-mail directly to
SUPPORT {at} amibroker.com
For other support material please check also:
http://www.amibroker.com/support.html
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/amibroker/
<*> To unsubscribe from this group, send an email to:
amibroker-unsubscribe@xxxxxxxxxxxxxxx
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
|