//-----------------------------------------------------------------------------
//                                                 Mn Killing Zone             |
//-----------------------------------------------------------------------------

#property copyright "Mn"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 CLR_NONE
#property indicator_width1  0

extern int mHist = 400;    
extern int mMinFirstBars = 6;
extern int mBarsForCloseZone = 3;
extern double mFact  = 2;
extern double mMinBarSize = 20;

int mWidth = 1;
color mCol1 = Red, mCol2 = White, mCol3 = Aqua, mCol4 = Orange;

double mEndZone[], mHval, mLval;

int mWindow, mStartBar, mEndBar, mEndTime;
bool NoEndZone = true, mFirstNewNotSet = true;


//-----------------------------------------------------------------------------
void init()
 {
  SetIndexBuffer(0, mEndZone);
  SetIndexEmptyValue(0, 0);
  SetIndexStyle(0, DRAW_NONE);
  SetIndexArrow(0, 234);
  SetIndexDrawBegin(0, (Bars - mHist));
  mWindow = WindowFind("Gadi_OBV_v1.3");
  if(Digits == 3 || Digits == 5)
    mMinBarSize *= Point * 10;
  else
    mMinBarSize *= Point * 1;
  
  return(0);
 }

//-----------------------------------------------------------------------------
void start() 
 {
  int mTime;
  static int mCnt; 
  int mStartTime, mEndTime;
  
  if(Time[0] > mTime)
   {
     for (int i = mHist; i > mMinFirstBars; i--)        // Look for large move bar
       {
    //    if(High[i+1] - Low[i+1] > mMinBarSize && High[i+1] - Low[i+1] > (High[i+2] - Low[i+2]) * mFact)
        if(MathAbs(Open[i+1] - Close[i+1]) > mMinBarSize && MathAbs(Open[i+1] - Close[i+1]) > 
            MathAbs((Open[i+2] - Close[i+2])) * mFact)
          {
            mCnt++;
            mStartTime = Time[i];
            DrawStartZone(mCnt, mStartTime);
            DrawObvLvl(mCnt, mStartTime);

            while(NoEndZone && i > 0)
             {
               mStartBar = iBarShift(NULL, 0, mStartTime, true);
               CheckObvLevels(mCnt, i);
               CheckEndZone(i);
               i--;
             }
          }
       }
      mTime = Time[0];
   }

  return (0);
 }

//-----------------------------------------------------------------------------
void deinit()
 {
   for(int i = ObjectsTotal(); i >= 0; i--)
     if(StringSubstr(ObjectName(i), 0, 2) == "m.")
       ObjectDelete(ObjectName(i));
 }

//-----------------------------------------------------------------------------
void CheckObvLevels(int m1, int mCurrentBar)
 {
   if(iCustom(NULL, 0, "Gadi_OBV_v1.3", 0, mCurrentBar) < mLval)
      mLval = iCustom(NULL, 0, "Gadi_OBV_v1.3", 0, mCurrentBar);
   if(iCustom(NULL, 0, "Gadi_OBV_v1.3", 0, mCurrentBar) > mHval && 
      iCustom(NULL, 0, "Gadi_OBV_v1.3", 0, mCurrentBar) < 9999999)
      mHval = iCustom(NULL, 0, "Gadi_OBV_v1.3", 0, mCurrentBar);

   if(mStartBar - mCurrentBar <= mMinFirstBars)
     {
      ObjectSet("m.H"+m1, OBJPROP_PRICE1, mHval);
      ObjectSet("m.H"+m1, OBJPROP_PRICE2, mHval);
      ObjectSet("m.L"+m1, OBJPROP_PRICE1, mLval);
      ObjectSet("m.L"+m1, OBJPROP_PRICE2, mLval);
     }
      ObjectSet("m.H"+m1, OBJPROP_TIME2, Time[mCurrentBar]);
      ObjectSet("m.L"+m1, OBJPROP_TIME2, Time[mCurrentBar]);
 
   if(mStartBar - mCurrentBar > mMinFirstBars && mFirstNewNotSet && 
      (mHval > ObjectGet("m.H"+m1, 1) || mLval < ObjectGet("m.L"+m1, 1)))
     {
      ObjectSet("m.Hnew"+m1, OBJPROP_TIME1, Time[mCurrentBar]);
      ObjectSet("m.Lnew"+m1, OBJPROP_TIME1, Time[mCurrentBar]);
      mFirstNewNotSet = false;
     }
      ObjectSet("m.Hnew"+m1, OBJPROP_PRICE1, mHval);
      ObjectSet("m.Hnew"+m1, OBJPROP_PRICE2, mHval);
      ObjectSet("m.Hnew"+m1, OBJPROP_TIME2, Time[mCurrentBar]);
      ObjectSet("m.Lnew"+m1, OBJPROP_PRICE1, mLval);
      ObjectSet("m.Lnew"+m1, OBJPROP_PRICE2, mLval);
      ObjectSet("m.Lnew"+m1, OBJPROP_TIME2, Time[mCurrentBar]);

  return (0);
 }

