//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Polynkov A.A."
#property link      ""
#property description "Modif alert by Mobidik." 
#property description "Mod Std-channel by Genry" 

#property strict

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 CLR_NONE
#property indicator_color2 Orange
#property indicator_color3 Orange
#property indicator_color4 clrSpringGreen
#property indicator_color5 clrRed
#property indicator_color6 CLR_NONE
#property indicator_color7 CLR_NONE
#property indicator_color8 Green

#property indicator_width2 3
#property indicator_width3 3
#property indicator_width8 3
//+------------------------------------------------------------------+
enum enumar
  {
   cr,  // current
   cl   // close
  };
//+------------------------------------------------------------------+
extern int    giPeriod        = 67;
extern double Koef_Std        = 1.62;
extern double koef_StdChannel = 1.0;

extern string a               = "";          // --- Alert for CH 1-2 buffer ---
extern bool   AlertsMessage   = false;       // Alert Message
extern bool   AlertsSound     = false;       // Alert Sound
extern bool   AlertsEmail     = false;       // Alert Email
extern bool   AlertsMobile    = false;       // Alert Mobile
extern string AlertsSoundFile = "alert.wav"; // Alert Sound File
extern enumar SignalBar       = 0;           // Signal Bar
extern bool   DisplayChanWidth= true;
//+------------------------------------------------------------------+
datetime TimeBar;
bool isRussianLang;

int gi_80=1;
int gi_unused_84=0;

