Flat_Ind_v01

Author: Inkov Evgeni
9 Views
0 Downloads
0 Favorites
Flat_Ind_v01
//+------------------------------------------------------------------+
//|                                                 Flat_Ind_v01.mq4 |
//|  íà÷. 11/04/2016                                                 |
//+------------------------------------------------------------------+
#property copyright "Inkov Evgeni"
#property link      "ew123@mail.ru"
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
#property indicator_buffers 3
//+------------------------------------------------------------------+
input ENUM_TIMEFRAMES   TF = PERIOD_CURRENT;
input int   proc_deviation = 30;
input color clr            = clrPaleTurquoise;
//+------------------------------------------------------------------+
double buf [1000];
double buf1[1000];
double buf2[1000];
//+------------------------------------------------------------------+
bool   Bar_2 =true;
int    n=1;
string pref="PL_";
int    bar_pereschet=-1;
int    put_buf1=true;
//+------------------------------------------------------------------+
int OnInit()
{
   pref=pref+str_TF(TF)+"_";
   IndicatorShortName("Flat_Ind (P="+IntegerToString(proc_deviation)+"% TF="+str_TF(TF)+")");
   IndicatorBuffers(3);

   SetIndexBuffer(0, buf1);
   SetIndexStyle(0, DRAW_NONE);
   ArrayInitialize(buf1,0);
   
   SetIndexBuffer(1, buf2);
   SetIndexStyle(1, DRAW_NONE);
   ArrayInitialize(buf2,0);
   
   SetIndexBuffer(2, buf);
   SetIndexStyle(2, DRAW_NONE);
   ArrayInitialize(buf,0);
   
   bar_pereschet=-1;
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   remove_objects(pref);
}
//+------------------------------------------------------------------+
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[])
{
   int k=0; // ïåðåêëþ÷àòåëü áóôåðîâ
   if (rates_total!=prev_calculated || bar_pereschet==-1)
   {
      n=MathMin(Bars,1000)-2;
      ArrayInitialize(buf ,0);
      ArrayInitialize(buf1,0);
      ArrayInitialize(buf2,0);
      remove_objects(pref);
   }
   else
   {
      n=bar_pereschet;
      if (put_buf1)k++;
      for(int i=n;i>=0;i--)
      {
         buf [i]=0;
         if (put_buf1)
            buf1[i]=0;
         else
            buf2[i]=0;
      }
      if (put_buf1)
         opred_begin_Flat_Rect(buf1);
      else
         opred_begin_Flat_Rect(buf2);
   }
   //..................................
   bar_pereschet=-1;
   double t=0; // ðåçóëüòàò èçìåðåíèÿ äåâèàöèè
   int beg=0; // áàð íà÷àëà Flat_Rect
      // îïðåäåëèòü äåâèàöèþ áàðîâ â Flat_Rect (t>0 - áàð ïðèíàäëåæèò Flat_Rect)
   for(int i=n-1;i>=0;i--)
   {
      if (beg==0)
      {
         t=Check_2_Bar(i+1,i);
         if (t>0)
         {
            beg=i+1;
            bar_pereschet=beg;
            k++;
         }
      }
      else
      {
         t=Check_2_Bar(beg,i);
         if (t==0)beg=0;
      }
      //.....................
         // ðàñïðåäåëèòü èíô. ìåæäó áóôåðàìè
      if (MathMod(k,2)==0)
      {
         put_buf1=true;
         buf1[i]=t;
         buf2[i]=0;
      }
      else
      {
         put_buf1=false;
         buf1[i]=0;
         buf2[i]=t;
      }
      buf[i]=t;
   } 
   //.............................
   if (!Bar_2)
      for(int i=n-2;i>=2;i--) //óáðàòü îäèíî÷íûå
         if (buf[i-1]==0 && buf[i]>0 && buf[i+1]==0)
         {
            buf [i]=0.0;
            buf1[i]=0.0;
            buf2[i]=0.0;
         }
   //.............................
      // ñôîðìèðîâàòü ïðÿìîóãîëüíèêè
   For_Rect(buf1);
   For_Rect(buf2);
   //.............................
   return(rates_total);
}
//+------------------------------------------------------------------+
void opred_begin_Flat_Rect(double& BUF[])
{
   if (BUF[2]==0 && BUF[1]>0 && BUF[1]==0)
   {
      string name=pref+TimeToStr(iTime(NULL,TF,1),TIME_DATE)+"_"+TimeToStr(iTime(NULL,TF,1),TIME_MINUTES);
      if (ObjectFind(name)>=0)ObjectDelete(name);
   }
}
//---------------------------
void For_Rect(double& BUF[])
{
   for(int i=n-1;i>=0;i--) // äîáàâèòü ëåâûé áàð â êàæäîé Flat_Rect
      if (BUF[i+1]==0 && BUF[i]>0)
      {
         BUF[i+1]=BUF[i];
         buf[i+1]=buf[i];
      }
   //.............................
   int b=0;
   for(int i=n;i>=0;i--)
   { // íàéòè íà÷àëî è êîíåö Flat_Rect
      if (BUF[i+1]==0 && BUF[i]==0)b=0;
      if (BUF[i+1]==0 && BUF[i]>0)b=i;
      if (b>0 && BUF[i+1]>0) // âûâåñòè ïðÿìîóãîëüíèê
         if (i>0)
         {
            if (BUF[i]==0)
            {
               Out_rect(b,i+1);
               b=0;
            }
         }
         else
            if (BUF[0]>0)
               Out_rect(b,0);
            else
               Out_rect(b,1);
   }
}
//---------------------------------
double Check_2_Bar(int l,int r)
{
   // - ïî âñåì áàðàì ìåæäó ëåâûì(l) è ïðàâûì (r) îïðåä. ïàðàìåòðû ñðåäíåãî áàðà
   // - ïðîâåðèòü, ÷òî âñå áàðû Flat_Rect ïî ðàçáðîñó ñîîòâåòñòâóþò ñðåäíåìó áàðó
   //   åñëè íåò, òî íîâûé áàð íå âõîäèò â Flat_Rect
   //.................................
   // íàéòè ïàðàìåòðû ñðåäíåãî áàðà
   double Sum_H=0.0,Sum_L=0.0;
   for(int i=l;i>=r;i--)
   {
      Sum_H+=iHigh(NULL,TF,i);
      Sum_L+=iLow(NULL,TF,i);
   }
   double H_s =Sum_H/(l-r+1);
   double L_s =Sum_L/(l-r+1);
   double HL_s=(H_s-L_s)/Point;
   if (HL_s<1.0)return(0.0); // ò.ê. íóëåâîé ñðåäíèé áàð
   //.............................
      // îïðåäåëèòü ðàçáðîñ ïî High
   double Max_H=iHigh(NULL,TF,iHighest(NULL,TF,MODE_HIGH,l-r+1,r));
   double Min_H=iHigh(NULL,TF,iLowest (NULL,TF,MODE_HIGH,l-r+1,r));
   double d_Hr=MathAbs(Max_H-H_s)/Point;
   double d_Hl=MathAbs(Min_H-H_s)/Point;
   double Hr=d_Hr/HL_s;
   double Hl=d_Hl/HL_s;
   double maxH=MathMax(Hr,Hl)*100.0;
   if (maxH>proc_deviation)return(0);
   //..........................
      // îïðåäåëèòü ðàçáðîñ ïî Low
   double Max_L=iLow (NULL,TF,iHighest(NULL,TF,MODE_LOW, l-r+1,r));
   double Min_L=iLow (NULL,TF,iLowest (NULL,TF,MODE_LOW, l-r+1,r));
   double d_Lr=MathAbs(Max_L-L_s)/Point;
   double d_Ll=MathAbs(Min_L-L_s)/Point;
   double Lr=d_Lr/HL_s;
   double Ll=d_Ll/HL_s;
   double maxL=MathMax(Lr,Ll)*100.0;
   if (maxL>proc_deviation)return(0);
   //...............................
   double max=NormalizeDouble(MathMax(maxH,maxL),1);
   return(max);
}
//---------------------------------
void Out_rect(int B,int E)
{
   if (TF>0 && Period()>TF)return;
   //...........................
   string name=pref+TimeToStr(iTime(NULL,TF,B),TIME_DATE)+"_"+TimeToStr(iTime(NULL,TF,B),TIME_MINUTES);
   
   double H=iHigh(NULL,TF,iHighest(NULL,TF,MODE_HIGH,B-E+1,E));
   double L=iLow (NULL,TF,iLowest (NULL,TF,MODE_LOW, B-E+1,E));
   datetime t_E=Time[0];
   if (E>0)t_E=Time[iBarShift(NULL,0,iTime(NULL,TF,E-1))+1];
   if (ObjectFind(name)<0)ObjectCreate(name,OBJ_RECTANGLE,0,iTime(NULL,TF,B),H,t_E,L);
   
   ObjectSet(name,OBJPROP_TIME1,iTime(NULL,TF,B));
   ObjectSet(name,OBJPROP_PRICE1,H);
   ObjectSet(name,OBJPROP_TIME2,t_E);
   ObjectSet(name,OBJPROP_PRICE2,L);
   ObjectSet(name,OBJPROP_COLOR,clr);
}
//------------------------------------
void remove_objects(string PreName)
{
   string Obj_Name,Head;
   for(int k=ObjectsTotal()-1; k>=0; k--) 
   {
      Obj_Name=ObjectName(k);
      Head=StringSubstr(Obj_Name,0,StringLen(PreName));
      if (Head==PreName)ObjectDelete(Obj_Name);
   }
}
//----------------------------------------------
string str_TF(int n1)
{
   if (n1==0)n1=Period();
   switch(n1)
   {
      case PERIOD_M1:  return ("M1 ");
      case PERIOD_M5:  return ("M5");
      case PERIOD_M15: return ("M15");  
      case PERIOD_M30: return ("M30");
      case PERIOD_H1:  return ("H1");
      case PERIOD_H4:  return ("H4");
      case PERIOD_D1:  return ("D1");
      case PERIOD_W1:  return ("W1");
      case PERIOD_MN1: return ("MN1");
   }
   return("TF?");
}
//----------------------------

Comments