PureBytes Links
Trading Reference Links
|
Nice code Herman, thank you for sharing
it.
Sjaak
<BLOCKQUOTE
>
----- Original Message -----
<DIV
>From:
Herman van den
Bergen
To: <A title=amibroker@xxxxxxxxxxxxxxx
href="">amibroker@xxxxxxxxxxxxxxx
Sent: Sunday, June 20, 2004 9:25 AM
Subject: RE: [amibroker] Candlestick
code
[Ed] <FONT
face=Arial>I was wondering if there is code to search for a variety of
candlesticks (doji, hanging man...) or candlestick patterns (morning star,
bullish engulfing pattern...).
<FONT
face=Arial>
Hello Ed, below
some experimental code to identify and investigate Candle Patterns
on price charts. The patterns come from many sources, some of my own thrown
in, and you can add your own. Copy it to an indicator and open the
Param() window. As is you can select up to 44 candle patterns and see various
stats on your chart. Candle patterns have more meaning if they occur under the
right conditions, for example in an oversold or overbought condition. In the
code the RSI() is used as qualifier however you should experiment with
your own formula.
<FONT
face=Arial>
Candle patterns are
relative in short timeframes and you have to consider how many trades
were used to create the pattern and the fact that the patterns may be the
result of random price movements. The more samples (trades) are contained in
the candle pattern the more valid the pattern is (just my personal opinion).
<FONT
face=Arial>
Good
luck,
<FONT
face=Arial>herman
<FONT
face=Arial>
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);//////////////////////////////////////////////////////////////////ThH =
Param("Qualifier High Threshold",100,0,100,1);ThL = Param("Qualifier
Low Threshold",0,0,100,1);Pd = Param("Qualifier
Period",3,0,10,1);R = RSI(Pd); // Qualifier for candle pattern (substitute
your
own)//////////////////////////////////////////////////////////////////CandlePatternTrue
= CandlePattern(P) AND R>ThL AND R<ThH;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((HighestInDisplay-Lowestindisplay)+0.9*HighestIndisplay,"",1,styleNoLine|styleNoLabel);Plot(C,"Close",colorBlack,64);Plot(IIf(CandlePatternTrue,1,Null)*0.995*L,"",6,2|4);
<FONT
face=Arial>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";
<FONT
face=Arial>
Check
AmiBroker web page at:<A
href="">http://www.amibroker.com/Check
group FAQ at: <A
href="">http://groups.yahoo.com/group/amibroker/files/groupfaq.html
Deze e-mail is door E-mail VirusScanner van Planet Internet gecontroleerd op
virussen. Op <A
href='"http://www.planet.nl/evs"'>http://www.planet.nl/evs staat een
verwijzing naar de actuele lijst waar op wordt gecontroleerd.
Check AmiBroker web page at:
http://www.amibroker.com/
Check group FAQ at: http://groups.yahoo.com/group/amibroker/files/groupfaq.html
Yahoo! Groups Sponsor
ADVERTISEMENT
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 the Yahoo! Terms of Service.
|