//+------------------------------------------------------------------+
//|                                            Bheurekso_pattern.mq4 |
//|                                                   ��������� �.�. |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "��������� �.�."
#property link      ""

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
//---- input parameters
extern bool       Arrow=true;
extern bool       Name=true;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,108);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,108);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
//----
	ObjectsDeleteAll(0,OBJ_TEXT);
	ObjectsDeleteAll(0,OBJ_ARROW);
	//DelArrow(0,0); 
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }

//+------------------------------------------------------------------+
//SetArrow(t[shift1],l[shift1]-15*Point,241,LIME);
void SetArrow(int sh, datetime tm, double pr, int cod,color clr)
{
	ObjectCreate("Arrow-"+cod+"-"+sh,OBJ_ARROW,0,tm,pr);
	ObjectSet("Arrow-"+cod+"-"+sh,OBJPROP_ARROWCODE,cod);
	ObjectSet("Arrow-"+cod+"-"+sh,OBJPROP_COLOR,clr);
}
//SetText(t[shift1],l[shift1]-28*Point,"Engulfing",LIME);
void SetText(int sh,datetime tm,double pr,string text,color clr)
{
	ObjectCreate(text+"-"+sh,OBJ_TEXT,0,tm,pr);
	ObjectSetText(text+"-"+sh,text);
	ObjectSet(text+"-"+sh,OBJPROP_COLOR,clr);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
	int    counted_bars=IndicatorCounted();
//---- 
	int myBars=0, StartBar=0;//, Kedip(false);
	int shift=0, shift1=0, shift2=0, shift3=0;
	bool BullEngulf=False, MorningStar=False, BullPierce=False, Hammer=False;
	bool BearEngulf=False, EveningStar=False, DarkCloud=False, Shooter=False;
	bool Harami=False;
	int limit;
   
	if(myBars!=Bars) 
	{ 
		myBars=Bars; 
	}
   limit=Bars-counted_bars;
	for(shift=limit;shift>=0;shift--) 
	{
		// Manjakan MT
		shift1=shift+1;
		shift2=shift+2;
		shift3=shift+3;

		//*** periksa pola bullish***
		//***************************
		
		//--- Bullish Engulfing (2 bars)
		if((Close[shift2]<Open[shift2]) && (Open[shift1]<Close[shift2]) && //| l[shift1] < l[shift2]) & 
				(Close[shift1]>Open[shift2])) 
			BullEngulf=True;
		else 
			BullEngulf=False;
		
		//--- Bullish Piercing (2 bars) cuma cari kalo ga ada BullEngulf
		if(!BullEngulf)
		{
			if((Close[shift2]<Open[shift2]) && (Close[shift1]>Open[shift1]) && 
					((Open[shift1]<Close[shift2]) || (Low[shift1]<Low[shift2])) && 
					(Close[shift1]>Close[shift2]+((Open[shift2]-Close[shift2])/2))) 
				BullPierce=True;
			else 
				BullPierce=False;
		}
		else 
		{
			BullPierce=False;
		}
		
		// Morning Star (3 bars)
		if((Close[shift3]<Open[shift3]) && (Open[shift2]<Close[shift3]) && (Close[shift2]<Close[shift3]) &&
				((Open[shift1]>Close[shift2]) || (High[shift1]>High[shift2])) && (Close[shift1]>=Close[shift3]))
			MorningStar=True;
		else
			MorningStar=False;
		
		// Hammer
		if((Close[shift1]>Open[shift1]) && 
				(Open[shift1]-Low[shift1]>MathMax(High[shift1]-Close[shift1],Close[shift1]-Open[shift1])*3))
			Hammer=True;
		else 
			Hammer=False;
		
		//*** periksa pola bearish***
		//***************************
		
		//--- Bearish Engulfing (2 bars)
		if((Close[shift2]>Open[shift2]) && (Close[shift1]<Open[shift1]) && (Open[shift1]>Close[shift2]) &&
				((Close[shift1]<Open[shift2]) || (Low[shift1]<Low[shift2])))
			BearEngulf=True;
		else
			BearEngulf=False;
		
		//--- Bearish Dark Cloud (2 bars) cuma cari kalo ga ada BearEngulf
		if(!BearEngulf)
		{
			if((Close[shift2]>Open[shift2]) && ((Open[shift1]>Close[shift2]) || (High[shift1]>High[shift2])) &&
					(Close[shift1]<Close[shift2]-((Close[shift2]-Open[shift2])/2)))
				DarkCloud=True;
			else 
				DarkCloud=False;
		}
		else 
		{
			DarkCloud=False;
		}
		
		// Evening Star (3 bars)
		if((Close[shift3]>Open[shift3]) && (Open[shift2]>Close[shift3]) && (Close[shift2]>Close[shift3]) && 
				((Open[shift1]<Close[shift2]) || (Low[shift1]<Low[shift2])) && (Close[shift1]<Close[shift3]))
			EveningStar=True;
		else 
			EveningStar=False;
		
		// Shooting Star 
		if((Close[shift1]<Open[shift1]) && (High[shift1]-Open[shift1]>MathMax(Close[shift1]-Low[shift1],Open[shift1]-Close[shift1])*3)) 
			Shooter=True;
		else
			Shooter=False;
		
		// Kasih keterangan dan panah Bullish di chart
		if(BullEngulf)
		{
			if(Name)
				SetText(shift,Time[shift1],Low[shift1]-28*Point,"Engulfing",Lime);
			if(Arrow)
				SetArrow(shift1,Time[shift1],Low[shift1]-20*Point,241,Lime);
		}
		else 
		{
			if(BullPierce)
			{
				if(Name)
					SetText(shift1,Time[shift1],Low[shift1]-23*Point,"Piercing",White);
				if(Arrow)
					SetArrow(shift1,Time[shift1],Low[shift1]-15*Point,241,Lime);
			}
		}
		
		if(MorningStar)
		{
			if(Name)
				SetText(shift2,Time[shift2],Low[shift2]-18*Point,"Morning Star",Magenta);
			if(Arrow)
				SetArrow(shift2,Time[shift2],Low[shift2]-10*Point,241,Lime);
		}
		

		if(Hammer)
		{
			if(Name)
				SetText(shift1,Time[shift1],Low[shift1]-13*Point,"Hammer",Lime);
			if(Arrow)
				SetArrow(shift1,Time[shift1],Low[shift1]-5*Point,241,Lime);
		}
		
		// Kasih keterangan dan panah Bearish di chart
		if(BearEngulf)
		{
			if(Name)
				SetText(shift1,Time[shift1],High[shift1]+28*Point,"Engulfing",OrangeRed);
			if(Arrow)
				SetArrow(shift1,Time[shift1],High[shift1]+20*Point,242,OrangeRed);
		}
		else 
		{
			if(DarkCloud)
			{
				if(Name)
					SetText(shift1,Time[shift1],High[shift1]+23*Point,"Dark Cloud",White);
				if(Arrow)
					SetArrow(shift1,Time[shift1],High[shift1]+15*Point,242,OrangeRed);
			}
		}
		
		if(EveningStar)
		{
			if(Name)
				SetText(shift2,Time[shift2],High[shift2]+18*Point,"Evening Star",Magenta);
			if(Arrow)
				SetArrow(shift2,Time[shift2],High[shift2]+10*Point,242,OrangeRed);
		}
		
		if(Shooter)
		{
			if(Name)
				SetText(shift1,Time[shift1],High[shift1]+13*Point,"Shooting",OrangeRed);
			if(Arrow)
				SetArrow(shift1,Time[shift1],High[shift1]+5*Point,242,OrangeRed);
		}
		

		// Tampilkan disaat ada konfirmasi.


		if( (BullEngulf || BullPierce || MorningStar || Hammer) && 
				(Close[shift]>Open[shift]))
			ExtMapBuffer1[shift] = Low[shift]-7*Point;
		else 
			ExtMapBuffer1[shift] = 0.0;

		if( (BearEngulf || DarkCloud || EveningStar || Shooter) && 
				(Close[shift]<Open[shift]))
			ExtMapBuffer2[shift] = High[shift]+7*Point;
		else 
			ExtMapBuffer2[shift] = 0.0;

		StartBar-=1;
	}
	
	
	
	
//----
   return(0);
}
//+------------------------------------------------------------------+