//+------------------------------------------------------------------+
//|                                                  CandleStick.mq4 |
//|                                        Copyright � 2005, Profi_R |
//|                                               rvm_fam fromru  com |
//+------------------------------------------------------------------+
#property copyright "Copyright � 2005, Profi_R"
#property link      "rvm_fam fromru  com"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- input parameters
extern int Range=50;
extern int zv_amp=50;
extern int dj_body=20;
//---- buffers
double Up[]; //����� ����� ������ ������� ��� �������� ����
double Dn[]; //����� ����� ������ ������� ��� �������� �����
double MAmp[]; //����� ����� ������� ������� �������� ���������
double Character[]; //����� ����� ������� �������� �����
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(4);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexStyle(2,DRAW_NONE);
   SetIndexStyle(3,DRAW_NONE);
   SetIndexBuffer(0,Up);
   SetIndexBuffer(1,Dn);
   SetIndexBuffer(2,MAmp);
   SetIndexBuffer(3,Character);
   SetIndexArrow(0,242);
   SetIndexArrow(1,241);
   SetIndexDrawBegin(0,Range+1);
   SetIndexDrawBegin(1,Range+1);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   ObjectsDeleteAll(0,OBJ_TEXT);
   ObjectsDeleteAll(0,OBJ_ARROW);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted(),cb;
   double amp_lim,body_lim;
