//+------------------------------------------------------------------+
//|                                               KG LSMA V 1.3b.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//|                                             Thanks to KG from VN |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "kgforexworld.com"

#property indicator_chart_window
#property indicator_buffers 5

extern int Corner=1;
extern int Price_Type=0;
int MA_Mode=0;
extern color LSMA_Month_Color=Aqua;
extern color LSMA_Week_Color=Magenta;
extern color LSMA_Day_Color=Lime;
extern color LSMA_8H_Color=Yellow;
extern color LSMA_4H_Color=Blue;
//---- buffers
double LSMAMonth[];
double LSMAWeek[];
double LSMA24H[];
double LSMA8H[];
double LSMA4H[];
int    PerMonth;
int    PerWeek;
int    Per24H;
int    Per8H;
int    Per4H;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,0,3,LSMA_Month_Color);
   SetIndexBuffer(0,LSMAMonth);
   SetIndexLabel(0,"LSMA Month");
   SetIndexStyle(1,DRAW_LINE,0,3,LSMA_Week_Color);
   SetIndexBuffer(1,LSMAWeek);
   SetIndexLabel(1,"LSMA Week");
   SetIndexStyle(2,DRAW_LINE,0,3,LSMA_Day_Color);
   SetIndexBuffer(2,LSMA24H);
   SetIndexLabel(2,"LSMA Day");
   SetIndexStyle(3,DRAW_LINE,0,3,LSMA_8H_Color);
   SetIndexBuffer(3,LSMA8H);
   SetIndexLabel(3,"LSMA 8H");
   SetIndexStyle(4,DRAW_LINE,0,3,LSMA_4H_Color);
   SetIndexBuffer(4,LSMA4H);
   SetIndexLabel(4,"LSMA 4H");
   
   string label1 = "KG LSMA Month";
   ObjectDelete(label1);
   ObjectCreate( label1, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label1,"Monthly LSMA",8, "Arial Bold", LSMA_Month_Color);
   ObjectSet( label1, OBJPROP_CORNER, Corner );
   ObjectSet( label1, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label1, OBJPROP_YDISTANCE, 10 );
   
   string label2 = "KG LSMA Week";
   ObjectDelete(label2);
   ObjectCreate( label2, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label2,"Weekly LSMA",8, "Arial Bold", LSMA_Week_Color);
   ObjectSet( label2, OBJPROP_CORNER, Corner );
   ObjectSet( label2, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label2, OBJPROP_YDISTANCE, 20 );
   
   string label3 = "KG LSMA Day";
   ObjectDelete(label3);
   ObjectCreate( label3, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label3,"Daily LSMA",8, "Arial Bold", LSMA_Day_Color);
   ObjectSet( label3, OBJPROP_CORNER, Corner );
   ObjectSet( label3, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label3, OBJPROP_YDISTANCE, 30 );
   
   string label4 = "KG LSMA 8H";
   ObjectDelete(label4);
   ObjectCreate( label4, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label4,"8H LSMA",8, "Arial Bold", LSMA_8H_Color);
   ObjectSet( label4, OBJPROP_CORNER, Corner );
   ObjectSet( label4, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label4, OBJPROP_YDISTANCE, 40 );
   
   string label5 = "KG LSMA 4H";
   ObjectDelete(label5);
   ObjectCreate( label5, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label5,"4H LSMA",8, "Arial Bold", LSMA_4H_Color);
   ObjectSet( label5, OBJPROP_CORNER, Corner );
   ObjectSet( label5, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label5, OBJPROP_YDISTANCE, 50 );
   
   string label6 = "KG Range";
   ObjectDelete(label6);
   ObjectCreate( label6, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label6,"AvR",8, "Arial Bold", Lime);
   ObjectSet( label6, OBJPROP_CORNER, Corner );
   ObjectSet( label6, OBJPROP_XDISTANCE, 103 );
   ObjectSet( label6, OBJPROP_YDISTANCE, 70 );

   string label7 = "KG CurRange";
   ObjectDelete(label7);
   ObjectCreate( label7, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label7,"CuR",8, "Arial Bold", Red);
   ObjectSet( label7, OBJPROP_CORNER, Corner );
   ObjectSet( label7, OBJPROP_XDISTANCE, 130 );
   ObjectSet( label7, OBJPROP_YDISTANCE, 70 );
      
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   for(int i = ObjectsTotal() - 1; i >= 0; i--)
     {
       string label = ObjectName(i);
       if(StringFind(label, "KG LSMA", 0) < 0)
       if(StringFind(label, "Sign", 0) < 0)
       if(StringFind(label, "Average", 0) < 0)
       if(StringFind(label, "Current", 0) < 0)
       if(StringFind(label, "KG Range", 0) < 0)
       if(StringFind(label, "KG CurRange", 0) < 0)
           continue;
       ObjectDelete(label);   
     }   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
