CandleStick





//+------------------------------------------------------------------+
//|                                                  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);
  }





Sample





Analysis



Market Information Used:

Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains close prices for each bar
Series array that contains open prices of each bar
Series array that contains open time of each bar


Indicator Curves created:

Implements a curve of type DRAW_ARROW
Implements a curve of type DRAW_NONE


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: