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

[amibroker] Candle Pattern Analysis - A typical sad AFL occurance



PureBytes Links

Trading Reference Links

Hello,

This morning I was trying to find a simple Gap up Gap down AFL 
exploration or chart indicator, couldn't find a "simple one", could 
not code it using "Powerscan", so I downloaded a couple of Herman's 
AFL's for candlesticks from the AB Library.

Well, some of Hermans formula's don't have code for plot, or scan or 
explore, so that was a total waste of time for me. I am sure they are 
great formula's for those who know what to do with them.

Found this good one by Herman, but it doesn't plot correctly on AB 
4.89 and parameters doesn't include any adjustment (like "style own 
scale") other than selecting the candlestick formula number (#37 for 
gap up). Using this formula my beautiful candlesticks turned flat 
like a pancake, basically a straight line across the middle of the 
screen with a few vertical blue lines underneath and a couple of 
green and red arrows. 

As Thomasz improves AB for the AFL coders out there, some older 
formulas no longer work or display properly, leaving the traders in 
the dust, and the AFL library littered with broken code.

Before I go outside and kick a field goal with my laptop in utter 
disgust with my inability to code AFL, then hit the bottle of Crown 
Royal real hard, could someone advise how to fix this code?

Might cure my headache and prevent a hangover.


O1 = Ref(O,-1);O2 = Ref(O,-2);
H1 = Ref(H,-1);H2 = Ref(H,-2);
L1 = Ref(L,-1);L2 = Ref(L,-2);
C1 = Ref(C,-1);C2 = Ref(C,-2);