///////////////////////////////////////////////
//average range KG formula code by metropolis//  
//////////////////////////////////////////////////////////////////////
int avg4H,avg8H,avgDay,avgWeek,avgMonth,cur4H,cur8H,curDay,curWeek,curMonth;
/////////////////////  H4
for(int h4=6;h4>0;h4--)
double rangeh4 = rangeh4 + (iHigh(NULL,240,h4)-iLow(NULL,240,h4));
avg4H = (rangeh4/6)/Point;
double h4low0  =  iLow(NULL,240,0);
double h4high0 =  iHigh(NULL,240,0);
cur4H = (h4high0-h4low0)/Point;

///////////////////// H8
for(int h8=30;h8>0;h8--)
double rangeh8 = rangeh8 + (iHigh(NULL,240,h8)-iLow(NULL,240,h8));
avg8H = (rangeh8/30)/Point;
double h8low0  =  iLow(NULL,240,0);
double h8high0 =  iHigh(NULL,240,0);
cur8H = (h8high0-h8low0)/Point;

/////////////////////  Daily
for(int d1=20;d1>0;d1--)
double ranged1 = ranged1 + (iHigh(NULL,1440,d1)-iLow(NULL,1440,d1));
avgDay = (ranged1/20)/Point;
double dlow0  =  iLow(NULL,1440,0);
double dhigh0 =  iHigh(NULL,1440,0);
curDay = (dhigh0-dlow0)/Point;

/////////////////////  Weekly
for(int w1=16;w1>0;w1--)
double rangew1 = rangew1 + (iHigh(NULL,10080,w1)-iLow(NULL,10080,w1));
avgWeek = (rangew1/16)/Point;
double wlow0  =  iLow(NULL,10080,0);
double whigh0 =  iHigh(NULL,10080,0);
curWeek = (whigh0-wlow0)/Point;

/////////////////////  Monthly
for(int mn1=12;mn1>0;mn1--)
double rangemn1 = rangemn1 + (iHigh(NULL,43200,mn1)-iLow(NULL,43200,mn1));
avgMonth = (rangemn1/12)/Point;
double mlow0  =  iLow(NULL,43200,0);
double mhigh0 =  iHigh(NULL,43200,0);
curMonth = (mhigh0-mlow0)/Point;

//////////////////////////////////////////////////////////////////////
 
   int    counted_bars=IndicatorCounted();