//-----------------------------------------------------------------------------
bool CheckEndZone(int j)
 {
   static int mEzCnt;
   bool mClosingBars = false, mUpClose = false, mDownClose = false;
   
   if(mStartBar - j > mMinFirstBars + mBarsForCloseZone)   
    {
       for(int y = 0; y < mBarsForCloseZone; y++)
         if(Close[j+y] > Open[j+y])
          mUpClose = true;
         else
          {
            mUpClose = false;
            break;
          }
       for(y = 0; y < mBarsForCloseZone; y++)
         if(Close[j+y] < Open[j+y])
          mDownClose = true;
         else
          {
            mDownClose = false;
            break;
          }

         if(mUpClose || mDownClose)
           {
            mEzCnt++;
            ObjectCreate("m.EndZoneVL"+mEzCnt, OBJ_VLINE, 0, 0, 0, 0, 0);
            ObjectSet("m.EndZoneVL"+mEzCnt, OBJPROP_BACK, true);
            ObjectSet("m.EndZoneVL"+mEzCnt, OBJPROP_STYLE, 0);
            ObjectSet("m.EndZoneVL"+mEzCnt, OBJPROP_COLOR, mCol1);
            ObjectSet("m.EndZoneVL"+mEzCnt, OBJPROP_WIDTH, mWidth);
            ObjectSet("m.EndZoneVL"+mEzCnt, OBJPROP_TIME1, Time[j]);
            ObjectSet("m.EndZoneVL"+mEzCnt, OBJPROP_COLOR, mCol1);
            mEndTime = Time[j];
            mEndBar = iBarShift(NULL, 0, mEndTime, true);
            NoEndZone = false; 
            mFirstNewNotSet = true;
          }
    } // if

  return (0);
 }

//-----------------------------------------------------------------------------
void DrawStartZone(int m, int mTime)
 {
    ObjectCreate("m.StartZoneVL"+m, OBJ_VLINE, 0, 0, 0, 0, 0);
    ObjectSet("m.StartZoneVL"+m, OBJPROP_BACK, true);
    ObjectSet("m.StartZoneVL"+m, OBJPROP_STYLE, 0);
    ObjectSet("m.StartZoneVL"+m, OBJPROP_COLOR, mCol2);
    ObjectSet("m.StartZoneVL"+m, OBJPROP_WIDTH, mWidth);
    ObjectSet("m.StartZoneVL"+m, OBJPROP_TIME1, mTime);
    mHval = -9999999; mLval = 9999999;
    NoEndZone = true; 
    
  return (0);
 }

//-----------------------------------------------------------------------------
void DrawObvLvl(int z, int mObvTime)
 {
    ObjectCreate("m.H"+z, OBJ_TREND, mWindow, mObvTime, 0, mObvTime, 0);
    ObjectSet("m.H"+z, OBJPROP_BACK, true);
    ObjectSet("m.H"+z, OBJPROP_STYLE, 0);
    ObjectSet("m.H"+z, OBJPROP_COLOR, mCol3);
    ObjectSet("m.H"+z, OBJPROP_WIDTH, mWidth);
    ObjectSet("m.H"+z, OBJPROP_RAY, false);

    ObjectCreate("m.L"+z, OBJ_TREND, mWindow, mObvTime, 0, mObvTime, 0);
    ObjectSet("m.L"+z, OBJPROP_BACK, true);
    ObjectSet("m.L"+z, OBJPROP_STYLE, 0);
    ObjectSet("m.L"+z, OBJPROP_COLOR, mCol3);
    ObjectSet("m.L"+z, OBJPROP_WIDTH, mWidth);
    ObjectSet("m.L"+z, OBJPROP_RAY, false);

    ObjectCreate("m.Hnew"+z, OBJ_TREND, mWindow, mObvTime, 0, mObvTime, 0);
    ObjectSet("m.Hnew"+z, OBJPROP_BACK, true);
    ObjectSet("m.Hnew"+z, OBJPROP_STYLE, 0);
    ObjectSet("m.Hnew"+z, OBJPROP_COLOR, mCol4);
    ObjectSet("m.Hnew"+z, OBJPROP_WIDTH, mWidth);
    ObjectSet("m.Hnew"+z, OBJPROP_RAY, false);

    ObjectCreate("m.Lnew"+z, OBJ_TREND, mWindow, mObvTime, 0, mObvTime, 0);
    ObjectSet("m.Lnew"+z, OBJPROP_BACK, true);
    ObjectSet("m.Lnew"+z, OBJPROP_STYLE, 0);
    ObjectSet("m.Lnew"+z, OBJPROP_COLOR, mCol4);
    ObjectSet("m.Lnew"+z, OBJPROP_WIDTH, mWidth);
    ObjectSet("m.Lnew"+z, OBJPROP_RAY, false);
 
  return (0);
 }

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------

