Simple Hammer Code. Help Needed !

 

BullishHammer=((Open[i]+Close[i])>(High[i]+Low[i]/3.0));

I am attempting to construct a hammer pattern signal in this case bullish where the body is a third the size of the candle high/low range. Can some one point me to where I am going wrong on this? and also how would I quantify this as the body being in the upper portion of the candle ??

Any help would be appreciated thanks Mickey !!

 
Michael Green:

BullishHammer=((Open[i]+Close[i])>(High[i]+Low[i]/3.0));

I am attempting to construct a hammer pattern signal in this case bullish where the body is a third the size of the candle high/low range. Can some one point me to where I am going wrong on this? and also how would I quantify this as the body being in the upper portion of the candle ??

Any help would be appreciated thanks Mickey !!


 i use this code : try to modify it :


bool CheckMartelo(double PA,double PF,double PMIN,double PMAX)
{



// check IF BULLISH HAMMER

if(PF > PA) 
{
if(((PF - PA)*2) < (PA-PMIN)) // CHECK IF IS HAMMER 
{

      if(((PMAX-PF)) < (PF-PA)) // CHECK SHADOW SIZE
      {
      return true;
      }
}
}

 
Michael Green:

BullishHammer=((Open[i]+Close[i])>(High[i]+Low[i]/3.0));

I am attempting to construct a hammer pattern signal in this case bullish where the body is a third the size of the candle high/low range. Can some one point me to where I am going wrong on this? and also how would I quantify this as the body being in the upper portion of the candle ??

Any help would be appreciated thanks Mickey !!

bool BullishHammer(int i)
  {
   double body_size = Close[i] - Open[i];
   if(body_size <= 0)                    return(false); // reject (a bearish or doji candle)
   double candle_range = High[i] - Low[i];
   if(body_size < candle_range/3)        return(false); // reject (body is less than 1/3)
   if(Open[i] < Low[i] + candle_range/2) return(false); // reject (body is in lower 1/2)
   return(true);
  }

bool BearishHammer(int i)
  {
   double body_size = Open[i] - Close[i];
   if(body_size <= 0)                    return(false); // reject (a bullish or doji candle)
   double candle_range = High[i] - Low[i];
   if(body_size < candle_range/3)        return(false); // reject (body is less than 1/3)
   if(Open[i] > Low[i] + candle_range/2) return(false); // reject (body is in upper 1/2)
   return(true);
  }
 
honest_knave:


Body is more than 1/3 of the size of the candle range, body in upper 1/2 of candle:

If you want less than 1/3, be careful about inadvertently comparing a bearish candle in your check.


thanks can understand that however how would i depict the body in the upper portion of the candle using the same code style?

 
Michael Green:


thanks can understand that however how would i depict the body in the upper portion of the candle using the same code style?


I modified my post above with 2 simple functions.

Simply call them with the index you want to check, and they will return true/false.

 
honest_knave:


I modified my post above with 2 simple functions.

Simply call them with the index you want to check, and they will return true/false.

 
int counted_bars=IndicatorCounted();
   int limit= Bars-counted_bars;
   for(int i=1;i<limit;i++)
     {
      //---
      double O=(Open[i]);
      double O1=(Open[i+1]);
      double O2=(Open[i+2]);
      double H=(High[i]);
      double H1=(High[i+1]);
      double H2=(High[i+2]);
      double L=(Low[i]);
      double L1=(Low[i+1]);
      double L2=(Low[i+2]);
      double C=(Close[i]);
      double C1=(Close[i+1]);
      double C2=(Close[i+2]);
      //---
      double AvgBody=(Open[i]-Close[i]);
      double AvgBody2=(Open[i+1]-Close[i+1]);
      double AvgBody3=(Open[i+2]-Close[i+2]);
      //---
      double MidPoint=(High[i]+Low[i])/2;
      double MidPoint1=(High[i+1]+Low[i+1])/2;
      double MidPoint2=(High[i+2]+Low[i+2])/2;
      //---
      double AverageBodySize=(Open[i]+Close[i])/2;
      double Body=(Open[i]+Close[i]);
      double HighLow=(High[i]+Low[i]);
      //---
      double body_size=(Close[i] - Open[i]);
      double candle_range=(High[i] - Low[i]);

      double Price=(High[i]+Low[i])/2;
      double PriceBack3=(High[i+2]+Low[i+2])/2;

      //Bullish Patterns
      double BullishEngulfing=((O1>C1) && (C>O) && (C>=O1) && (C1>=O) && ((C-O)>(O1-C1)));
      double BullishHarami=((O1>C1) && (C>O) && (C<=O1) && (C1<=O) && ((C-O)<(O1-C1)));
      //---
      double BullishThreeInsideUp=((Low[i+4]<Low[i+5]) && (Low[i+3]<Low[i+4]) && (High[i+2]<High[i+3]) && (Low[i+2]>Low[i+3]) && (High[i]>High[i+2]));
      double TweezerBottoms=((Open[i+1]==Close[i]) && (Close[i]>Open[i]));
      double MorningStar=((Close[i+2]<Open[i+2]) && (Close[i+1]<Open[i+1] || Close[i+1]>Open[i+1]) && (Close[i+1]<Close[i+2]) && (Open[i+1]<Close[i+2]) && (Close[i]>Open[i]) && (Open[i]>Close[i+1]) && (Open[i]>Open[i+1]));
      double BullishRailwayTrack=((Close[i+1]<Open[i+1]) && (Open[i]>Close[i]) && (Open[i+1]==Open[i]) && (Close[i+1]==Close[i]));
      double PiercingLine=((Close[i+1]<Open[i+1]) && (Close[i]>Open[i]) && (Open[i]<Close[i+1]) && (Close[i]>MidPoint1));
      double BullishHomingPidgeon=((Close[i+1]<Open[i+1]) && (Close[i]<Open[i]) && (High[i]<High[i+1]) && (Low[i]>Low[i+1]) && (Open[i]<Open[i+1]) && (Close[i]>Close[i+1]));
      double BullishHammer=((!body_size <= 0) && (!body_size < candle_range/3) && (!Open[i] < Low[i] + candle_range/2));
      //---
      double BearishThreeSideDown=((High[i+4]>High[i+5]) && (High[i+3]>High[i+4]) && (High[i+2]<High[i+3]) && (Low[i+2]>Low[i+3]) && (Low[i]<Low[i+2]));
      double TweezerTops=((Open[i+1]==Close[i]) && (Close[i]<Open[i]));
      double EveningStar=((Close[i+2]>Open[i+2]) && (Close[i+1]>Open[i+1] || Close[i+1]<Open[i+1]) && (Close[i+1]>Close[i+2]) && (Open[i+1]>Close[i+2]) && (Close[i]<Open[i]) && (Open[i]<Close[i+1]) && (Open[i]<Open[i+1]));
      double BearishRailwayTrack=((Close[i+1]>Open[i+1]) && (Open[i]<Close[i]) && (Open[i+1]==Open[i]) && (Close[i+1]==Close[i]));
      double DarkCloudCover=((Close[i+1]>Open[i+1]) && (Close[i]<Open[i]) && (Open[i]>Close[i+1]) && (Close[i]<MidPoint1));//--Piercing Line Bearish
      double BearishHawk=((Close[i+1]>Open[i+1]) && (Close[i]>Open[i]) && (High[i]>High[i+1]) && (Low[i]<Low[i+1]) && (Open[i]>Open[i+1]) && (Close[i]<Close[i+1]));//---BullishHomingPidgeon

      //---good signal but needs end to repeating
      //double ThreeBlackCrows=((Close[i+2]-Open[i+2]<AvgBody3) && (Close[i+1]-Open[i+1]<AvgBody2) && (Close[i]-Open[i]<AvgBody) && (MidPoint1<MidPoint2) && (MidPoint<MidPoint2));



      //---
      double SmaH4=iMA(NULL,PERIOD_H4,200,0,MODE_SMA,PRICE_MEDIAN,i);
      //---

      //---

      if(show==true)
        {
         Hr4200sma[i]=SmaH4;
        }

      if(BullishHammer)

        {
         UpArrow[i]=Open[i];
        }

      if(BearishHawk)

        {
         DownArrow[i]=Open[i];
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

 

double BullishHammer=((!body_size <= 0) && (!body_size < candle_range/3) && (!Open[i] < Low[i] + candle_range/2));

doesn't seem to work ?? I am doing something wrong?

 
saidmrn:


 i use this code : try to modify it :



can you pass me the double inputs?

(double PA,double PF,double PMIN,double PMAX) thanks 
 
Michael Green:

double BullishHammer=((!body_size <= 0) && (!body_size < candle_range/3) && (!Open[i] < Low[i] + candle_range/2));

doesn't seem to work ?? I am doing something wrong?


Please try to use SRC button when posting code; it makes it a lot easier to read (I've modified your post above).

Firstly, you are using doubles (numbers) to store something that should really be boolean (true/false), no?

Take a look here for a good guide about doing lookbacks correctly.

The easier approach (in my opinion) is to have distinct function calls for your patterns.

An example using the new format:

#property strict
#property indicator_chart_window
#property indicator_buffers 2

double UpArrow[],
       DownArrow[];

int OnInit()
  {
   SetIndexBuffer(0,UpArrow);
   SetIndexBuffer(1,DownArrow);
   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,2,clrLime);
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,2,clrRed);
   SetIndexArrow(0,233);
   SetIndexArrow(1,234);
   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   for(int i=rates_total-fmax(1,prev_calculated); i>0; i--)
     {
      if(BullishHammer(i)) UpArrow[i]  =Low[i];  else UpArrow[i]  =EMPTY_VALUE;
      if(BearishHammer(i)) DownArrow[i]=High[i]; else DownArrow[i]=EMPTY_VALUE;
     }
   return(rates_total);
  }

bool BullishHammer(int i)
  {
   double body_size = Close[i] - Open[i];
   if(body_size <= 0)                    return(false); // reject (a bearish or doji candle)
   double candle_range = High[i] - Low[i];
   if(body_size < candle_range/3)        return(false); // reject (body is less than 1/3)
   if(Open[i] < Low[i] + candle_range/2) return(false); // reject (body is in lower 1/2)
   return(true);
  }

bool BearishHammer(int i)
  {
   double body_size = Open[i] - Close[i];
   if(body_size <= 0)                    return(false); // reject (a bullish or doji candle)
   double candle_range = High[i] - Low[i];
   if(body_size < candle_range/3)        return(false); // reject (body is less than 1/3)
   if(Open[i] > Low[i] + candle_range/2) return(false); // reject (body is in upper 1/2)
   return(true);
  }

Finally, I'll just point out that you are reinventing the wheel. There are plenty of these pattern-finding indicators already available.

If you're doing it as an exercise to learn, that is great! But I just thought I'd point it out in case you didn't know.

Good luck!

 
honest_knave:


Please try to use SRC button when posting code; it makes it a lot easier to read (I've modified your post above).

Firstly, you are using doubles (numbers) to store something that should really be boolean (true/false), no?

Take a look here for a good guide about doing lookbacks correctly.

The easier approach (in my opinion) is to have distinct function calls for your patterns.

An example using the new format:

Finally, I'll just point out that you are reinventing the wheel. There are plenty of these pattern-finding indicators already available.

If you're doing it as an exercise to learn, that is great! But I just thought I'd point it out in case you didn't know.

Good luck!


Thanks I am still newish to coding so will try and work in this format from now on :)
 
Michael Green:

BullishHammer=((Open[i]+Close[i])>(High[i]+Low[i]/3.0));

I am attempting to construct a hammer pattern signal in this case bullish where the body is a third the size of the candle high/low range. Can some one point me to where I am going wrong on this? and also how would I quantify this as the body being in the upper portion of the candle ??

Any help would be appreciated thanks Mickey !!

Here you have the code:Hammer
(((H-L)>3*(O-C)AND((C-L)/(.001+H-L)>0.6)AND((O-L)/(.001+H-L)>0.6)))

http://www.candlestickforum.com/PPF/Parameters/16_263_/candlestick.asp

       O = Open[1];

      O1 = Open[2];

      O2 = Open[3];

      H = High[1];

      H1 = High[2];

      H2 = High[3];

      L = Low[1];

      L1 = Low[2];

      L2 = Low[3];

      C = Close[1];

      C1 = Close[2];

      C2 = Close[3];

Tc pcf for Candlestick Signals - Personal Criteria Formulas written for TeleChart 2007
  • www.candlestickforum.com
The following criterias for Major Candlestick Signals is provided for your convenience. Follow TeleChart instructions for adding search criteria, then 'cut-and-paste' the formulas below. You will also find these posted in the Candlestick Forum club on TeleChart. Join Steve and fellow candlestick traders...
Reason: