PureBytes Links
Trading Reference Links
|
[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:
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.
|