//+------------------------------------------------------------------+
//|                                     past regression deviated.mq4 |
//|                Copyright © 2006, tageiger, aka fxid10t@yahoo.com |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, tageiger, aka fxid10t@yahoo.com"
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 5


//---- input parameters
double lsma[];
double lsmaua[];
double lsmaub[];
double lsmada[];
double lsmadb[];

int    LSMAPrice    =  0;


int period=0;

int BBLsmaPeriode7=0;   // bars back regression begins
int BBLsmaPeriode6=0;   // bars back regression begins
int BBLsmaPeriode5=0;   // bars back regression begins
int BBLsmaPeriode4=0;   // bars back regression begins
int BBLsmaPeriode3=0;   // bars back regression begins
int BBLsmaPeriode2=0;   // bars back regression begins
int BBLsmaPeriode1=0;   // bars back regression begins

extern int Corner=1;
extern int font_size=8;
extern int X2=85;
extern int X3=105;
extern int X4=180;
extern int Y_space=12;

extern string nama_BBLSMA_Year="BBLSMA_Tahunan_modified";
extern string nama_BBLSMA_4Month="BBLSMA_4Bulanan_modified";
extern string nama_BBLSMA_Month="BBLSMA_Bulanan_modified";
extern string nama_BBLSMA_Week="BBLSMA_Mingguan_modified";
extern string nama_BBLSMA_Day="BBLSMA_harian_modified";
extern string nama_BBLSMA_8H="BBLSMA_8H_modified";
extern string nama_BBLSMA_4H="BBLSMA_4H_modified";
extern bool OnOff.BBLSMA_Year=true;
extern bool OnOff.BBLSMA_4Month=true;
extern bool OnOff.BBLSMA_Month=true;
extern bool OnOff.BBLSMA_Week=true;
extern bool OnOff.BBLSMA_Day=true;
extern bool OnOff.BBLSMA_8H=true;
extern bool OnOff.BBLSMA_4H=true;

extern color LSMA_Year_Color=BlueViolet;
extern color LSMA_4Month_Color=SandyBrown;
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;
extern double std.channel.1 = 1;        // 1st channel
extern double std.channel.2 = 2;        // 2nd channel
extern double std.channel.3 = 3;        // 3nd channel

double     mean.Buffer, high.1.Buffer, low.1.Buffer, high.2.Buffer, low.2.Buffer, high.3.Buffer, low.3.Buffer;

string ss1  = "KG LSMA nYear sop";
string ss2  = "KG LSMA n4Month sop";
string ss3  = "KG LSMA nMonth sop";
string ss4  = "KG LSMA nWeek sop";
string ss5  = "KG LSMA nDay sop";
string ss6  = "KG LSMA n8H sop";
string ss7  = "KG LSMA n4H sop";

string sss1  = "KG LSMA tnYear sop";
string sss2  = "KG LSMA tn4Month sop";
string sss3  = "KG LSMA tnMonth sop";
string sss4  = "KG LSMA tnWeek sop";
string sss5  = "KG LSMA tnDay sop";
string sss6  = "KG LSMA tn8H sop";
string sss7  = "KG LSMA tn4H sop";

string ssss1  = "KG bband tnYear sop";
string ssss2  = "KG bband tn4Month sop";
string ssss3  = "KG bband tnMonth sop";
string ssss4  = "KG bband tnWeek sop";
string ssss5  = "KG bband tnDay sop";
string ssss6  = "KG bband tn8H sop";
string ssss7  = "KG bband tn4H sop";

string kondisi;

      double value=0;  
      double a,b,c;
      double sumy=0;
      double sumx=0.0;
      double sumxy=0.0;
      double sumx2=0.0;
      int start.bar=0, end.bar=0;
      int n=0;
double LR.price.2=0;
int ii=1;
      double x=0,x.sum=0,x.avg=0,x.sum.squared=0,std.dev=0;
int iii=0;

string sinyal;
color col1;