//----
   int ActivePer=Period();
   PerMonth=28800/ActivePer;
   PerWeek=7200/ActivePer;
   Per24H=1440/ActivePer;
   Per8H=480/ActivePer;
   Per4H=240/ActivePer;
   int limit=Bars-counted_bars;
   if(counted_bars>0) limit++;
   for(int i=0; i<limit; i++)
   { 
      LSMAMonth[i]=3*iMA(Symbol(),0,PerMonth,0,MODE_LWMA,Price_Type,i)-2*iMA(Symbol(),0,PerMonth,0,MODE_SMA,Price_Type,i);
      LSMAWeek[i]=3*iMA(Symbol(),0,PerWeek,0,MODE_LWMA,Price_Type,i)-2*iMA(Symbol(),0,PerWeek,0,MODE_SMA,Price_Type,i);
      LSMA24H[i]=3*iMA(Symbol(),0,Per24H,0,MODE_LWMA,Price_Type,i)-2*iMA(Symbol(),0,Per24H,0,MODE_SMA,Price_Type,i);
      LSMA8H[i]=3*iMA(Symbol(),0,Per8H,0,MODE_LWMA,Price_Type,i)-2*iMA(Symbol(),0,Per8H,0,MODE_SMA,Price_Type,i);
      LSMA4H[i]=3*iMA(Symbol(),0,Per4H,0,MODE_LWMA,Price_Type,i)-2*iMA(Symbol(),0,Per4H,0,MODE_SMA,Price_Type,i);
   }
   
   string Sign;
   string Average;
   string Current;
   double MAOpen=3*iMA(Symbol(),0,PerMonth,0,MODE_LWMA,Price_Type,1)-2*iMA(Symbol(),0,PerMonth,0,MODE_SMA,Price_Type,1);
   double MAClose=3*iMA(Symbol(),0,PerMonth,0,MODE_LWMA,Price_Type,0)-2*iMA(Symbol(),0,PerMonth,0,MODE_SMA,Price_Type,0);
   color Col;
   
   if (MAOpen==MAClose) { Sign="ó"; Col=Yellow; } //Sideway
   else 
      if (MAOpen < MAClose) { Sign="ñ"; Col=Lime; } //Trend Up
      else { Sign="ò"; Col=Red; } //Trend Down
   string sign1 = "KG MA Month Sign";
   ObjectDelete(sign1);
   ObjectCreate(sign1, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign1, Sign ,10, "Wingdings", Col);
   ObjectSet(sign1, OBJPROP_CORNER, Corner );
   ObjectSet(sign1, OBJPROP_XDISTANCE, 83 );
   ObjectSet(sign1, OBJPROP_YDISTANCE, 10 );
   
   string average1 = "KG MA Month Average Range";
   ObjectDelete(average1);
   ObjectCreate(average1, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(average1, StringConcatenate("",avgMonth) ,8, "Arial", LSMA_Month_Color);
   ObjectSet(average1, OBJPROP_CORNER, Corner );
   ObjectSet(average1, OBJPROP_XDISTANCE, 103 );
   ObjectSet(average1, OBJPROP_YDISTANCE, 10 );
   
   string current1 = "KG MA Month Current Range";
   ObjectDelete(current1);
   ObjectCreate(current1, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(current1, StringConcatenate("",curMonth) ,8, "Arial", LSMA_Month_Color);
   ObjectSet(current1, OBJPROP_CORNER, Corner );
   ObjectSet(current1, OBJPROP_XDISTANCE, 130 );
   ObjectSet(current1, OBJPROP_YDISTANCE, 10 );
   
   MAOpen=3*iMA(Symbol(),0,PerWeek,0,MODE_LWMA,Price_Type,1)-2*iMA(Symbol(),0,PerWeek,0,MODE_SMA,Price_Type,1);
   MAClose=3*iMA(Symbol(),0,PerWeek,0,MODE_LWMA,Price_Type,0)-2*iMA(Symbol(),0,PerWeek,0,MODE_SMA,Price_Type,0);
   if (MAOpen==MAClose) { Sign="ó"; Col=Yellow; } //Sideway
   else 
      if (MAOpen < MAClose) { Sign="ñ"; Col=Lime; } //Trend Up
      else { Sign="ò"; Col=Red; } //Trend Down
   string sign2 = "KG MA Week Sign";
   ObjectDelete(sign2);
   ObjectCreate(sign2, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign2, Sign ,10, "Wingdings", Col);
   ObjectSet(sign2, OBJPROP_CORNER, Corner );
   ObjectSet(sign2, OBJPROP_XDISTANCE, 83 );
   ObjectSet(sign2, OBJPROP_YDISTANCE, 20 );
   
   string average2 = "KG MA Week Average Range";
   ObjectDelete(average2);
   ObjectCreate(average2, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(average2, StringConcatenate("",avgWeek) ,8, "Arial",  LSMA_Week_Color);
   ObjectSet(average2, OBJPROP_CORNER, Corner );
   ObjectSet(average2, OBJPROP_XDISTANCE, 103 );
   ObjectSet(average2, OBJPROP_YDISTANCE, 20 );

   string current2 = "KG MA Week Current Range";
   ObjectDelete(current2);
   ObjectCreate(current2, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(current2, StringConcatenate("",curWeek) ,8, "Arial", LSMA_Week_Color);
   ObjectSet(current2, OBJPROP_CORNER, Corner );
   ObjectSet(current2, OBJPROP_XDISTANCE, 130 );
   ObjectSet(current2, OBJPROP_YDISTANCE, 20 );

   MAOpen=3*iMA(Symbol(),0,Per24H,0,MODE_LWMA,Price_Type,1)-2*iMA(Symbol(),0,Per24H,0,MODE_SMA,Price_Type,1);
   MAClose=3*iMA(Symbol(),0,Per24H,0,MODE_LWMA,Price_Type,0)-2*iMA(Symbol(),0,Per24H,0,MODE_SMA,Price_Type,0);
   if (MAOpen==MAClose) { Sign="ó"; Col=Yellow; } //Sideway
   else 
      if (MAOpen < MAClose) { Sign="ñ"; Col=Lime; } //Trend Up
      else { Sign="ò"; Col=Red; } //Trend Down
   string sign3 = "KG MA Day Sign";
   ObjectDelete(sign3);
   ObjectCreate(sign3, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign3, Sign ,10, "Wingdings", Col);
   ObjectSet(sign3, OBJPROP_CORNER, Corner );
   ObjectSet(sign3, OBJPROP_XDISTANCE, 83 );
   ObjectSet(sign3, OBJPROP_YDISTANCE, 30 );
   
   string average3 = "KG MA Day Average Range";
   ObjectDelete(average3);
   ObjectCreate(average3, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(average3, StringConcatenate("",avgDay) ,8, "Arial",  LSMA_Day_Color);
   ObjectSet(average3, OBJPROP_CORNER, Corner );
   ObjectSet(average3, OBJPROP_XDISTANCE, 103 );
   ObjectSet(average3, OBJPROP_YDISTANCE, 30 );

   string current3 = "KG MA Day Current Range";
   ObjectDelete(current3);
   ObjectCreate(current3, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(current3, StringConcatenate("",curDay) ,8, "Arial", LSMA_Day_Color);
   ObjectSet(current3, OBJPROP_CORNER, Corner );
   ObjectSet(current3, OBJPROP_XDISTANCE, 130 );
   ObjectSet(current3, OBJPROP_YDISTANCE, 30 );

   MAOpen=3*iMA(Symbol(),0,Per8H,0,MODE_LWMA,Price_Type,1)-2*iMA(Symbol(),0,Per8H,0,MODE_SMA,Price_Type,1);
   MAClose=3*iMA(Symbol(),0,Per8H,0,MODE_LWMA,Price_Type,0)-2*iMA(Symbol(),0,Per8H,0,MODE_SMA,Price_Type,0);
   if (MAOpen==MAClose) { Sign="ó"; Col=Yellow; } //Sideway
   else 
      if (MAOpen < MAClose) { Sign="ñ"; Col=Lime; } //Trend Up
      else { Sign="ò"; Col=Red; } //Trend Down
   string sign4 = "KG MA 8H Sign";
   ObjectDelete(sign4);
   ObjectCreate(sign4, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign4, Sign ,10, "Wingdings", Col);
   ObjectSet(sign4, OBJPROP_CORNER, Corner );
   ObjectSet(sign4, OBJPROP_XDISTANCE, 83 );
   ObjectSet(sign4, OBJPROP_YDISTANCE, 40 );
   
   string average4 = "KG MA 8H Average Range";
   ObjectDelete(average4);
   ObjectCreate(average4, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(average4, StringConcatenate("",avg8H) ,8, "Arial",  LSMA_8H_Color);
   ObjectSet(average4, OBJPROP_CORNER, Corner );
   ObjectSet(average4, OBJPROP_XDISTANCE, 103 );
   ObjectSet(average4, OBJPROP_YDISTANCE, 40 );

   string current4 = "KG MA 8H Current Range";
   ObjectDelete(current4);
   ObjectCreate(current4, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(current4, StringConcatenate("",cur8H) ,8, "Arial", LSMA_8H_Color);
   ObjectSet(current4, OBJPROP_CORNER, Corner );
   ObjectSet(current4, OBJPROP_XDISTANCE, 130 );
   ObjectSet(current4, OBJPROP_YDISTANCE, 40 );
      
   MAOpen=3*iMA(Symbol(),0,Per4H,0,MODE_LWMA,Price_Type,1)-2*iMA(Symbol(),0,Per4H,0,MODE_SMA,Price_Type,1);
   MAClose=3*iMA(Symbol(),0,Per4H,0,MODE_LWMA,Price_Type,0)-2*iMA(Symbol(),0,Per4H,0,MODE_SMA,Price_Type,0);
   if (MAOpen==MAClose) { Sign="ó"; Col=Yellow; } //Sideway
   else 
      if (MAOpen < MAClose) { Sign="ñ"; Col=Lime; } //Trend Up
      else { Sign="ò"; Col=Red; } //Trend Down
   string sign5 = "KG MA 4H Sign";
   ObjectDelete(sign5);
   ObjectCreate(sign5, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign5, Sign ,10, "Wingdings", Col);
   ObjectSet(sign5, OBJPROP_CORNER, Corner );
   ObjectSet(sign5, OBJPROP_XDISTANCE, 83 );
   ObjectSet(sign5, OBJPROP_YDISTANCE, 50 );
   
   string average5 = "KG MA 4H Average Range";
   ObjectDelete(average5);
   ObjectCreate(average5, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(average5, StringConcatenate("",avg4H) ,8, "Arial",  LSMA_4H_Color);
   ObjectSet(average5, OBJPROP_CORNER, Corner );
   ObjectSet(average5, OBJPROP_XDISTANCE, 103 );
   ObjectSet(average5, OBJPROP_YDISTANCE, 50 );

   string current5 = "KG MA 4H Current Range";
   ObjectDelete(current5);
   ObjectCreate(current5, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(current5, StringConcatenate("",cur4H) ,8, "Arial", LSMA_4H_Color);
   ObjectSet(current5, OBJPROP_CORNER, Corner );
   ObjectSet(current5, OBJPROP_XDISTANCE, 130 );
   ObjectSet(current5, OBJPROP_YDISTANCE, 50 );
   
//----
   return(0);
  }
//+------------------------------------------------------------------+