/*
   Created by Asteris, modified by Cubicrey [March, 2010]
   Website: http://www.indo-investasi.com
   
*/

#property indicator_chart_window

extern int ADR_Period = 2;
extern int ATR_Period = 7;
extern string Mode.= "0 = ADR (Avg Daily Range)";
extern string _= "1 = ATR (Avg True Range)";
extern int Mode=1;
extern int Show_WADR_Levels=1;
extern string Note = "WADR levels will be disabled";
extern string _.= "automatically when Mode=1";
extern int Corner = 0;
int gi_unused_80 = 0;
double gd_84 = 0.0;
double gd_80 = 70.0; //70%
double gd_88 = 50.0; //50%

extern color Level0= Red;
extern int Style0 = 0;
extern int Width0 = 3;
extern color Level1= DarkOrange;
extern int Style1 = 0;
extern int Width1 = 2;
extern color Level2 = Blue;
extern int Style2 = 0;
extern int Width2 = 2;
extern color Level3 = Green;
extern int Style3 = 0;
extern int Width3 = 2;
extern color Level4 = Magenta;
extern int Style4 = 0;
extern int Width4 = 2;
extern color Level5 = BlueViolet;
extern int Style5 = 2;
extern int Width5 = 1;

datetime LabelShiftTime;

//#define OBJ_NAME "show_comment"


int init() {
   if (StringFind(Symbol(), "JPY") != -1) {
      gi_unused_80 = 2;
      gd_84 = 0.01;
   } else {
      gd_84 = 0.0001;
      gi_unused_80 = 4;
   }
   return (0);
}

int deinit() {
   DrawLevel("M=Middle=(TodayHi+TodayLo)/2", 0, Style0, Width0, Level0);
   DrawLevel("H1=M+(ATR/2)", 0, Style1, Width1, Level1);
   DrawLevel("L1=M-(ATR/2)", 0, Style1, Width1, Level1);
   DrawLevel("H2=M+0.7(ATR/2)", 0, Style2, Width2, Level2);
   DrawLevel("L2=M-0.7(ATR/2)", 0, Style2, Width2, Level2);
   DrawLevel("H3=M+0.5(ATR/2)", 0, Style3, Width3, Level3);
   DrawLevel("L3=M-0.5(ATR/2)", 0, Style3, Width3, Level3);
   DrawLevel("ATR("+ATR_Period+") Projection High", 0, Style5, Width5, Level5);
   DrawLevel("ATR("+ATR_Period+") Projection Low", 0, Style5, Width5, Level5);
   
   DrawLevel("Previous_Friday_Close", 0, Style0, Width0, Level0);
   DrawLevel("WK_Hi", 0, Style1, Width1, Level1);
   DrawLevel("WK_Lo", 0, Style1, Width1, Level1);
   DrawLevel("WK_Mid_Hi", 0, Style2, Width2, Level2);
   DrawLevel("WK_Mid_Lo", 0, Style2, Width2, Level2);
   DrawLevel("WK_Ex_Hi_1", 0, Style3, Width3, Level3);
   DrawLevel("WK_Ex_Lo_1", 0, Style3, Width3, Level3);
   DrawLevel("WK_Ex_Hi_2", 0, Style4, Width4, Level4);
   DrawLevel("WK_Ex_Lo_2", 0, Style4, Width4, Level4);
   DrawLevel("ADR("+ADR_Period+")Hi", 0, Style5, Width5, Level5);
   DrawLevel("ADR("+ADR_Period+")Lo", 0, Style5, Width5, Level5);
   
   //ObjectDelete(OBJ_NAME);
   
      
   return (0);
}