int init()  {
   getPeriod4H();
   getPeriod8H();
   getPeriod1D();   
   getPeriod1W();   
   getPeriod1M();   
   getPeriod4M();   
   getPeriod1Y();   

   SetIndexBuffer(0,lsma);
   SetIndexBuffer(1,lsmaua);
   SetIndexBuffer(2,lsmaub);
   SetIndexBuffer(3,lsmada);
   SetIndexBuffer(4,lsmadb);   
   
   string label1 = "KG LSMA Year sop";
   ObjectDelete(label1);
   ObjectCreate( label1, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label1,"yearly LSMA",font_size, "Arial Bold", LSMA_Year_Color);
   ObjectSet( label1, OBJPROP_CORNER, Corner );
   ObjectSet( label1, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label1, OBJPROP_YDISTANCE, Y_space );
   
   string label2 = "KG LSMA 4Month sop";
   ObjectDelete(label2);
   ObjectCreate( label2, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label2,"4Monthly LSMA",font_size, "Arial Bold", LSMA_4Month_Color);
   ObjectSet( label2, OBJPROP_CORNER, Corner );
   ObjectSet( label2, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label2, OBJPROP_YDISTANCE, Y_space*2 );
   
   string label3 = "KG LSMA Month sop";
   ObjectDelete(label3);
   ObjectCreate( label3, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label3,"Monthly LSMA",font_size, "Arial Bold", LSMA_Month_Color);
   ObjectSet( label3, OBJPROP_CORNER, Corner );
   ObjectSet( label3, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label3, OBJPROP_YDISTANCE, Y_space*3 );
   
   string label4 = "KG LSMA Week sop";
   ObjectDelete(label4);
   ObjectCreate( label4, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label4,"Weekly LSMA",font_size, "Arial Bold", LSMA_Week_Color);
   ObjectSet( label4, OBJPROP_CORNER, Corner );
   ObjectSet( label4, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label4, OBJPROP_YDISTANCE, Y_space*4 );
   
   string label5 = "KG LSMA Day sop";
   ObjectDelete(label5);
   ObjectCreate( label5, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label5,"Daily LSMA",font_size, "Arial Bold", LSMA_Day_Color);
   ObjectSet( label5, OBJPROP_CORNER, Corner );
   ObjectSet( label5, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label5, OBJPROP_YDISTANCE, Y_space*5 );
   
   string label6 = "KG LSMA 8H sop";
   ObjectDelete(label6);
   ObjectCreate( label6, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label6,"8H LSMA",font_size, "Arial Bold", LSMA_8H_Color);
   ObjectSet( label6, OBJPROP_CORNER, Corner );
   ObjectSet( label6, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label6, OBJPROP_YDISTANCE, Y_space*6 );

   string label7 = "KG LSMA 4H sop";
   ObjectDelete(label7);
   ObjectCreate( label7, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label7,"4H LSMA",font_size, "Arial Bold", LSMA_4H_Color);
   ObjectSet( label7, OBJPROP_CORNER, Corner );
   ObjectSet( label7, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label7, OBJPROP_YDISTANCE, Y_space*7 );
   
/*   string label8 = "KG LSMA 15M";
   ObjectDelete(label8);
   ObjectCreate( label8, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(label8,"15M LSMA",font_size, "Arial Bold", LSMA_15M_Color);
   ObjectSet( label8, OBJPROP_CORNER, Corner );
   ObjectSet( label8, OBJPROP_XDISTANCE, 3 );
   ObjectSet( label8, OBJPROP_YDISTANCE, 80 );
*/
   return(0);
}

int deinit() 
{
ObjectsDeleteAll(0,OBJ_LABEL);
}

