PureBytes Links
Trading Reference Links
|
Herman,
thank you very much for sharing a part of you [vast !] library.
Let me add a peculiar set of candles :
Atmospheric pressure EOD candles have [always] an interesting
property, O=Ref(C,-1).
Dimitris Tsokakis
--- In amibroker@xxxxxxxxxxxxxxx, sjaak haasnoot <sjaakhaasnoot@xxxx>
wrote:
> Nice code Herman, thank you for sharing it.
>
> Sjaak
> ----- Original Message -----
> From: Herman van den Bergen
> To: amibroker@xxxxxxxxxxxxxxx
> Sent: Sunday, June 20, 2004 9:25 AM
> Subject: RE: [amibroker] Candlestick code
>
>
> [Ed] 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...).
>
> 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.
>
> 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).
>
> Good luck,
> herman
>
> --------------------------------------------------------------------
----------
>
>
> 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);
>
> 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";
>
>
> --------------------------------------------------------------------
----------
>
>
>
>
> 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
>
> a.. To visit your group on the web, go to:
> http://groups.yahoo.com/group/amibroker/
>
> b.. To unsubscribe from this group, send an email to:
> amibroker-unsubscribe@xxxxxxxxxxxxxxx
>
> c.. Your use of Yahoo! Groups is subject to the Yahoo! Terms of
Service.
>
>
> --------------------------------------------------------------------
----------
> Deze e-mail is door E-mail VirusScanner van Planet Internet
gecontroleerd op virussen. Op http://www.planet.nl/evs staat een
verwijzing naar de actuele lijst waar op wordt gecontroleerd.
------------------------ Yahoo! Groups Sponsor --------------------~-->
Yahoo! Domains - Claim yours for only $14.70
http://us.click.yahoo.com/Z1wmxD/DREIAA/yQLSAA/GHeqlB/TM
--------------------------------------------------------------------~->
Check AmiBroker web page at:
http://www.amibroker.com/
Check group FAQ at: http://groups.yahoo.com/group/amibroker/files/groupfaq.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/
|