//---- 
   for(cb=Bars-1-counted_bars;cb>=0;cb--)
   {
      Amplitude_calc(cb); //�������� �������� ������� ��������� ��� ������� �����
      //��������� �������� ��� ����������� ����� � ����
      amp_lim=NormalizeDouble(MAmp[cb]*zv_amp/100,4);
      body_lim=NormalizeDouble((High[cb]-Low[cb])*dj_body/100,4);
      //���� ��������� ����� ��� ����� zv_amp% ������� ���������
      if(High[cb]-Low[cb]<=amp_lim)
      {
         if(MathAbs(Open[cb]-Close[cb])<=body_lim)
         {
            Character[cb]=2; //����
         }
         else
         {
            Character[cb]=1; //������
         }
      }
      else
      {
         if(MathAbs(Open[cb]-Close[cb])<=body_lim)
         {
            Character[cb]=2; //����
         }
         else
         {
            Character[cb]=0; //������� �����
         }
      }
//-------- ����� ���� ����������� ������� ������������
//����� � ���������� ������� ���� �� ����� dj_body% ���������, ������ ���� � ��� ���� ������ ����
      if(High[cb+2]-MathMax(Open[cb+2],Close[cb+2])<NormalizeDouble((High[cb+2]-Low[cb+2])*dj_body/100,4)&&
         MathAbs(Open[cb+2]-Close[cb+2])*2<MathMin(Open[cb+2],Close[cb+2])-Low[cb+2])
      {
         if(High[cb+2]==High[Highest(NULL,0,MODE_HIGH,6,cb+1)])
         {
            //������� ����� �� ����
            ObjectCreate("hanging "+(cb+2),OBJ_TEXT,0,Time[cb+2],High[cb+1]+10*Point);
            ObjectSetText("hanging "+(cb+2),"����������",9,"Times New Roman",Lime);
            //���������� �� �������, ������ ������� ����
            Up[cb]=High[cb]+10*Point;
         }
         if(Low[cb+2]==Low[Lowest(NULL,0,MODE_LOW,6,cb+1)])
         {
            //������� ����� �� ����
            ObjectCreate("hammer "+(cb+2),OBJ_TEXT,0,Time[cb+2],Low[cb+1]-10*Point);
            ObjectSetText("hammer "+(cb+2),"�����",9,"Times New Roman",Lime);
            //����� �����, ������ ������� �����
            Dn[cb]=Low[cb]-10*Point;
         }
      }
//������� ����� - ��� � ������� ���������� ���� � �������� ������
      if(Character[cb]==2&&High[cb]-Low[cb]>amp_lim&&
         Character[cb+1]==2&&High[cb+1]-Low[cb+1]>NormalizeDouble(MAmp[cb+1]*zv_amp/100,4)&&
         Character[cb+2]==2&&High[cb+2]-Low[cb+2]>NormalizeDouble(MAmp[cb+2]*zv_amp/100,4))
      {
         if(High[cb]==High[Highest(NULL,0,MODE_HIGH,7,cb)]||
            High[cb+1]==High[Highest(NULL,0,MODE_HIGH,7,cb)]||
            High[cb+2]==High[Highest(NULL,0,MODE_HIGH,7,cb)])
         {
            //������� ����� �� ����
            ObjectCreate("high wave "+cb,OBJ_TEXT,0,Time[cb],High[cb]+10*Point);
            ObjectSetText("high wave "+cb,"������� �����",9,"Times New Roman",Lime);
            //������� ����� ������� - �������� ����
            Up[cb]=High[cb]+10*Point;
         }
         if(Low[cb]==Low[Lowest(NULL,0,MODE_LOW,7,cb)]||
            Low[cb+1]==Low[Lowest(NULL,0,MODE_LOW,7,cb)]||
            Low[cb+2]==Low[Lowest(NULL,0,MODE_LOW,7,cb)])
         {
            //������� ����� �� ����
            ObjectCreate("high wave "+cb,OBJ_TEXT,0,Time[cb],Low[cb]-10*Point);
            ObjectSetText("high wave "+cb,"������� �����",9,"Times New Roman",Lime);
            //������� ����� ����� - �������� �����
            Dn[cb]=Low[cb]-10*Point;
         }
      }
//�������� ������
      if(Character[cb]==2 && MathMin(Open[cb],Close[cb])-Low[cb]<body_lim &&
         High[cb]-MathMax(Open[cb],Close[cb])>MathAbs(Open[cb]-Close[cb])*2 &&
         High[cb]==High[Highest(NULL,0,MODE_HIGH,4,cb)])
      {
         //������� ����� �� ����
         ObjectCreate("shooting star "+cb,OBJ_TEXT,0,Time[cb],High[cb]+10*Point);
         ObjectSetText("shooting star "+cb,"�������� ������",9,"Times New Roman",Lime);
         //�������� ������ - �������� ����
         Up[cb]=High[cb]+10*Point;
      }
//������
      if(Character[cb]==0 && Character[cb+1]==0)
      {
         if(Close[cb]>Open[cb] && Close[cb+1]<Open[cb+1] && Close[cb]<High[cb+1]-(High[cb+1]-Low[cb+1])/2)
         {
            //������� ����� �� ����
            ObjectCreate("thrusting fine "+cb,OBJ_TEXT,0,Time[cb],High[cb]+10*Point);
            ObjectSetText("thrusting fine "+cb,"������",9,"Times New Roman",Lime);
            //������ - ����������� ��������� ����
            Up[cb]=High[cb]+10*Point;
         }
         if(Close[cb]<Open[cb] && Close[cb+1]>Open[cb+1] && Close[cb]>Low[cb+1]+(High[cb+1]-Low[cb+1])/2)
         {
            //������� ����� �� ����
            ObjectCreate("thrusting fine "+cb,OBJ_TEXT,0,Time[cb],Low[cb]-10*Point);
            ObjectSetText("thrusting fine "+cb,"������",9,"Times New Roman",Lime);
            //������ - ����������� ��������� �����
            Dn[cb]=Low[cb]-10*Point;
         }
      }
//��������� ��������
      
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
void Amplitude_calc(int cb)
  {
//----
   int i,S_Ampl=0;
   for(i=cb+1;i<cb+Range;i++)
   {
      //����������� ����� ���� ��������
      S_Ampl=S_Ampl+(High[i]-Low[i]);
      //���������� �������� � ������ ����������
      MAmp[cb]=NormalizeDouble(S_Ampl/Range,4);
   }
//----
   return(0);
  }