Hello Anil,
Its only a word wrap which has caused
the problem.
Attached is the code
file.
Cheers
Prashanth
----- Original Message -----
Sent: Tuesday, June 14, 2005 10:10
PM
Subject: Re: [amibroker] Complete AFL
code for "Flags and Pennants" Trading System
I am getting a syntex error on
R (underlined for identification) in the following
line.
What should I do.
LOWER FLAG TRENDLINE
Anil
----- Original Message -----
Sent: Tuesday, June 14, 2005 6:42
PM
Subject: [amibroker] Complete AFL code
for "Flags and Pennants" Trading System
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);
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
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
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
|