[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Complete AFL code for "Flags and Pennants" Trading System



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/