int start() {
   if (Mode==0)
  {int l_ind_counted_16 = IndicatorCounted();
   double ld_20 = 0;
   for (int li_28 = 1; li_28 <= ADR_Period; li_28++) ld_20 += iHigh(NULL, PERIOD_D1, li_28) - iLow(NULL, PERIOD_D1, li_28);
   ld_20 /= ADR_Period;
   double ld_8 = ld_20 / gd_84; //ADR()
   double ld_32 = 0;
   for (li_28 = 1; li_28 <= 5; li_28++) ld_32 += iHigh(NULL, PERIOD_D1, li_28) - iLow(NULL, PERIOD_D1, li_28);
   ld_32 /= 5.0 * gd_84; //ADR(Weekly)
   double ld_40 = 0;
   for (li_28 = 1; li_28 <= 20; li_28++) ld_40 += iHigh(NULL, PERIOD_D1, li_28) - iLow(NULL, PERIOD_D1, li_28);
   ld_40 /= 20.0 * gd_84; //ADR(Monthly)
   double ld_48 = 0;
   for (li_28 = 1; li_28 <= 180; li_28++) ld_48 += iHigh(NULL, PERIOD_D1, li_28) - iLow(NULL, PERIOD_D1, li_28);
   ld_48 /= 180.0 * gd_84; //ADR(180 days)
   double ld_56 = ld_20 / 2.0; //ADR()/2
   double l_iopen_64 = iOpen(NULL, PERIOD_D1, 0); //Today Open
   double ld_72 = l_iopen_64 + ld_56; //ADR() High
   double ld_80 = l_iopen_64 - ld_56; //ADR() Low
   double ld_88 = iHigh(NULL, PERIOD_D1, 0);  //Today high
   double ld_96 = iLow(NULL, PERIOD_D1, 0);    //Today Low
   double ld_104 = ld_88 - ld_96;
   double ld_112 = (iHigh(NULL, PERIOD_D1, 1) - iLow(NULL, PERIOD_D1, 1)) / gd_84; //yesterday daily range
   double ld_0 = ld_104 / gd_84; //Today Range
   
   double WADR = (ld_32+ld_40)*gd_84/2;
   double Previous_Friday_close = iClose(NULL, PERIOD_W1, 1);
   double WADR_high = WADR + Previous_Friday_close;
   double WADR_low = Previous_Friday_close - WADR;
   double WADR_Mid_high = NormalizeDouble((WADR/2 + Previous_Friday_close), Digits);
   double WADR_Mid_low = NormalizeDouble((Previous_Friday_close - WADR/2), Digits);
   double WADR_Ex_high_1 = NormalizeDouble((WADR*1.5 + Previous_Friday_close), Digits);
   double WADR_Ex_low_1 = NormalizeDouble((Previous_Friday_close - WADR*1.5), Digits);
   double WADR_Ex_high_2 = NormalizeDouble((WADR*2 + Previous_Friday_close), Digits);
   double WADR_Ex_low_2 = NormalizeDouble((Previous_Friday_close - WADR*2), Digits);
   
   DrawLevel("ADR("+ADR_Period+")Hi", ld_72, Style5, Width5, Level5);
   DrawLevel("ADR("+ADR_Period+")Lo", ld_80, Style5, Width5, Level5);   
  } 
   else
 { int l_ind_counted_17 = IndicatorCounted();
   double ATR = iATR(NULL, PERIOD_D1, ATR_Period, 0) / gd_84; //ATR()
   double ATR_weekly = iATR(NULL, PERIOD_D1, 5, 0) / gd_84; //weekly=5Days
   double ATR_monthly = iATR(NULL, PERIOD_D1, 20, 0) / gd_84; //monthly=22Days
   double ATR_180 = iATR(NULL, PERIOD_D1, 180, 0) / gd_84; //ATR(180)Days
   double ATR_projection_high = iLow(NULL, PERIOD_D1, 0) + ATR * gd_84; 
   double ATR_projection_low = iHigh(NULL, PERIOD_D1, 0) - ATR * gd_84; 
   double TrueRange_Today = iATR(NULL, PERIOD_D1, 1, 0)/ gd_84;
   double TodayRange_projection_high = iLow(NULL, PERIOD_D1, 0) + TrueRange_Today * gd_84;  
   double TodayRange_projection_low = iHigh(NULL, PERIOD_D1, 0) - TrueRange_Today * gd_84;   
   double TrueRange_Yesterday = iATR(NULL, PERIOD_D1, 1, 1) / gd_84; //yesterday ATR
 } 
    
   if (Mode==0)
  {Comment(" ADR :- (Yesterday)=", NormalizeDouble(ld_112, 0), "      (Weekly)=", NormalizeDouble(ld_32, 0), "      (Monthly)=", NormalizeDouble(ld_40, 0), "      (180 Days)=", NormalizeDouble(ld_48, 0), 
   "\n ==================================================", 
   "\n Today Range  [Hi/Lo] = ", NormalizeDouble(ld_0, 0), " [ ", DoubleToStr(NormalizeDouble(ld_88, 4),4), " / ", DoubleToStr(NormalizeDouble(ld_96, 4),4), " ]", "   // Pips to Today Hi/Lo  = ", NormalizeDouble((ld_88-Bid) / gd_84, 0), "/", NormalizeDouble((Bid-ld_96) / gd_84, 0),
   "\n ADR("+ ADR_Period +")          [Hi/Lo] = ", NormalizeDouble(ld_8, 0), " [ ", DoubleToStr(NormalizeDouble(ld_72, 4),4), " / ", DoubleToStr(NormalizeDouble(ld_80, 4),4), " ]", "  //  Pips to ADR("+ ADR_Period +") Hi/Lo = ", NormalizeDouble((ld_72 - Bid) / gd_84, 0), "/", NormalizeDouble((Bid - ld_80) / gd_84, 0));
  }
   else
  {Comment(" ATR :- (Yesterday)=", NormalizeDouble(TrueRange_Yesterday,0), "      (Weekly)=", NormalizeDouble(ATR_weekly,0), "      (Monthly)=", NormalizeDouble(ATR_monthly,0), "      (180 Days)=", NormalizeDouble(ATR_180,0),
   "\n ==================================================", 
   "\n Today_TR [Hi/Lo] = ", NormalizeDouble(TrueRange_Today,0), " [ ", DoubleToStr(NormalizeDouble(TodayRange_projection_high,4),4), " / ", DoubleToStr(NormalizeDouble(TodayRange_projection_low,4),4), " ]", "   // Pips to Today_TR Hi/Lo  = ", NormalizeDouble((TodayRange_projection_high-Bid) / gd_84, 0), "/", NormalizeDouble((Bid-TodayRange_projection_low) / gd_84, 0), 
   "\n ATR("+ ATR_Period +")      [Hi/Lo] = ", NormalizeDouble(ATR,0), " [ ", DoubleToStr(NormalizeDouble(ATR_projection_high,4),4), " / ", DoubleToStr(NormalizeDouble(ATR_projection_low,4),4), " ]", "  //  Pips to ATR("+ ATR_Period +") Hi/Lo      = ", NormalizeDouble((ATR_projection_high - Bid) / gd_84, 0), "/", NormalizeDouble((Bid - ATR_projection_low) / gd_84, 0)); 
  } 
   
   if (Mode==1)
  {double ATR_mid = ATR * gd_84 / 2.0; //middle of ATR()//ld_124
   double ATR_mid_price = (iHigh(NULL, PERIOD_D1, 0) - iLow(NULL, PERIOD_D1, 0)) / 2.0 + iLow(NULL, PERIOD_D1, 0); //ld_132//midpoint of today range
   ATR_mid_price = NormalizeDouble(ATR_mid_price, Digits);
   double ld_140 = ATR_mid_price + ATR_mid; //midpoint of today range + middle of ATR()//High 1// R3
   ld_140 = NormalizeDouble(ld_140, Digits);
   double ld_148 = ATR_mid_price + ATR_mid * (gd_80 / 100.0);//70% of middle of ATR()//High 2// R2
   ld_148 = NormalizeDouble(ld_148, Digits);
   double ld_156 = ATR_mid_price + ATR_mid * (gd_88 / 100.0);//50% of middle of ATR()//High 3// R1
   ld_156 = NormalizeDouble(ld_156, Digits);
   double ld_164 = ATR_mid_price - ATR_mid;//Low 1
   ld_164 = NormalizeDouble(ld_164, Digits);
   double ld_172 = ATR_mid_price - ATR_mid * (gd_80 / 100.0);//Low 2
   ld_172 = NormalizeDouble(ld_172, Digits);
   double ld_180 = ATR_mid_price - ATR_mid * (gd_88 / 100.0);//Low 3
   ld_180 = NormalizeDouble(ld_180, Digits);
   double ATRhi = NormalizeDouble(ATR_projection_high, Digits);
   double ATRlo = NormalizeDouble(ATR_projection_low, Digits);
   
   DrawLevel("M=Middle=(TodayHi+TodayLo)/2", ATR_mid_price, Style0, Width0, Level0);
   DrawLevel("H1=M+(ATR/2)", ld_140, Style1, Width1, Level1);
   DrawLevel("H2=M+0.7(ATR/2)", ld_148, Style2, Width2, Level2);
   DrawLevel("H3=M+0.5(ATR/2)", ld_156, Style3, Width3, Level3);
   DrawLevel("L1=M-(ATR/2)", ld_164, Style1, Width1, Level1);
   DrawLevel("L2=M-0.7(ATR/2)", ld_172, Style2, Width2, Level2);
   DrawLevel("L3=M-0.5(ATR/2)", ld_180, Style3, Width3, Level3);
   DrawLevel("ATR("+ATR_Period+") Projection High", ATRhi, Style5, Width5, Level5);
   DrawLevel("ATR("+ATR_Period+") Projection Low", ATRlo, Style5, Width5, Level5);
   
  }
   
   if (Show_WADR_Levels==1)
  {
   DrawLevel("Previous_Friday_Close", Previous_Friday_close, Style0, Width0, Level0);
   DrawLevel("WK_Hi", WADR_high, Style1, Width1, Level1);
   DrawLevel("WK_Mid_Hi", WADR_Mid_high, Style2, Width2, Level2);
   DrawLevel("WK_Ex_Hi_1", WADR_Ex_high_1, Style3, Width3, Level3);
   DrawLevel("WK_Ex_Hi_2", WADR_Ex_high_2, Style4, Width4, Level4);
   DrawLevel("WK_Lo", WADR_low, Style1, Width1, Level1);
   DrawLevel("WK_Mid_Lo", WADR_Mid_low, Style2, Width2, Level2);
   DrawLevel("WK_Ex_Lo_1", WADR_Ex_low_1, Style3, Width3, Level3);
   DrawLevel("WK_Ex_Lo_2", WADR_Ex_low_2, Style4, Width4, Level4);
   
  } 
   return (0);
}
   