int start() {

      start.bar=BBLsmaPeriode7;
                                                lsmaSD3(nama_BBLSMA_4H,OnOff.BBLSMA_4H);  panah(ss7,X2,Y_space*7); kondisi(sss7,X3,Y_space*7);bband(ssss7, LSMA_4H_Color, X4, Y_space*7);
      start.bar=BBLsmaPeriode6;
                                             lsmaSD3(nama_BBLSMA_8H,OnOff.BBLSMA_8H);  panah(ss6,X2,Y_space*6); kondisi(sss6,X3,Y_space*6);bband(ssss6, LSMA_8H_Color, X4, Y_space*6);
      start.bar=BBLsmaPeriode5;
                                          lsmaSD3(nama_BBLSMA_Day,OnOff.BBLSMA_Day);  panah(ss5,X2,Y_space*5); kondisi(sss5,X3,Y_space*5);bband(ssss5, LSMA_Day_Color, X4, Y_space*5);
      start.bar=BBLsmaPeriode4;
                                       lsmaSD3(nama_BBLSMA_Week,OnOff.BBLSMA_Week);  panah(ss4,X2,Y_space*4); kondisi(sss4,X3,Y_space*4);bband(ssss4, LSMA_Week_Color, X4, Y_space*4);
      start.bar=BBLsmaPeriode3;
                                    lsmaSD3(nama_BBLSMA_Month,OnOff.BBLSMA_Month);  panah(ss3,X2,Y_space*3); kondisi(sss3,X3,Y_space*3);bband(ssss3, LSMA_Month_Color, X4, Y_space*3);
      start.bar=BBLsmaPeriode2;
                                 lsmaSD3(nama_BBLSMA_4Month,OnOff.BBLSMA_4Month);  panah(ss2,X2,Y_space*2); kondisi(sss2,X3,Y_space*2);bband(ssss2, LSMA_4Month_Color, X4, Y_space*2);
      start.bar=BBLsmaPeriode1;
                              lsmaSD3(nama_BBLSMA_Year,OnOff.BBLSMA_Year);  panah(ss1,X2,Y_space); kondisi(sss1,X3,Y_space);bband(ssss1, LSMA_Year_Color, X4, Y_space);





   return(0);
}
//+------------------------------------------------------------------+
void bband(string nama_label, color warna, int l, int m)
{

       double hi = iHigh(NULL, 0, iHighest(NULL, 0, MODE_HIGH, start.bar, 0));
       double lo = iLow(NULL, 0, iLowest(NULL, 0, MODE_LOW, start.bar, 0));                          
   string hasilnya;
   double band3=(hi+lo)/2; //middle
   double band1=(hi+band3)/2;//upper
   double band2=(lo+band3)/2;//lower

   
   if (Bid>band1) hasilnya="upper<Bid";
   if (Bid<band1 && Bid>band3) hasilnya="middle<Bid<upper";
   if (Bid<band3 && Bid>band2) hasilnya="lower<Bid<middle";
   if (Bid<band2) hasilnya="Bid<lower";

   ObjectDelete(nama_label);
   ObjectCreate(nama_label, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(nama_label, hasilnya ,font_size, "Arial", warna);
   ObjectSet(nama_label, OBJPROP_CORNER, Corner );
   ObjectSet(nama_label, OBJPROP_XDISTANCE, l );
   ObjectSet(nama_label, OBJPROP_YDISTANCE, m );   
   
   
}
//+------------------------------------------------------------------+
void panah(string sign1, int xx,int yy)
{
   lsma();
   if (sinyal=="flat") { string Sign="ó"; color Col=Yellow; } //Sideway
   else 
      if (sinyal=="up") { Sign="ñ"; Col=Lime; } //Trend Up
      else if (sinyal=="dn") { Sign="ò"; Col=Red; } //Trend Down
 
   ObjectDelete(sign1);
   ObjectCreate(sign1, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign1, Sign ,font_size, "Wingdings", Col);
   ObjectSet(sign1, OBJPROP_CORNER, Corner );
   ObjectSet(sign1, OBJPROP_XDISTANCE, xx );
   ObjectSet(sign1, OBJPROP_YDISTANCE, yy );
}

//+------------------------------------------------------------------+
void kondisi(string sign1,int xxx,int yy)
{
   ObjectDelete(sign1);
   ObjectCreate(sign1, OBJ_LABEL, 0, 0, 0 );
   ObjectSetText(sign1, kondisi ,font_size+2, "Arial", col1);
   ObjectSet(sign1, OBJPROP_CORNER, Corner );
   ObjectSet(sign1, OBJPROP_XDISTANCE, xxx );
   ObjectSet(sign1, OBJPROP_YDISTANCE, yy );
}

//+------------------------------------------------------------------+
void lsmaSD3(string nama_indi, bool OnOff)
{
   if (OnOff)
   {
   double    mean.Buffer=iCustom(NULL,0,nama_indi,0,0);
   double  high.1.Buffer=iCustom(NULL,0,nama_indi,1,0);
   double   low.1.Buffer=iCustom(NULL,0,nama_indi,2,0);
   double  high.2.Buffer=iCustom(NULL,0,nama_indi,3,0);
   double   low.2.Buffer=iCustom(NULL,0,nama_indi,4,0);
   double  high.3.Buffer=iCustom(NULL,0,nama_indi,5,0);
   double   low.3.Buffer=iCustom(NULL,0,nama_indi,6,0);
   
 	if (Bid>=high.3.Buffer                              ){                kondisi="imbalance:+3";  col1=Red;   }
 	if (Bid< high.3.Buffer      && Bid >=high.2.Buffer  ){            kondisi="imbalance:+2";      col1=Yellow;}
 	if (Bid< high.2.Buffer      && Bid > high.1.Buffer  ){        kondisi="imbalance:+1";          col1=Aqua;  }
 	if (Bid< high.1.Buffer      && Bid >   mean.Buffer  ){  kondisi="balance:+0";                  col1=Lime;  }
 	if (Bid                     ==         mean.Buffer  ){ kondisi=" balance:0";                   col1=Lime;  }
 	if (Bid> low.1.Buffer       && Bid <   mean.Buffer  ){  kondisi="balance:-0";                  col1=Lime;  }
 	if (Bid> low.2.Buffer       && Bid <= low.1.Buffer  ){        kondisi="imbalance:-1";          col1=Aqua;  }
 	if (Bid> low.3.Buffer       && Bid <= low.2.Buffer  ){            kondisi="imbalance:-2";      col1=Yellow;}
 	if (Bid<=low.3.Buffer                               ){                kondisi="imbalance:-3";  col1=Red;   }
 	}
 	else { kondisi="non-aktif";  col1=White;}
}
//+------------------------------------------------------------------+
void getPeriod4H()
{
   switch(Period()) 
      {
         case 1: 
            BBLsmaPeriode7=240;
            break;
         case 5: 
            BBLsmaPeriode7=48;
            break;
         case 15: 
            BBLsmaPeriode7=16;
            break;
         case 30: 
            BBLsmaPeriode7=8;
            break;
         case 60: 
            BBLsmaPeriode7=4;
            break;
         case 240: 
            BBLsmaPeriode7=0;
            break;
         case 1440: 
            BBLsmaPeriode7=0;
            break;
         case 10080: 
            BBLsmaPeriode7=0;
            break;
         case 43200: 
            BBLsmaPeriode7=0;
            break;
         
      }
}
void getPeriod8H()
{
   switch(Period()) 
      {
         case 1: 
            BBLsmaPeriode6=480;
            break;
         case 5: 
            BBLsmaPeriode6=96;
            break;
         case 15: 
            BBLsmaPeriode6=32;
            break;
         case 30: 
            BBLsmaPeriode6=16;
            break;
         case 60: 
            BBLsmaPeriode6=8;
            break;
         case 240: 
            BBLsmaPeriode6=0;
            break;
         case 1440: 
            BBLsmaPeriode6=0;
            break;
         case 10080: 
            BBLsmaPeriode6=0;
            break;
         case 43200: 
            BBLsmaPeriode6=0;
            break;
         
      }
 }
void getPeriod1D()
{
   switch(Period()) 
      {
         case 1: 
            BBLsmaPeriode5=1440;
            break;
         case 5: 
            BBLsmaPeriode5=288;
            break;
         case 15: 
            BBLsmaPeriode5=96;
            break;
         case 30: 
            BBLsmaPeriode5=48;
            break;
         case 60: 
            BBLsmaPeriode5=24;
            break;
         case 240: 
            BBLsmaPeriode5=6;
            break;
         case 1440: 
            BBLsmaPeriode5=0;
            break;
         case 10080: 
            BBLsmaPeriode5=0;
            break;
         case 43200: 
            BBLsmaPeriode5=0;
            break;
         
      }
}
void getPeriod1W()
{
   switch(Period()) 
      {
         case 1: 
            BBLsmaPeriode4=7200;
            break;
         case 5: 
            BBLsmaPeriode4=1440;
            break;
         case 15: 
            BBLsmaPeriode4=480;
            break;
         case 30: 
            BBLsmaPeriode4=240;
            break;
         case 60: 
            BBLsmaPeriode4=120;
            break;
         case 240: 
            BBLsmaPeriode4=30;
            break;
         case 1440: 
            BBLsmaPeriode4=5;
            break;
         case 10080: 
            BBLsmaPeriode4=1;
            break;
         case 43200: 
            BBLsmaPeriode4=0;
            break;
         
      }
 }
void getPeriod1M()
{
   switch(Period()) 
      {
         case 1: 
            BBLsmaPeriode3=28800;
            break;
         case 5: 
            BBLsmaPeriode3=5760;
            break;
         case 15: 
            BBLsmaPeriode3=1920;
            break;
         case 30: 
            BBLsmaPeriode3=960;
            break;
         case 60: 
            BBLsmaPeriode3=480;
            break;
         case 240: 
            BBLsmaPeriode3=120;
            break;
         case 1440: 
            BBLsmaPeriode3=20;
            break;
         case 10080: 
            BBLsmaPeriode3=4;
            break;
         case 43200: 
            BBLsmaPeriode3=1;
            break;
         
      }
 }
void getPeriod4M()
{
   switch(Period()) 
      {
         case 1: 
            BBLsmaPeriode2=0;
            break;
         case 5: 
            BBLsmaPeriode2=0;
            break;
         case 15: 
            BBLsmaPeriode2=7680;
            break;
         case 30: 
            BBLsmaPeriode2=3840;
            break;
         case 60: 
            BBLsmaPeriode2=1920;
            break;
         case 240: 
            BBLsmaPeriode2=480;
            break;
         case 1440: 
            BBLsmaPeriode2=80;
            break;
         case 10080: 
            BBLsmaPeriode2=16;
            break;
         case 43200: 
            BBLsmaPeriode2=4;
            break;
         
      }
 }
void getPeriod1Y()
{
   switch(Period()) 
      {
         case 1: 
            BBLsmaPeriode1=0;
            break;
         case 5: 
            BBLsmaPeriode1=0;
            break;
         case 15: 
            BBLsmaPeriode1=23040;
            break;
         case 30: 
            BBLsmaPeriode1=11520;
            break;
         case 60: 
            BBLsmaPeriode1=5760;
            break;
         case 240: 
            BBLsmaPeriode1=1440;
            break;
         case 1440: 
            BBLsmaPeriode1=240;
            break;
         case 10080: 
            BBLsmaPeriode1=48;
            break;
         case 43200: 
            BBLsmaPeriode1=12;
            break;
         
      }
 }
void lsma()
{ 
   int      LSMAPeriod=start.bar;
   int      counted_bars=IndicatorCounted();
   int      limit,i;
   if(counted_bars < 0) return(-1);
   if(counted_bars>0) counted_bars--;
         limit = MathMin(Bars-counted_bars,Bars-1);

   if (lsma[limit] > lsma[limit+1]) CleanPoint(limit,lsmaua,lsmaub);
   if (lsma[limit] < lsma[limit+1]) CleanPoint(limit,lsmada,lsmadb);
   for(i = limit; i >= 0; i--)
   {
      lsma[i]   = 3.0*iMA(NULL,0,LSMAPeriod,0,MODE_LWMA,LSMAPrice,i)-2.0*iMA(NULL,0,LSMAPeriod,0,MODE_SMA,LSMAPrice,i);
      lsmaua[i] = EMPTY_VALUE;
      lsmaub[i] = EMPTY_VALUE;
      lsmada[i] = EMPTY_VALUE;
      lsmadb[i] = EMPTY_VALUE;
         if (lsma[i] > lsma[i+1]) PlotPoint(i,lsmaua,lsmaub,lsma);
         if (lsma[i] < lsma[i+1]) PlotPoint(i,lsmada,lsmadb,lsma);
   }   
   
   double  l=lsma[0];
   double ll=lsma[1];
   double l1=lsmaua[0];
   double l2=lsmaub[0];
   double l3=lsmada[0];
   double l4=lsmadb[0];

   sinyal="flat";
   if ( l>ll && l1==l && (l3==EMPTY_VALUE && l4==EMPTY_VALUE))
   {sinyal="up";
   }
   if ( l<ll && l3==l && (l1==EMPTY_VALUE && l2==EMPTY_VALUE))
   {sinyal="dn";
   }
   if ( l1==l && (l3==EMPTY_VALUE && l4==EMPTY_VALUE))
   {sinyal="up";
   }
   if ( l3==l && (l1==EMPTY_VALUE && l2==EMPTY_VALUE))
   {sinyal="dn";
   }
}

void CleanPoint(int i,double& first[],double& second[])
{
   if ((second[i]  != EMPTY_VALUE) && (second[i+1] != EMPTY_VALUE))
        second[i+1] = EMPTY_VALUE;
   else
      if ((first[i] != EMPTY_VALUE) && (first[i+1] != EMPTY_VALUE) && (first[i+2] == EMPTY_VALUE))
          first[i+1] = EMPTY_VALUE;
}

void PlotPoint(int i,double& first[],double& second[],double& from[])
{
   if (first[i+1] == EMPTY_VALUE)
      {
         if (first[i+2] == EMPTY_VALUE) {
                first[i]   = from[i];
                first[i+1] = from[i+1];
                second[i]  = EMPTY_VALUE;
            }
         else {
                second[i]   =  from[i];
                second[i+1] =  from[i+1];
                first[i]    = EMPTY_VALUE;
            }
      }
   else
      {
         first[i]   = from[i];
         second[i]  = EMPTY_VALUE;
      }
}