function CandlePattern(P)
	{
	global PatternName;
	if(P == 0) { PatternName = "NearDoji"; Pv = (abs(O-C)<= ((H-L)
*0.1)); }
	else if(P == 1) { PatternName = "BlackCandle"; Pv = (O>C); }
	else if(P == 2) { PatternName = "LongBlackCandle"; Pv = (O>C 
AND (O-C)/(.001+H-L)>.6); }
	else if(P == 3) { PatternName = "SmallBlackCandle"; Pv = 
((O>C) AND ((H-L)>(3*(O-C)))); }
	else if(P == 4) { PatternName = "WhiteCandle"; Pv = (C>O); }
	else if(P == 5) { PatternName = "LongWhiteCandle"; Pv = 
((C>O) AND ((C-O)/(.001+H-L)>.6)); }
	else if(P == 6) { PatternName = "SmallWhiteCandle"; Pv = 
((C>O) AND ((H-L)>(3*(C-O)))); }
	else if(P == 7) { PatternName = "BlackMaubozu"; Pv = (O>C AND 
H==O AND C==L); }
	else if(P == 8) { PatternName = "WhiteMaubozu"; Pv = (C>O AND 
H==C AND O==L); }
	else if(P == 9) { PatternName = "BlackClosingMarubozu"; Pv = 
(O>C AND C==L); }
	else if(P == 10) { PatternName = "WhiteClosingMarubozu"; Pv = 
(C>O AND C==H); }
	else if(P == 11) { PatternName = "BlackOpeningMarubozu"; Pv = 
(O>C AND O==H); }
	else if(P == 12) { PatternName = "WhiteOpeningMarubozu"; Pv = 
(C>O AND O==L); }
	else if(P == 13) { PatternName = "HangingMan"; Pv = (((H-L)>4*
(O-C)) AND ((C-L)/(.001+H-L)>= 0.75) AND ((O-L)/(.001+H-L)>= 0.75)); }
	else if(P == 14) { PatternName = "Hammer"; Pv = (((H-L)>3*(O-
C)) AND ((C-L)/(.001+H-L)>0.6) AND ((O-L)/(.001+H-L)>0.6)); }
	else if(P == 15) { PatternName = "InvertedHammer"; Pv = (((H-
L)>3*(O-C)) AND ((H-C)/(.001+H-L)>0.6) AND ((H-O)/(.001+H-L)>0.6)); }
	else if(P == 16) { PatternName = "ShootingStar"; Pv = (((H-L)
>4*(O-C)) AND ((H-C)/(.001+H-L)>= 0.75) AND ((H-O)/(.001+H-L)>= 
0.75)); }
	else if(P == 17) { PatternName = "BlackSpinningTop"; Pv = 
((O>C) AND ((H-L)>(3*(O-C))) AND (((H-O)/(.001+H-L))<.4) AND (((C-L)/
(.001+H-L))<.4)); }
	else if(P == 18) { PatternName = "WhiteSpinningTop"; Pv = 
((C>O) AND ((H-L)>(3*(C-O))) AND (((H-C)/(.001+H-L))<.4) AND (((O-L)/
(.001+H-L))<.4)); }
	else if(P == 19) { PatternName = "BearishAbandonedBaby"; Pv = 
((C1 == O1) AND (C2>O2) AND (O>C) AND (L1>H2) AND (L1>H)); }
	else if(P == 20) { PatternName = "BearishEveningDojiStar"; Pv 
= ((C2>O2) AND ((C2-O2)/(.001+H2-L2)>.6) AND (C2<O1) AND (C1>O1) AND 
((H1-L1)>(3*(C1-O1))) AND (O>C) AND (O<O1)); }
	else if(P == 21) { PatternName = "DarkCloudCover"; Pv = 
(C1>O1 AND ((C1+O1)/2)>C AND O>C AND O>C1 AND C>O1 AND (O-C)/(.001+(H-
L)>0.6)); }
	else if(P == 22) { PatternName = "BearishEngulfing"; Pv = 
((C1>O1) AND (O>C) AND (O>= C1) AND (O1>= C) AND ((O-C)>(C1-O1))); }
	else if(P == 23) { PatternName = "ThreeOutsideDownPattern"; 
Pv = ((C2>O2) AND (O1>C1) AND (O1>= C2) AND (O2>= C1) AND ((O1-C1)>
(C2-O2)) AND (O>C) AND (C<C1)); }
	else if(P == 24) { PatternName = "BullishAbandonedBaby"; Pv = 
((C1 == O1) AND (O2>C2) AND (C>O) AND (L2>H1) AND (L>H1)); }
	else if(P == 25) { PatternName = "BullishMorningDojiStar"; Pv 
= ((O2>C2) AND ((O2-C2)/(.001+H2-L2)>.6) AND (C2>O1) AND (O1>C1) AND 
((H1-L1)>(3*(C1-O1))) AND (C>O) AND (O>O1)); }
	else if(P == 26) { PatternName = "BullishEngulfing"; Pv = 
((O1>C1) AND (C>O) AND (C>= O1) AND (C1>= O) AND ((C-O)>(O1-C1))); }
	else if(P == 27) { PatternName = "ThreeOutsideUpPattern"; Pv 
= ((O2>C2) AND (C1>O1) AND (C1>= O2) AND (C2>= O1) AND ((C1-O1)>(O2-
C2)) AND (C>O) AND (C>C1)); }
	else if(P == 28) { PatternName = "BullishHarami"; Pv = 
((O1>C1) AND (C>O) AND (C<= O1) AND (C1<= O) AND ((C-O)<(O1-C1))); }
	else if(P == 29) { PatternName = "ThreeInsideUpPattern"; Pv = 
((O2>C2) AND (C1>O1) AND (C1<= O2) AND (C2<= O1) AND ((C1-O1)<(O2-
C2)) AND (C>O) AND (C>C1) AND (O>O1)); }
	else if(P == 30) { PatternName = "PiercingLine"; Pv = 
((C1<O1) AND (((O1+C1)/2)<C) AND (O<C) AND (O<C1) AND (C<O1) AND ((C-
O)/(.001+(H-L))>0.6)); }
	else if(P == 31) { PatternName = "BearishHarami"; Pv = 
((C1>O1) AND (O>C) AND (O<= C1) AND (O1<= C) AND ((O-C)<(C1-O1))); }
	else if(P == 32) { PatternName = "ThreeInsideDownPattern"; Pv 
= ((C2>O2) AND (O1>C1) AND (O1<= C2) AND (O2<= C1) AND ((O1-C1)<(C2-
O2)) AND (O>C) AND (C<C1) AND (O<O1)); }
	else if(P == 33) { PatternName = "ThreeWhiteSoldiers"; Pv = 
(C>O*1.01) AND (C1>O1*1.01) AND (C2>O2*1.01) AND (C>C1) AND (C1>C2) 
AND (O<C1) AND (O>O1) AND (O1<C2) AND (O1>O2) AND (((H-C)/(H-L))<.2) 
AND (((H1-C1)/(H1-L1))<.2) AND (((H2-C2)/(H2-L2))<.2); }
	else if(P == 34) { PatternName = "DarkCloudCover"; Pv = 
(C1>O1*1.01) AND (O>C) AND (O>H1) AND (C>O1) AND (((C1+O1)/2)>C) AND 
(C>O1) AND (MA(C,13)-Ref(MA(C,13),-4)>0); }
	else if(P == 35) { PatternName = "ThreeBlackCrows"; Pv = 
(O>C*1.01) AND (O1>C1*1.01) AND (O2>C2*1.01) AND (C<C1) AND (C1<C2) 
AND (O>C1) AND (O<O1) AND (O1>C2) AND (O1<O2) AND (((C-L)/(H-L))<.2) 
AND (((C1-L1)/(H1-L1))<.2) AND (((C2-L2)/(H2-L2))<.2); }
	else if(P == 36) { PatternName = "doji"; Pv = (O == C); }
	else if(P == 37) { PatternName = "GapUp"; Pv = GapUp(); }
	else if(P == 38) { PatternName = "GapDown"; Pv = GapDown(); }
	else if(P == 39) { PatternName = "BigGapUp"; Pv = L>1.01*H1; }
	else if(P == 40) { PatternName = "BigGapDown"; Pv = 
H<0.99*L1; }
	else if(P == 41) { PatternName = "HugeGapUp"; Pv = 
L>1.02*H1; }
	else if(P == 42) { PatternName = "HugeGapDown"; Pv = 
H<0.98*L1; }
	else if(P == 43) { PatternName = "DoubleGapUp"; Pv = GapUp() 
AND Ref(GapUp(),-1); }
	else if(P == 44) { PatternName = "DoubleGapDown"; Pv = GapDown
() AND Ref(GapDown(),-1); }
	return Pv;
	}