int gi_96=1102;
double fg_ibu_fx[];
double ChUp1[];
double ChDn1[];
double Buf_StDev_up[];
double Buf_StDev_dn[];
double g_ibuf_120[];
double g_ibuf_124[];
double SigLine[];
double gda_132[10][10];
double gda_136[10];
double gda_140[10];
double gda_144[20];
double gd_148;
int g_shift_156;
int gi_period;
int i;
double gd_168;
double gd_176;
double gd_184;
int gi_192;
int gi_196;
int gi_200;
int gi_204;
int gi_208;
double gd_212;
double gd_StDev=0.0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init() 
  {
   IndicatorShortName("((( NEW ABHAFXS TIMING V2 )))");
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,fg_ibu_fx); SetIndexLabel(0,"b0fx");
   SetIndexBuffer(1,ChUp1); SetIndexLabel(1,"b1Ch_up");
   SetIndexBuffer(2,ChDn1); SetIndexLabel(2,"b2Ch_dn");
   SetIndexBuffer(3,Buf_StDev_up); SetIndexLabel(3, "b3StdDev_up"); // stdev ?
   SetIndexBuffer(4, Buf_StDev_dn); SetIndexLabel(4, "b3StdDev_dn");// stdev ?
   SetIndexBuffer(5,g_ibuf_120);
   SetIndexBuffer(6,g_ibuf_124);
   SetIndexBuffer(7,SigLine); SetIndexLabel(7,"b7_SigLine");
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_DASH,5);

   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexStyle(6,DRAW_LINE);
   SetIndexStyle(7,DRAW_LINE);
   SetIndexStyle(8,DRAW_LINE);

   gi_period=(int)MathRound(giPeriod);
   gi_208=gi_80+1;
   ObjectCreate("pr"+(string)gi_96,OBJ_ARROW,0,  Time[1],0);
   ObjectSet("pr"+(string)gi_96,OBJPROP_ARROWCODE,60);
   isRussianLang = (TerminalInfoString(TERMINAL_LANGUAGE) == "Russian");
   
   return (0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit() 
  {
   ObjectDelete("pr"+(string)gi_96);
   return (0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start() 
  {
   int ii=0;
   int li_8;
   int counted_bars=IndicatorCounted();
   g_shift_156=iBarShift(Symbol(),Period(),ObjectGetInteger(0,"pr"+(string)gi_96,OBJPROP_TIME1));
   gi_period=giPeriod;
   gda_144[1]=gi_period+1;
   SetIndexDrawBegin(0,Bars-gi_period-1);
   SetIndexDrawBegin(1,Bars-gi_period-1);
   SetIndexDrawBegin(2,Bars-gi_period-1);
   SetIndexDrawBegin(3,Bars-gi_period-1);
   SetIndexDrawBegin(4,Bars-gi_period-1);
   SetIndexDrawBegin(5,Bars-gi_period-1);
   SetIndexDrawBegin(6,Bars-gi_period-1);
   SetIndexDrawBegin(7,Bars-gi_period-1);
   for(li_8=1; li_8<=gi_208*2-2; li_8++) 
     {
      gd_148= 0;
      for(i = ii; i<= ii+gi_period; i++) gd_148+= MathPow(i,li_8);
      gda_144[li_8+1]=gd_148;
     }
   for(li_8=1; li_8<=gi_208; li_8++) 
     {
      gd_148=0.0;
      for(i=ii; i<=ii+gi_period; i++) 
        {
         if(li_8==1) gd_148+=Close[i];
         else gd_148+=Close[i] *MathPow(i,li_8-1);
        }
      gda_136[li_8]=gd_148;
     }
   for(gi_196=1; gi_196<=gi_208; gi_196++) 
     {
      for(gi_192=1; gi_192<=gi_208; gi_192++) 
        {
         gi_200 = gi_192+gi_196-1;
         gda_132[gi_192][gi_196]=gda_144[gi_200];
        }
     }
   for(gi_200=1; gi_200<=gi_208-1; gi_200++) 
     {
      gi_204 = 0;
      gd_176 = 0;
      for(gi_192 = gi_200; gi_192 <= gi_208; gi_192++) 
        {
         if(MathAbs(gda_132[gi_192][gi_200]) > gd_176) 
           {
            gd_176 = MathAbs(gda_132[gi_192][gi_200]);
            gi_204 = gi_192;
           }
        }
      if(gi_204 == 0) return (0);
      if(gi_204!=gi_200) 
        {
         for(gi_196=1; gi_196<=gi_208; gi_196++) 
           {
            gd_184 = gda_132[gi_200][gi_196];
            gda_132[gi_200][gi_196] = gda_132[gi_204][gi_196];
            gda_132[gi_204][gi_196] = gd_184;
           }
         gd_184=gda_136[gi_200];
         gda_136[gi_200] = gda_136[gi_204];
         gda_136[gi_204] = gd_184;
        }
      for(gi_192=gi_200+1; gi_192<=gi_208; gi_192++) 
        {
         gd_168 = gda_132[gi_192][gi_200]/gda_132[gi_200][gi_200];
         for(gi_196=1; gi_196<=gi_208; gi_196++) 
           {
            if(gi_196==gi_200) gda_132[gi_192][gi_196]=0;
            else gda_132[gi_192][gi_196]=gda_132[gi_192][gi_196]-gd_168*gda_132[gi_200][gi_196];
           }
         gda_136[gi_192]=gda_136[gi_192]-gd_168*gda_136[gi_200];
        }
     }
   gda_140[gi_208]=gda_136[gi_208]/gda_132[gi_208][gi_208];
   for(gi_192=gi_208-1; gi_192>=1; gi_192--) 
     {
      gd_184 = 0;
      for(gi_196=1; gi_196<=gi_208-gi_192; gi_196++) 
        {
         gd_184+=(gda_132[gi_192][gi_192 + gi_196])*(gda_140[gi_192 + gi_196]);
         gda_140[gi_192]=1/gda_132[gi_192][gi_192]*(gda_136[gi_192]-gd_184);
        }
     }
   for(i=ii; i<=ii+gi_period; i++) 
     {
      gd_148=0;
      for(gi_200=1; gi_200<=gi_80; gi_200++) gd_148+=(gda_140[gi_200+1])*MathPow(i,gi_200);
      fg_ibu_fx[i]=gda_140[1]+gd_148;
     }
   gd_212= 0.0;
   for(i = ii; i<= ii+gi_period; i++) gd_212+= MathPow(Close[i]-fg_ibu_fx[i],2);
   gd_212= MathSqrt(gd_212/(gi_period+1)) * Koef_Std;
   gd_StDev=iStdDev(NULL,0,gi_period,0,MODE_SMA,PRICE_CLOSE,ii)*Koef_Std;
   for(i=ii; i<=ii+gi_period; i++) 
     {
      ChUp1[i] = fg_ibu_fx[i] + gd_212;
      ChDn1[i] = fg_ibu_fx[i] - gd_212;
      Buf_StDev_up[i] = fg_ibu_fx[i] + gd_StDev*koef_StdChannel;
      Buf_StDev_dn[i] = fg_ibu_fx[i] - gd_StDev*koef_StdChannel;
      g_ibuf_120[i] = ChUp1[i] + (Buf_StDev_up[i] - ChUp1[i]) / 2.0;
      g_ibuf_124[i] = Buf_StDev_dn[i] + (ChDn1[i] - Buf_StDev_dn[i]) / 2.0;
     }
   ObjectMove("pr"+(string)gi_96,0,Time[gi_period],fg_ibu_fx[gi_period]);
   int li_12=Bars-counted_bars;
   if(counted_bars>0) li_12++;
   for(ii=0; ii<li_12; ii++) SigLine[ii]=(High[ii]+Low[ii])/2.0;
//--- 
   if(AlertsMessage || AlertsSound || AlertsEmail || AlertsMobile)
     { 
      string header   = WindowExpertName()+" - "+Symbol()+"  "+PeriodString();
      string message1 = header+((isRussianLang)? " - Пробой канала ВВЕРХ":"- Breakdown channel up.");
      string message2 = header+((isRussianLang)? " - Пробой канала ВНИЗ" :"- Breakdown channel down.");

      if(TimeBar!=Time[0] && SigLine[SignalBar+1]<ChUp1[SignalBar+1] && SigLine[SignalBar]>ChUp1[SignalBar])
        {
         if(AlertsMessage) Alert(message1);
         if(AlertsSound)  PlaySound(AlertsSoundFile);
         if(AlertsEmail)  SendMail(Symbol()+" - "+WindowExpertName()+" - ",message1);
         if(AlertsMobile) SendNotification(message1);
         TimeBar=Time[0];
        }

      if(TimeBar!=Time[0] && SigLine[SignalBar+1]>ChDn1[SignalBar+1] && SigLine[SignalBar]<ChDn1[SignalBar])
        {
         if(AlertsMessage) Alert(message2);
         if(AlertsSound) PlaySound(AlertsSoundFile);
         if(AlertsEmail) SendMail(Symbol()+" - "+WindowExpertName()+" - ",message2);
         if(AlertsMobile) SendNotification(message2);
         TimeBar=Time[0];
        }
     }
   if(DisplayChanWidth) Comment("ABHA ChannelWidth="+(string)NormalizeDouble(ChUp1[0]-ChDn1[0],5));
//---
   return (0);
  }
//+------------------------------------------------------------------+
//| Period String                                                    |
//+------------------------------------------------------------------+
string PeriodString()
  {
   switch(_Period)
     {
      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");
      default: return("M"+(string)_Period);
     }
   return("M"+(string)_Period);
  }
//-------------------------------------------------------------------+  