void DrawLevel(string a_name_0, double ad_8, int a_style_16,int Width, color a_color_20) 
{
   double l_price_24 = ad_8;
   double l_price_32 = ad_8;
   int l_time_40; //= Time[iBarShift(NULL, 0, StrToTime(Year() + "." + Month() + "." + Day() + " " + 0 + ":" + 0))];
   int l_datetime_44; //= Time[0];
   double diff=Time[0] - Time[1];  
     l_time_40=Time[0]+1*diff;
     l_datetime_44=Time[0] + 6 * diff;
   
   if (ad_8 > 0.0) {
      if (ObjectFind(a_name_0) != 0) {
         ObjectCreate(a_name_0, OBJ_TREND, 0, l_time_40, l_price_24, l_datetime_44, l_price_32);
         ObjectSet(a_name_0, OBJPROP_RAY, False);
         ObjectSet(a_name_0, OBJPROP_COLOR, a_color_20);
         ObjectSet(a_name_0, OBJPROP_WIDTH, Width);
         ObjectSet(a_name_0, OBJPROP_STYLE, a_style_16);
         return;
      }
      ObjectSet(a_name_0, OBJPROP_RAY, False);
      ObjectMove(a_name_0, 0, l_time_40, l_price_24);
      ObjectMove(a_name_0, 1, l_datetime_44, l_price_32);
      ObjectSet(a_name_0, OBJPROP_COLOR, a_color_20);
      ObjectSet(a_name_0, OBJPROP_WIDTH, Width);
      ObjectSet(a_name_0, OBJPROP_STYLE, a_style_16);
      return;
   }
   if (ObjectFind(a_name_0) >= 0) ObjectDelete(a_name_0);
} 
 
   
   
   
   
   
   