P 		= Param("CandlePattern#",20,0,44,1);

CandlePatternTrue = CandlePattern(P);
NextBar = Ref(CandlePatternTrue,-1);
Profit = IIf(NextBar,(C-O)/O*100,0);
SecondBar = BarIndex()==2;
SimpleProfit = LastValue(Cum(Profit));
CompoundedProfit = (LastValue(AMA2(1,(SecondBar==1),(SecondBar==0)*(1 
+ Profit/100)))-1)*100;
Upday = IIf(NextBar, (C-O)>0,0);
downDay = IIf(NextBar, (C-O)<0,0);
PatternColor = IIf(CandlePatternTrue,2,1);
NumUpDays = LastValue(Cum(UpDay));
NumDownDays = LastValue(Cum(downDay));
NumPatterns = LastValue(Cum(CandlePatternTrue ));
LowestInDisplay = Lowest(ValueWhen(Status("barVisible"),L));
HighestInDisplay = Highest(ValueWhen(Status("Barvisible"),H));

Plot(C,"Close",colorBlack,64);
Plot(IIf(CandlePatternTrue,1,Null)*0.995*L,"",6,2|4);
PlotShapes(UpDay*shapeUpArrow,colorBrightGreen,0,L); 
PlotShapes(downDay*shapeDownArrow,colorRed,0,H);

Title = "\nCANDLE PATTERN ANALYSIS\n\n"+
"Open:              "+NumToStr(O,1.2)+"\n"+
"High:              "+NumToStr(H,1.2)+"\n"+
"Low:               "+NumToStr(L,1.2)+"\n"+
"Close:             "+NumToStr(C,1.2)+"\n\n"+

"Candle Pattern:    "+PatternName+"\n"+
"Candle Pattern#    "+NumToStr(P,1.0)+"\n"+
"#Patterns found:   "+NumToStr(NumPatterns ,1.0)+"\n"+
"#Updays:           "+NumToStr(NumUpDays,1.0,False)+
	" ["+NumToStr(Nz(NumUpDays/NumPatterns*100),1.0,False)+"%]\n"+
"#DownDays:         "+NumToStr(NumDownDays,1.0,False)+
	" ["+NumToStr(Nz(NumDownDays/numpatterns*100),1.0,False)+"%]
\n\n"+
"Profit at cursor:  "+NumToStr(Profit,1.4)+"%\n"+
"Ave.Profit/Pattern:"+NumToStr(Nz(SimpleProfit/NumPatterns),1.4)+"%
\n"+
"Tot.Simple profit: "+NumToStr(SimpleProfit,1.4)+"%\n"+
"Tot.Comp. profit:  "+NumToStr(CompoundedProfit,1.4)+"%\n";

















------------------------ Yahoo! Groups Sponsor --------------------~--> 
Transfer from your equities account.  
Receive up to $1,000 from GFT. Click here to learn more.
http://us.click.yahoo.com/aZttyC/X_xQAA/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 NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

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/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/amibroker/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:amibroker-digest@xxxxxxxxxxxxxxx 
    mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx

<*> 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/