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

RE: [amibroker] Question on filter and exploration



PureBytes Links

Trading Reference Links

Try the Exploration code below. Use param() to select eithe Number of
occurrences or percent up days.
Watch for line wraps.
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)
//////////////////////////////////////////////////////////////////
SetOption("noDefaultColumns",True);
Filter=Status("LastBarInTest");
ST = Param("NumPatterns, %Updays",0,0,1,1);
if(ST) Stat = 0; else Stat = 1;
AddTextColumn(Name(),WriteIf(ST,"%UpDays","NumPatterns"));
for(Cp=0; Cp<=44; Cp++)
 {
 CandlePatternTrue = CandlePattern(cP) 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));
 if(St) AddColumn(NumUpDays,PatternName,1.2);
 if(St) AddColumn(NumPatterns,PatternName,1.0);
 }
/*
//Plot((HighestInDisplay-Lowestindisplay)+0.9*HighestIndisplay,"",1,styleNoL
ine|styleNoLabel);

Plot(C,"Close",colorWhite,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";
AddColumn(p, "WhiteOpeningMarubozu",1);
AddColumn(numpatterns, "Patterns Found",1);
AddColumn(NumUpDays/NumPatterns*100,"% up days",1);
AddColumn(Numdowndays/NumPatterns*100,"% down days",1);







-----Original Message-----
From: Bundy [mailto:bundy@xxxxxx]
Sent: Tuesday, September 14, 2004 3:15 AM
To: amibroker@xxxxxxxxxxxxxxx
Subject: [amibroker] Question on filter and exploration


I have an indicator that can identify 44 different candlestick patters and
calculate the % of up and down days following each particular candle.

I want to turn this into an exploration so I can easily see what types of
candlestick patterns work better with which stock, etc.

The code is below - at the moment I have to manually change the filter to
identify each of the 45 candlesticks individually - which makes
com[parisons between patterns difficult.

Is there a way to cycle through the patterns using filter to give me the
results for each candle in the one scan?

The code is below - my contribution to the exploration are the last few
lines - I have no idea whether what I ask can be done, let alone how to do
it - any help would be much appreciated.

Arthur




------------------------ Yahoo! Groups Sponsor --------------------~--> 
$9.95 domain names from Yahoo!. Register anything.
http://us.click.yahoo.com/J8kdrA/y20IAA/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/