//+------------------------------------------------------------------+
//|                                          Road_Map_expert_v04.mq4 |
//|  íà÷. 10/04/2016                                                 |
//+------------------------------------------------------------------+
#property copyright "Inkov Evgeni"
#property link      "ew123@mail.ru"
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
#define           Razm_Mas_Prizn         7
//+------------------------------------------------------------------+
input ENUM_TIMEFRAMES TF              = PERIOD_M1;
input string     s1_______________    = "------------------------------------";
input double     Lots                 = 0;
input double     Proc_Lot             = 10;
input bool       Risk_from_Balance    = true;
input string     s2_______________    = "------------------------------------";
input int        TP                   = 1700;
input int        SL                   = 204; 
input string     s3_______________    = "------------------------------------";
input int        Minute_start_trade   = 0;
input int        Minute_end_trade     = 1440;
input string     s4_______________    = "------------------------------------";
input int        Magic                = 1234568;
input int        Slippage             = 50;
input string     s5_______________    = "------------------------------------";
input bool       Sound                = true;
input bool       Inf_RUS              = true;
input bool       Trade                = true;
input string     s6_______________    = "====================================";
input int        Max_Bars             = 300;
input color      clr_Series_Up        = clrBlue;
input color      clr_Series_Dw        = clrPurple;
input color      clr_Tail_ZZ          = clrGreen;
input color      clr_Fibo             = clrDarkOrange;
input color      clr_Prob_UP          = clrGreen;
input color      clr_Prob_DW          = clrRed;
input bool       On_Nom_Series        = true;
input bool       On_Fibo              = true;
//+------------------------------------------------------------------+
double      lot;
double      min_l, max_l;
int         dig_lot;
int         koef_dig;
bool        out_obj;
string      pref="RM_";
string      com_err="";
int         mas_ord[6];// 0-5 ïî òèïó - êîë.îðäåðîâ
int         kol_ord, kol_otl, pred_kol_ord=0, pred_kol_otl=0;
int         pred_spread,spread,max_spread;
string      ss="";
bool        pause;
double      StopLevel, max_StopLevel;
string      sdv="                                                      ";
//......................
double pred_Bid,pred_Ask,tek_Bid,tek_Ask;
int st_;
bool no_connect;
datetime na4_open_ord, end_open_ord;
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
int Mas_Fract[];  // çíà÷.ôðàêòàëà: 1,2,3-ìàêñ, 0 - íåò ôðàêò, -1,-2,-3 - ìèí. (1-èñòèíûé ôðàêò., 2- äîï., 3-íà÷àëî)
int M_Bars;
int Sgat_ZZ_0[][Razm_Mas_Prizn];
                     // 0 - íîìåð áàðà, 
                     // 1 - çíà÷.ôðàêò. êàê â Mas_Fract, 
                     // 2 - (1 - èìï.âîëíà ââåðõ, -1 - èìï.âîëíà âíèç, 0 - êîðð.âîëíà)
                     // 3 - (1 - ñëîæ.êîðð.ââåðõ, -1 - ñëîæ.êîðð.âíèç, 0 - íåò ñëîæ.êîðð.), - ÷èñëî - êîë.âîëí êîððåêöèè
                     // 4 - (1 - ñåðèÿ âîëí ââåðõ, -1 - ñåðèÿ âîëí âíèç, 0) - ÷èñëî - êîë.âîëí â ñåðèè
                     // 5 - ïðîöåíò öåíîâîãî äèàïàçîíà òåê.âîëíû îò ïðåä. âîëíû *100
                     // 6 - ïðîöåíò âðåìåíîãî äèàïàçîíà òåê. âîëíû îò ïðåä. âîëíû *100
datetime time_end_urov;
bool prob_up,prob_dw;
double sl_Buy_prob,sl_Sell_prob;
double pr_BS_H=0,pr_SS_H=0;
datetime time_bar0;
//+------------------------------------------------------------------+
int OnInit()
{  
   M_Bars=0;
   //.............................
   time_end_urov=0;
   //......................................
   st_=55;
   //......................................
   if (UninitializeReason()!=REASON_CHARTCHANGE)
   {
      pred_spread=0;
      max_spread=0;
      max_StopLevel=0;
   }
   //.............................................
   out_obj=!IsTesting() || IsVisualMode();
   //.............................................
   min_l=MarketInfo(Symbol(),MODE_MINLOT);
   max_l=MarketInfo(Symbol(),MODE_MAXLOT);
   //.............................................
   koef_dig=1;
   if (Digits==5 || Digits==3)koef_dig=10;
   //.............................................
   double n_lot=MarketInfo(Symbol(),MODE_LOTSTEP);
   if (n_lot>0)
      dig_lot=(int)NormalizeDouble(MathLog(1.0/n_lot)/MathLog(10.0),0);
   else
      dig_lot=2;
   //.............................................
   EventSetTimer(1);
   //.............................................
   OnTick();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   remove_objects(pref);
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer()
{
   if (IsConnected())
      no_connect=false;
   else
   {
      put_txt(pref+IntegerToString(st_), RusLat(Inf_RUS,"Íåò ñâÿçè !","No connection !"),200,100,clrRed, 10);
      no_connect=true;
   }
}
//--------------------------------
bool Stop_Expert()
{
   if (!IsExpertEnabled())
   {
      put_txt(pref+IntegerToString(st_), RusLat(Inf_RUS,"Îòæàòà êíîïêà \"Àâòî-òîðãîâëÿ\" !","Button is pressed \"AutoTrading\" !"),200,100,clrRed, 10);
      return(1);
   }
   if (!IsTradeAllowed())
   {
      put_txt(pref+IntegerToString(st_), RusLat(Inf_RUS,"Ñîâåòíèêó çàïðåùåíî òîðãîâàòü !","Expert prohibited from trading !"),200,100,clrRed, 10);
      return(1);
   }
   return(0);
   if (!IsConnected())
   {
      put_txt(pref+IntegerToString(st_), RusLat(Inf_RUS,"Íåò ñâÿçè !","No connection !"),200,100,clrRed, 10);
      return(1);
   }
   return(0);
}
//---------------------------------
void OnTick()
{
   if (Max_Bars>0)
      M_Bars=MathMin(Max_Bars,iBars(_Symbol,0));
   else
      M_Bars=iBars(_Symbol,0);
   ArrayResize(Mas_Fract,M_Bars);
   ArrayResize(Sgat_ZZ_0,M_Bars);
   if (Minute_start_trade>Minute_end_trade)return;
   //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   bool New_Bar=false;
   if (time_bar0!=iTime(_Symbol,TF,0))
   {
      New_Bar=true;
      time_bar0=iTime(_Symbol,TF,0);
   }
   if (Period()<=TF)Form_ZZ(TF, Sgat_ZZ_0, New_Bar);
   //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   na4_open_ord = iTime(Symbol(),PERIOD_D1,0) + Minute_start_trade*60;
   end_open_ord = iTime(Symbol(),PERIOD_D1,0) + Minute_end_trade*60;
   //.............................
   pred_spread=spread;
   spread=(int)MathRound((Ask-Bid)/Point);
   //.............................
   if (out_obj)
   {
      if (Stop_Expert())return;
      if (no_connect)return;
      StopLevel=MarketInfo(_Symbol,MODE_STOPLEVEL);
      if (StopLevel>max_StopLevel)max_StopLevel=StopLevel;
      //.....................
      if (spread>max_spread)max_spread=spread;
   }
   //.............................
   if (Bid==0)
   {
      if (out_obj)Out_Comm(); 
      return;
   }
   //........................................................
   com_err="";  // îáíóëèòü ñòðîêó êîììåíòàðèÿ îøèáîê îòêðûòèÿ îðäåðîâ
   //........................................................
   put_mas_ord();
   //........................................................
   bool open_BS_H=false,open_SS_H=false;
   if (out_obj)opred_napravl_start(open_BS_H,open_SS_H,pr_BS_H,pr_SS_H);
   //........................................................
   if (Trade)
   {
      pause=true;
      if (TimeCurrent()>=na4_open_ord && TimeCurrent()<end_open_ord)
      {
         pause=false;
         if (!out_obj)opred_napravl_start(open_BS_H,open_SS_H,pr_BS_H,pr_SS_H);
         //....................................
         if(open_BS_H)
            if (mas_ord[OP_BUY]==0 && mas_ord[OP_SELL]==0)
            {
               opred_begin_lot();
               Open_ord_Buy ();
            }
         //.......................................   
         if(open_SS_H)
            if (mas_ord[OP_BUY]==0 && mas_ord[OP_SELL]==0)
            {
               opred_begin_lot();
               Open_ord_Sell(); 
            }
      }
   }
   if (out_obj)
   {
      opred_begin_lot();
      Out_Comm();   // âûâîä êîììåíòàðèÿ
      if (com_err!="")Comment(com_err);
   }
}
//+------------------------------------------------------------------+
void opred_napravl_start(bool& open_buy, bool& open_sell, double& sl_buy, double& sl_sell)
{
   open_buy =false;
   open_sell=false;
   
   RefreshRates();
   if (prob_up && ND(sl_buy)!=ND(sl_Buy_prob))
   {
      open_buy=true;
      sl_buy=sl_Buy_prob;
   }
   //.....................................
   if (prob_dw && ND(sl_sell)!=ND(sl_Sell_prob))
   {
      open_sell=true;
      sl_sell=sl_Sell_prob;
   }
}
//--------------------------
void opred_begin_lot()
{
   if (Lots>0)           // îïðåäåëèòü íà÷àëüíûé ëîò
      lot=Ogran_min_lot(NDL(Lots));
   else
      lot=Ogran_min_lot(GetLot(Proc_Lot));
}
//------------------------------
double GetLot(double proc)
{
   double free_magrin;
   
   if (Risk_from_Balance)
      free_magrin = AccountBalance();
   else
      free_magrin = AccountFreeMargin();
   double lot1 = NDL(free_magrin * proc/100000.0);
   
   return (lot1);
}
//---------------------------------------------------------------
double Ogran_min_lot(double lot1)
{
   if (lot1 < min_l)lot1 = min_l;
   return(lot1);
}
//---------------------------------------------------------------
double Ogran_max_lot(double lot1)
{
   if (lot1 > max_l)lot1 = max_l;
   return(lot1);
}
//---------------------------------------------------------------
void put_mas_ord()
{        // ïîñ÷èòàòü êîë. îðäåðîâ
   ArrayInitialize(mas_ord,0);
   kol_ord=0;
   kol_otl=0;
   bool M;
   
   for(int i=0; i<OrdersTotal(); i++)
      if (OrderSelect(i,SELECT_BY_POS)==true)
      {
         if (!Good_ord(i,MODE_TRADES))continue;
         
         if (OrderStopLoss()==0)
            if (OrderType()==OP_BUY || OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT)
               M=OrderModify(OrderTicket(),OrderOpenPrice(),ND(OrderOpenPrice()-SL*Point),OrderTakeProfit(),0);
            else
               M=OrderModify(OrderTicket(),OrderOpenPrice(),ND(OrderOpenPrice()+SL*Point),OrderTakeProfit(),0);
         //...............................      
         if (OrderTakeProfit()==0)
            if (OrderType()==OP_BUY || OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT)
               M=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),ND(OrderOpenPrice()+TP*Point),0);
            else
               M=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),ND(OrderOpenPrice()-TP*Point),0);
         //...............................      
         if (OrderType()>1)
            kol_otl++;
         else
            kol_ord++;
         mas_ord[OrderType()]++;
      }
   //..........................................
   if (out_obj && Sound)
      if(kol_ord!=pred_kol_ord)
      {
         PlaySound("news.wav");
         pred_kol_ord=kol_ord;
      }
      else
         if(kol_otl!=pred_kol_otl)
         {
            if(kol_otl>pred_kol_otl)
               PlaySound("expert.wav");
            else
               PlaySound("timeout.wav");
            pred_kol_otl=kol_otl;
         }
}
//-----------------------------------------------
bool Good_ord(int i, int mode)
{
   if (!OrderSelect(i,SELECT_BY_POS,mode))return(0);
   if (OrderSymbol()!=Symbol())return(0);
   if (OrderMagicNumber()==Magic)return(1);
   
   return(0);
}
//---------------------
double ND(double n)
{
   return(NormalizeDouble(n,Digits));
}
//---------------------------------------------------------------
double NDL(double n)
{
   return(NormalizeDouble(n,dig_lot));
}
//---------------------------------------------------------------
double ND2(double n)
{
   return(NormalizeDouble(n,2));
}
//---------------------------------------------------------------
void Out_Comm()
{     // âûâîä êîììåíòàðèÿ
   string s="",s1="";
   int st=st_;
   //..........................................................
   if (Trade || IsTesting())
   {
      s1="Prof= "+DoubleToStr(AccountProfit(),2)+" => ";
      if(AccountMargin()>0)
         s1=s1+DoubleToStr(AccountEquity()/AccountMargin()*100.0,2)+" %";
      else
         s1=s1+"0.00 %";
   }
   else
      s1="Trade close";
   put_txt(pref+IntegerToString(st), (pause?"PAUSE...  ":"")+s1,10,st,clrMagenta, 10); st-=15;
   //..........................................................
   put_txt(pref+IntegerToString(st), "TF= "+str_TF(TF)+"    Lot = "+DoubleToStr(lot,dig_lot), 10,st,clrMagenta, 10); st-=15;
   put_txt(pref+IntegerToString(st), "TP = "+IntegerToString(TP) +"    SL = "+IntegerToString(SL),10,st,clrBlue, 10); st-=15;
   put_txt(pref+IntegerToString(st), "Time Trade= "+TimeToString(na4_open_ord,TIME_MINUTES) +" - "+
                                      TimeToString(end_open_ord,TIME_MINUTES),10,st,clrBlue, 10); st-=15;
}
//-------------------------------------------
void put_txt(string name, string vol, int X,int Y,color col1, int shr)
{
   if (ObjectFind(name)<0)ObjectCreate(name, OBJ_LABEL, 0,0,0);
   ObjectSet(name, OBJPROP_CORNER, 3);
   ObjectSet(name, OBJPROP_XDISTANCE, X);
   ObjectSet(name, OBJPROP_YDISTANCE, Y);
   ObjectSetText(name, vol, shr, "Arial Black", col1);
}
//----------------------------------------------
string nom_str(double n, bool plus=false, bool plus0=false)
{
   if (ND2(n)<0)return(" - "+DoubleToString(-n,2));
   if (ND2(n)>0)
   {
      if (plus)return(" + "+DoubleToString(n,2));
      return(DoubleToString(n,2));
   }
   if (plus0)return(" + 0.00");
   return("0.00");
}
//------------------------------------------
void remove_objects(string PreName)
{
   string Obj_Name,Head;
   for(int k=ObjectsTotal()-1; k>=0; k--) 
   {
      Obj_Name=ObjectName(k);
      Head=StringSubstr(Obj_Name,0,StringLen(PreName));
      if (Head==PreName)ObjectDelete(Obj_Name);
   }
}
//----------------------------------------------
void Open_ord_Buy()
{     // îòêðûòü îðäåð Buy
   RefreshRates();
   double pr=Ask;
   ust_order(Symbol(), OP_BUY, lot, ND(pr), Slippage, 0, 0, "", Magic);
   
   put_mas_ord();
}
//-------------------------------------------
void Open_ord_Sell()
{     // îòêðûòü îðäåð Sell
   RefreshRates();
   double pr=Bid;
   ust_order(Symbol(), OP_SELL, lot, ND(pr), Slippage, 0, 0, "", Magic);
   
   put_mas_ord();
}
//-------------------------------------------
int ust_order(string sym,int Tip, double lot1, double pr, int slippage, double sl, double tp, string com2, int mag, int dt=0, color col=clrNONE)
{
   double tek_lot;
   double ust_lot=lot1;
   int err=0;
   while (ust_lot>0)
   {
      tek_lot=Ogran_max_lot(ust_lot);
      err = OrderSend(sym, Tip, tek_lot, pr, slippage, sl, tp, com2, mag, dt, col);
      if (err<0)break;
      ust_lot-=tek_lot;
   }
   if (err<0)IsError(tip_str(Tip)+": pr="+DoubleToStr(pr,Digits)+" sl="+DoubleToStr(sl,Digits)+" tp="+DoubleToStr(tp,Digits));
   return(err);
}
//-----------------------------------------------
string tip_str (int tip)
{
   switch(tip)
   {
      case 0: return("Buy");
      case 1: return("Sell");
      case 2: return("BuyLimit");
      case 3: return("SellLimit");
      case 4: return("BuyStop");
      case 5: return("SellStop");
   }
   return("?");
}
//-----------------------------------------------
int IsError(string Whose)  
{
   int ierr = GetLastError(); 
   
   bool result = (ierr > 1);
   if(result)com_err=com_err+Whose+ " error = "+ IntegerToString(ierr)+ "; desc = "+ error(ierr)+"\n";
      
   return(ierr);
}
//-----------------------------------------------
string error(int eer)
{
   string er;
   switch(eer)
   {
      case 0:   break;
      case 1:   er="Íåò îøèáêè, íî ðåçóëüòàò íåèçâåñòåí";                         break;
      case 2:   er="Îáùàÿ îøèáêà";                                                break;
      case 3:   er="Íåïðàâèëüíûå ïàðàìåòðû";                                      break;
      case 4:   er="Òîðãîâûé ñåðâåð çàíÿò";                                       break;
      case 5:   er="Ñòàðàÿ âåðñèÿ êëèåíòñêîãî òåðìèíàëà";                         break;
      case 6:   er="Íåò ñâÿçè ñ òîðãîâûì ñåðâåðîì";                               break;
      case 7:   er="Íåäîñòàòî÷íî ïðàâ";                                           break;
      case 8:   er="Ñëèøêîì ÷àñòûå çàïðîñû";                                      break;
      case 9:   er="Íåäîïóñòèìàÿ îïåðàöèÿ íàðóøàþùàÿ ôóíêöèîíèðîâàíèå ñåðâåðà";   break;
      case 64:  er="Ñ÷åò çàáëîêèðîâàí";                                           break;
      case 65:  er="Íåïðàâèëüíûé íîìåð ñ÷åòà";                                    break;
      case 128: er="Èñòåê ñðîê îæèäàíèÿ ñîâåðøåíèÿ ñäåëêè";                       break;
      case 129: er="Íåïðàâèëüíàÿ öåíà";                                           break;
      case 130: er="Íåïðàâèëüíûå ñòîïû";                                          break;
      case 131: er="Íåïðàâèëüíûé îáúåì";                                          break;
      case 132: er="Ðûíîê çàêðûò";                                                break;
      case 133: er="Òîðãîâëÿ çàïðåùåíà";                                          break;
      case 134: er="Íåäîñòàòî÷íî äåíåã äëÿ ñîâåðøåíèÿ îïåðàöèè";                  break;
      case 135: er="Öåíà èçìåíèëàñü";                                             break;
      case 136: er="Íåò öåí";                                                     break;
      case 137: er="Áðîêåð çàíÿò";                                                break;
      case 138: er="Íîâûå öåíû - Ðåêâîò";                                         break;
      case 139: er="Îðäåð çàáëîêèðîâàí è óæå îáðàáàòûâàåòñÿ";                     break;
      case 140: er="Ðàçðåøåíà òîëüêî ïîêóïêà";                                    break;
      case 141: er="Ñëèøêîì ìíîãî çàïðîñîâ";                                      break;
      case 145: er="Ìîäèôèêàöèÿ çàïðåùåíà, òàê êàê îðäåð ñëèøêîì áëèçîê ê ðûíêó"; break;
      case 146: er="Ïîäñèñòåìà òîðãîâëè çàíÿòà";                                  break;
      case 147: er="Èñïîëüçîâàíèå äàòû èñòå÷åíèÿ îðäåðà çàïðåùåíî áðîêåðîì";      break;
      case 148: er="Êîëè÷åñòâî îòêðûòûõ è îòëîæåííûõ îðäåðîâ äîñòèãëî ïðåäåëà ";  break;
      //---- 
      case 4000: er="Íåò îøèáêè";                                                 break;
      case 4001: er="Íåïðàâèëüíûé óêàçàòåëü ôóíêöèè";                             break;
      case 4002: er="Èíäåêñ ìàññèâà - âíå äèàïàçîíà";                             break;
      case 4003: er="Íåò ïàìÿòè äëÿ ñòåêà ôóíêöèé";                               break;
      case 4004: er="Ïåðåïîëíåíèå ñòåêà ïîñëå ðåêóðñèâíîãî âûçîâà";               break;
      case 4005: er="Íà ñòåêå íåò ïàìÿòè äëÿ ïåðåäà÷è ïàðàìåòðîâ";                break;
      case 4006: er="Íåò ïàìÿòè äëÿ ñòðîêîâîãî ïàðàìåòðà";                        break;
      case 4007: er="Íåò ïàìÿòè äëÿ âðåìåííîé ñòðîêè";                            break;
      case 4008: er="Íåèíèöèàëèçèðîâàííàÿ ñòðîêà";                                break;
      case 4009: er="Íåèíèöèàëèçèðîâàííàÿ ñòðîêà â ìàññèâå";                      break;
      case 4010: er="Íåò ïàìÿòè äëÿ ñòðîêîâîãî ìàññèâà";                          break;
      case 4011: er="Ñëèøêîì äëèííàÿ ñòðîêà";                                     break;
      case 4012: er="Îñòàòîê îò äåëåíèÿ íà íîëü";                                 break;
      case 4013: er="Äåëåíèå íà íîëü";                                            break;
      case 4014: er="Íåèçâåñòíàÿ êîìàíäà";                                        break;
      case 4015: er="Íåïðàâèëüíûé ïåðåõîä";                                       break;
      case 4016: er="Íåèíèöèàëèçèðîâàííûé ìàññèâ";                                break;
      case 4017: er="Âûçîâû DLL íå ðàçðåøåíû";                                    break;
      case 4018: er="Íåâîçìîæíî çàãðóçèòü áèáëèîòåêó";                            break;
      case 4019: er="Íåâîçìîæíî âûçâàòü ôóíêöèþ";                                 break;
      case 4020: er="eÂûçîâû âíåøíèõ áèáëèîòå÷íûõ ôóíêöèé íå ðàçðåøåíû";          break;
      case 4021: er="Íåäîñòàòî÷íî ïàìÿòè äëÿ ñòðîêè, âîçâðàùàåìîé èç ôóíêöèè";    break;
      case 4022: er="Ñèñòåìà çàíÿòà";                                             break;
      case 4050: er="Íåïðàâèëüíîå êîëè÷åñòâî ïàðàìåòðîâ ôóíêöèè";                 break;
      case 4051: er="Íåäîïóñòèìîå çíà÷åíèå ïàðàìåòðà ôóíêöèè";                    break;
      case 4052: er="Âíóòðåííÿÿ îøèáêà ñòðîêîâîé ôóíêöèè";                        break;
      case 4053: er="Îøèáêà ìàññèâà";                                             break;
      case 4054: er="Íåïðàâèëüíîå èñïîëüçîâàíèå ìàññèâà-òàéìñåðèè";               break;
      case 4055: er="Îøèáêà ïîëüçîâàòåëüñêîãî èíäèêàòîðà";                        break;
      case 4056: er="Ìàññèâû íåñîâìåñòèìû";                                       break;
      case 4057: er="Îøèáêà îáðàáîòêè ãëîáàëüíûåõ ïåðåìåííûõ";                    break;
      case 4058: er="Ãëîáàëüíàÿ ïåðåìåííàÿ íå îáíàðóæåíà";                        break;
      case 4059: er="Ôóíêöèÿ íå ðàçðåøåíà â òåñòîâîì ðåæèìå";                     break;
      case 4060: er="Ôóíêöèÿ íå ïîäòâåðæäåíà";                                    break;
      case 4061: er="Îøèáêà îòïðàâêè ïî÷òû";                                      break;
      case 4062: er="Îæèäàåòñÿ ïàðàìåòð òèïà string";                             break;
      case 4063: er="Îæèäàåòñÿ ïàðàìåòð òèïà integer";                            break;
      case 4064: er="Îæèäàåòñÿ ïàðàìåòð òèïà double";                             break;
      case 4065: er=" êà÷åñòâå ïàðàìåòðà îæèäàåòñÿ ìàññèâ";                      break;
      case 4066: er="Çàïðîøåííûå èñòîðè÷åñêèå äàííûå â ñîñòîÿíèè îáíîâëåíèÿ";     break;
      case 4067: er="Îøèáêà ïðè âûïîëíåíèè òîðãîâîé îïåðàöèè";                    break;
      case 4099: er="Êîíåö ôàéëà";                                                break;
      case 4100: er="Îøèáêà ïðè ðàáîòå ñ ôàéëîì";                                 break;
      case 4101: er="Íåïðàâèëüíîå èìÿ ôàéëà";                                     break;
      case 4102: er="Ñëèøêîì ìíîãî îòêðûòûõ ôàéëîâ";                              break;
      case 4103: er="Íåâîçìîæíî îòêðûòü ôàéë";                                    break;
      case 4104: er="Íåñîâìåñòèìûé ðåæèì äîñòóïà ê ôàéëó";                        break;
      case 4105: er="Íè îäèí îðäåð íå âûáðàí";                                    break;
      case 4106: er="Íåèçâåñòíûé ñèìâîë";                                         break;
      case 4107: er="Íåïðàâèëüíûé ïàðàìåòð öåíû äëÿ òîðãîâîé ôóíêöèè";            break;
      case 4108: er="Íåâåðíûé íîìåð òèêåòà";                                      break;
      case 4109: er="Òîðãîâëÿ íå ðàçðåøåíà";                                      break;
      case 4110: er="Äëèííûå ïîçèöèè íå ðàçðåøåíû";                               break;
      case 4111: er="Êîðîòêèå ïîçèöèè íå ðàçðåøåíû";                              break;
      case 4200: er="Îáúåêò óæå ñóùåñòâóåò";                                      break;
      case 4201: er="Çàïðîøåíî íåèçâåñòíîå ñâîéñòâî îáúåêòà";                     break;
      case 4202: er="Îáúåêò íå ñóùåñòâóåò";                                       break;
      case 4203: er="Íåèçâåñòíûé òèï îáúåêòà";                                    break;
      case 4204: er="Íåò èìåíè îáúåêòà";                                          break;
      case 4205: er="Îøèáêà êîîðäèíàò îáúåêòà";                                   break;
      case 4206: er="Íå íàéäåíî óêàçàííîå ïîäîêíî";                               break;
      case 4207: er="Îøèáêà ïðè ðàáîòå ñ îáúåêòîì";                               break;
      default:   er="Íåèçâåñòíàÿ îøèáêà";
   }
   return(er);
}
//==============================================================
string RusLat(bool inf_rus, string sR, string sL)
{
   if (inf_rus)return(sR);
   return(sL);
}
//-----------------------------------------------
void Close_ord(int tip=-1)
{
   bool C,usl=true,CL=false;
   while (usl)
   {
      usl=false;
      for(int i=0; i<OrdersTotal(); i++)
      {
         if (!Good_ord(i,MODE_TRADES))continue;
         
         if(OrderType()==OP_BUY && (tip==OP_BUY || tip==-1))
         {
            RefreshRates();
            C=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage);
            CL=true;
            usl=true;
         }
         if (OrderType()==OP_SELL && (tip==OP_SELL || tip==-1))
         {
            RefreshRates();
            C=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage);
            CL=true;
            usl=true;
         }
      }
   }
   if(CL)put_mas_ord();
}
//-----------------------------------------------
string str_TF(int n)
{
   if (n==0)n=Period();
   switch(n)
   {
      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");
   }
   return("TF?");
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void Form_ZZ(int TF1,int& mas_sgat[][], bool new_bar)
{
   int n_sgat=0;
   
   Find_Fractal(TF1,new_bar);
   Dorab_Fract(TF1,mas_sgat, n_sgat,new_bar);
   Opred_Impuls_Wave(TF1,mas_sgat, n_sgat);
   Opred_Corr_wave(TF1,mas_sgat, n_sgat);
   Opred_Series_Wave(TF1,mas_sgat, n_sgat);
   
   if (out_obj)
   {
      Out_ZZ(TF1, mas_sgat, n_sgat);
      if (On_Nom_Series)Out_Nom_Series(TF1, mas_sgat, n_sgat);
   }
}
//-------------------------------------
void Opred_Series_Wave(int TF1, int& mas_sgat[][], int kol_sgat)
{  // íàéòè ñåðèè âîëí
   int imp,impS=0,impS_beg=0,tek_series=0,kol_wave=0,b1,b0,b1S=0,b0S=0,b1S_beg=0,b0S_beg=0;
   double H,L,HS=0,LS=0;
   double HS_beg=0,LS_beg=0;
   double HS_prob,LS_prob;
   
   int n=0,m=0;
   
   for (int i=kol_sgat-1;i>=1;i--)
   {
      prob_up=0;
      prob_dw=0;
      imp = mas_sgat[i][2];   // òåêóùàÿ èìïóëüñíàÿ/êîðð. âîëíà; 1 - èìï.âîëíà ââåðõ, -1 - èìï.âîëíà âíèç, 0 - êîðð.âîëíà
      
      if (imp!=0) // íàéäåíà èìïóëüñíàÿ âîëíà
      {
         b0=mas_sgat[i][0];
         b1=mas_sgat[i-1][0];
         
         if (imp>0)
         {
            L=iLow (_Symbol,TF1,b0);
            H=iHigh(_Symbol,TF1,b1);
         }
         else
         {
            L=iLow (_Symbol,TF1,b1);
            H=iHigh(_Symbol,TF1,b0);
         }
         prob_up=impS<0 && ND(H)>ND(HS);  // ïðîáîé ââåðõ
         prob_dw=impS>0 && ND(L)<ND(LS);  // ïðîáîé âíèç
         
         if (prob_up)
         {
            HS_prob=HS;
            if (out_obj)Out_TL(n,iTime(_Symbol,TF1,b0S), HS, iTime(_Symbol,TF1,b1)+2*TF1*60, HS, "prob_U", clr_Prob_UP, TF1, 1,2);
            n++;
         }
         if (prob_dw)
         {
            LS_prob=LS;
            if (out_obj)Out_TL(m,iTime(_Symbol,TF1,b0S), LS, iTime(_Symbol,TF1,b1)+2*TF1*60, LS, "prob_D", clr_Prob_DW, TF1, 1,2);
            m++;
         }
            
         if (HS==0 || prob_up || prob_dw) // èëè âîëí åù¸ íå áûëî èëè ïðîáîé ââåðõ/âíèç
         {
            HS=H;
            LS=L;
            b0S=b0;
            b1S=b1;
            impS=imp;
            
            HS_beg=H;
            LS_beg=L;
            sl_Sell_prob=H;
            sl_Buy_prob =L;
            b0S_beg=b0;
            b1S_beg=b1;
            impS_beg=imp;
            
            tek_series=imp; // 1 èëè -1
            kol_wave=0;
         }
         else
            if ((impS>0 && ND(H)>ND(HS)) || 
                (impS<0 && ND(L)<ND(LS)))// ïðåâûøåíèå ââåðõ èëè âíèç
            {  // îáíîâëÿåì èñõîäíóþ âîëíó
               HS=H;
               LS=L;
               b0S=b0;
               b1S=b1;
            }
      }
         
      kol_wave++;
      mas_sgat[i][4]=tek_series*kol_wave;
   }
   if (out_obj)
   {
      Del_extra_obj(TF1,"prob_U",n+1);
      Del_extra_obj(TF1,"prob_D",m+1);
      
      if (On_Fibo)Out_Fibo(TF1,impS_beg,b0S_beg,b1S_beg,LS_beg,HS_beg);
      
      if (Sound)
      {
         datetime t=iTime(_Symbol,TF1,b0S);
         if (prob_up && t>time_end_urov)
         {
            time_end_urov=t;
            PlaySound("alert.wav");
         }
         if (prob_dw && t>time_end_urov)
         {
            time_end_urov=t;
            PlaySound("email.wav");
         }
      }
   }
}
//-------------------------------------
void Out_Fibo(int TF1,int dir,int b0, int b1, double L,double H)
{
   if (dir>0)
   {
      double p=L;
      L=H;
      H=p;
   }
   string name=pref+str_TF(TF1)+"_Fibo";
   
   double d=MathCeil(0.1*((1.0*WindowBarsPerChart()-WindowFirstVisibleBar())/5.0+b1));
   b0=b1-(int)d;
   datetime t0;;
   if (b0<0)
      t0=iTime(_Symbol,TF1,0)-b0*TF1*60;
   else
      t0=iTime(_Symbol,TF1,b0);
      
   if (ObjectFind(name))ObjectCreate(name,OBJ_FIBO,0,iTime(_Symbol,TF1,b1),L,t0,H);
      
   ObjectSet(name,OBJPROP_TIME1,iTime(_Symbol,TF1,b1));
   ObjectSet(name,OBJPROP_PRICE1,L);
   ObjectSet(name,OBJPROP_TIME2,t0);
   ObjectSet(name,OBJPROP_PRICE2,H);
   ObjectSet(name,OBJPROP_COLOR,clr_Fibo);
   ObjectSet(name,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,false);
   ObjectSetInteger(0,name,OBJPROP_LEVELCOLOR,0,clr_Fibo);
   ObjectSetInteger(0,name,OBJPROP_LEVELS,13);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,0,0);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,1,0.236);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,2,0.382);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,3,0.5);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,4,0.618);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,5,0.764);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,6,1.0);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,7,1.382);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,8,1.618);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,9,2.0);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,10,2.618);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,11,3.0);
   ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,12,4.0);
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,0,"0.0");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,1,"23.6");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,2,"38.2");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,3,"50.0");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,4,"61.8");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,5,"76.4");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,6,"100.0");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,7,"138.2");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,8,"161.8");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,9,"200.0");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,10,"261.8");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,11,"300.0");
   ObjectSetString(0,name,OBJPROP_LEVELTEXT,12,"400.0");
}
//------------------------------------
void Find_Fractal(int TF1, bool new_bar)
{
   int up,dw;
   int beg_bar;
   if (new_bar)
   {
      beg_bar=M_Bars-4;
      ArrayInitialize(Mas_Fract,0);
   }
   else
   {
      beg_bar=2;
      for (int i=0;i<=beg_bar;i++)Mas_Fract[i]=0;
   }
      
   for (int i=beg_bar;i>=2;i--)
   {
      up=0;
      dw=0;
      double H_2=iHigh(_Symbol,TF1,i-2);
      double H_1=iHigh(_Symbol,TF1,i-1);
      double H0 =iHigh(_Symbol,TF1,i);
      double H1 =iHigh(_Symbol,TF1,i+1);
      double H2 =iHigh(_Symbol,TF1,i+2);
      double H3 =iHigh(_Symbol,TF1,i+3);
      if (((ND(H0)> ND(H1) && ND(H0)> ND(H2)) ||
           (ND(H0)==ND(H1) && ND(H0)> ND(H2)) || 
           (ND(H0)> ND(H1) && ND(H0)==ND(H2)) ||
           (ND(H0)== ND(H1) && ND(H0)==ND(H2) && ND(H0)> ND(H3))) && 
            ND(H0)> ND(H_1)&& ND(H0)> ND(H_2))
         up=1;
      //......................................
      double L_2=iLow(_Symbol,TF1,i-2);
      double L_1=iLow(_Symbol,TF1,i-1);
      double L0 =iLow(_Symbol,TF1,i);
      double L1 =iLow(_Symbol,TF1,i+1);
      double L2 =iLow(_Symbol,TF1,i+2);
      double L3 =iLow(_Symbol,TF1,i+3);
      if (((ND(L0)< ND(L1) && ND(L0)< ND(L2)) ||
           (ND(L0)==ND(L1) && ND(L0)< ND(L2)) || 
           (ND(L0)< ND(L1) && ND(L0)==ND(L2)) ||
           (ND(L0)== ND(L1) && ND(L0)==ND(L2) && ND(L0)< ND(L3))) && 
            ND(L0)< ND(L_1)&& ND(L0)< ND(L_2))dw=1;
      //......................................
      if (up==1 && dw==0)
         Mas_Fract[i]=1;
      else
         if (up==0 && dw==1)
            Mas_Fract[i]=-1;
         else
            if (up==1 && dw==1)
            {
               double op0=iOpen (_Symbol,TF1,i);
               double cl0=iClose(_Symbol,TF1,i);
               if (ND(cl0)>=ND(op0))
                  Mas_Fract[i]=4;
               else
                  Mas_Fract[i]=-4;
            }
      
   }
}
//------------------------------------
void Dorab_Fract(int TF1, int& mas_sgat[][], int& kol_sgat, bool new_bar)
{
   obrab_begin_ZZ(TF1, Mas_Fract);  // îáðàáîòàòü íà÷àëî çèã-çàãà
   //..............................
   int Sgat_ZZ[][2]; // 0 - íîì áàðà, 1 - çíà÷.
   ArrayResize(Sgat_ZZ,2*M_Bars);
   int n=0;
   szhat_mas_ZZ (Mas_Fract,Sgat_ZZ,n);  // ñæàòü ìàññèâ ZZ
   Find_promezh_point (TF1, Mas_Fract, Sgat_ZZ, n); // íàéòè òî÷êè ìåæäó îäèíàêîâûìè âåðøèíàìè
   szhat_mas_ZZ (Mas_Fract,Sgat_ZZ,n);  // ñæàòü ìàññèâ ZZ
   ubrat_iskagen_ZZ (TF1, Mas_Fract, Sgat_ZZ, n); // óáðàòü èñêàæåíèÿ ZZ
   //..............................
   ArrayInitialize(mas_sgat,0);
   szhat_mas_ZZ (Mas_Fract,mas_sgat,kol_sgat);  // ñæàòü ìàññèâ ZZ
}
//-------------------------------
void obrab_begin_ZZ(int TF1, int& mas_Fr[])
{
   int k,i;
   for (i=0;i<M_Bars;i++) // íàéòè íà÷àëî ìàñèâà ZZ (i)
      if (mas_Fr[i]!=0)break;
   //..............................
   if (i>0) // íàéäåíî íà÷àëî ôðàêòàëîâ
            // ñìîòðèì íà êàêîì áàðå ñòîèò íà÷àëüíûé ôðàêòàë (i).
            // 1. Åñëè íà i-îì áàðå - âåðøèíà UP
            // 1.1. Åñëè íà 0-ì áàðå High >  UP, òî High[0]= 3
            // 1.2. Åñëè íà 0-ì áàðå High <= UP, òî Low [0]=-3
            // 2. (äëÿ DW - íàîáîðîò)
      if (mas_Fr[i]>0) // â íà÷àëå ëèíåéêè ôðàêòàëîâ - ìàêñèìóì (UP)
      {
         if (iHigh(_Symbol,TF1,0)>iHigh(_Symbol,TF1,i)) // íà 0-ì áàðå High >  UP
         {
            k=iHighest(_Symbol,TF1,MODE_HIGH,i-1,1);
            if (iHigh(_Symbol,TF1,k)>iHigh(_Symbol,TF1,0))
            {
               mas_Fr[k]= 3; // ìèíèìóì ìåæäó âåðøèíàìè íàéäåòñÿ àâòîìàòîì
               mas_Fr[0]=-3;
            }
            else
               mas_Fr[0]=3; // ìèíèìóì ìåæäó âåðøèíàìè íàéäåòñÿ àâòîìàòîì
         }
         else
         {
            k=iLowest(_Symbol,TF1,MODE_LOW,i-1,1);
            if (iLow(_Symbol,TF1,k)<iLow(_Symbol,TF1,0))
            {
               mas_Fr[k]=-3;
               mas_Fr[0]= 3;
            }
            else
               mas_Fr[0]=-3;
         }
      }
      else
         if (mas_Fr[i]<0) // â íà÷àëå ëèíåéêè ôðàêòàëîâ - ìèíèìóì
         {
            if (iLow(_Symbol,TF1,0)<iLow(_Symbol,TF1,i)) // ìèí. 0-îãî áàðà ìåíüøå ìèí. íà÷àëüíîãî ôðàêòàëà
            {
               k=iLowest(_Symbol,TF1,MODE_LOW,i-1,1);
               if (iLow(_Symbol,TF1,k)<iLow(_Symbol,TF1,0)) // åñòü ëè ìåæäó 1-ì è i-1 áàðàìè ìèíèìóì ìåíüøèé ìèíèìóìà 0-îãî áàðà ?
               {
                  mas_Fr[k]=-3; // ìàêñèìóì ìåæäó íèçèíàìè íàéäåòñÿ àâòîìàòîìàòè÷åñêè
                  mas_Fr[0]= 3; // íà 0-ì áàðå ìàêñ.
               }
               else // íà 0-ì áàðå ìèíèìóì
                  mas_Fr[0]=-3; // ìàêñèìóì ìåæäó íèçèíàìè íàéäåòñÿ àâòîìàòîì
            }
            else
            {
               k=iHighest(_Symbol,TF1,MODE_HIGH,i-1,1);
               if (iHigh(_Symbol,TF1,k)>iHigh(_Symbol,TF1,0))
               {
                  mas_Fr[k]= 3;
                  mas_Fr[0]=-3;
               }
               else
                  mas_Fr[0]=3;
            }
         }
}
//--------------------------------------
void Find_promezh_point(int TF1, int& mas_ish_ZZ[], int& mas_Szt[][], int kol_szt)
{ // íàéòè òî÷êè ìåæäó îäèíàêîâûìè âåðøèíàìè
   int k,b0,b1,z0,z1;
   for (int i=1;i<kol_szt;i++)
   {
      b0=mas_Szt[i-1][0];
      b1=mas_Szt[i]  [0];
      z0=mas_Szt[i-1][1];
      z1=mas_Szt[i]  [1];
      if (z0*z1>0)   // íà âåðøèíàõ îäèíàêîâûå íàïðàâëåíèÿ
         if (b1-b0-1>1)
            if (z1>0)
            {
               k=Main_iLowest(TF1,b1-b0-1,b0+1);
               mas_ish_ZZ[k]=-2;
            }
            else
            {
               k=Main_iHighest(TF1,b1-b0-1,b0+1);
               mas_ish_ZZ[k]=2;
            }
   }
}
//-------------------------------------
void ubrat_iskagen_ZZ(int TF1, int& mas_ish_ZZ[], int& mas_Szt[][], int kol_szt)
{   // óáðàòü èñêàæåíèÿ ZZ: åñëè ìàêñèìóì íèæå ïðåä. ìèíèìóìà è íàîáîðîò
   int i,b0,b1;
   double p0,p1;
   int f0,f1;
   for (i=1;i<kol_szt;i++)
   {
      b1=mas_Szt[i]  [0]; // òåê.
      f1=mas_Szt[i]  [1];
      b0=mas_Szt[i-1][0]; // ñïðàâà
      f0=mas_Szt[i-1][1];
      
      p1=iLow (_Symbol,TF1,b1);
      p0=iHigh(_Symbol,TF1,b0);
      if (f1<0 && f0>0 && ND(p1)>=ND(p0))
      {
         mas_ish_ZZ[b0]=0;
         mas_ish_ZZ[b1]=0;
         continue;
      }
      p1=iHigh(_Symbol,TF1,b1);
      p0=iLow (_Symbol,TF1,b0);
      if (f1>0 && f0<0 && ND(p1)<=ND(p0))
      {
         mas_ish_ZZ[b0]=0;
         mas_ish_ZZ[b1]=0;
      }
   }
}
//--------------------------
void szhat_mas_ZZ(int& masZZ_inp[], int& masZZ_out[][], int& kol_out)
{  // ñæàòü ìàññèâ ZZ
   kol_out=0;
   int n;
   for (int i=0;i<M_Bars;i++)
   {
      n=masZZ_inp[i];
      if (n!=0)
      {
         if (MathAbs(n)<4)
         {
            masZZ_out[kol_out][0]=i;
            masZZ_out[kol_out][1]=n;
            kol_out++;
         }
         else // äâîéíîé ôðàêòàë
            if (n==4)
            {
               masZZ_out[kol_out][0]=i;
               masZZ_out[kol_out][1]=1;
               kol_out++;
               masZZ_out[kol_out][0]=i;
               masZZ_out[kol_out][1]=-1;
               kol_out++;
            }
            else
            {
               masZZ_out[kol_out][0]=i;
               masZZ_out[kol_out][1]=-1;
               kol_out++;
               masZZ_out[kol_out][0]=i;
               masZZ_out[kol_out][1]=1;
               kol_out++;
            }
      }
   }
}
//---------------------------------
void Opred_Impuls_Wave(int TF1, int& mas_sgat[][], int kol_sgat)
{   // âûäåëèòü èìïóëüñíûå âîëíû
   int z1,z0,z_1,b1,b0,b_1;
   double p1,p_1;
   for (int i=kol_sgat-2;i>=1;i--)
   {
      z1 =mas_sgat[i+1][1];   // ëåâûé   ôðàêòàë
      z0 =mas_sgat[i]  [1];   // òåêóùèé ôðàêòàë
      z_1=mas_sgat[i-1][1];   // ïðàâûé  ôðàêòàë
      
      b1 =mas_sgat[i+1][0];
      b0 =mas_sgat[i]  [0];
      b_1=mas_sgat[i-1][0];
      
      if (z0<0 && z_1>0) // ëèíèÿ ââåðõ
      {
         p1 =iHigh(_Symbol,TF1,b1);
         p_1=iHigh(_Symbol,TF1,b_1);
         if (ND(p_1)>ND(p1))mas_sgat[i][2]=1;
      }
      else
         if (z0>0 && z_1<0) // ëèíèÿ âíèç
         {
            p1 =iLow(_Symbol,TF1,b1);
            p_1=iLow(_Symbol,TF1,b_1);
            if (ND(p_1)<ND(p1))mas_sgat[i][2]=-1;
         }
   }
}
//---------------------------
void Opred_Corr_wave(int TF1, int& mas_sgat[][], int kol_sgat)
{  // íàéòè ñëîæíûå êîððåêòèðóþùèå âîëíû
   int z1,z0,b0,b1;
   double p0,d0;
   int i=kol_sgat-2;
   int n_k;
   while (i>=1)
   {
      z1 =mas_sgat[i+1][1];   // ëåâûé   ôðàêòàë
      z0 =mas_sgat[i]  [1];   // òåêóùèé ôðàêòàë
      
      b0 =mas_sgat[i][0]; // òåêóùèé áàð
      p0 =iHigh(_Symbol,TF1,b0);
      d0 =iLow (_Symbol,TF1,b0);
      
      // êîðð. âîëíû âíèç
      if (z1<0 && z0>0 && mas_sgat[i+1][2]>0 && mas_sgat[i][2]==0) // ïðåä.ëèíèÿ èìïóëüñ ââåðõ, òåê -êîðð.
      {
         mas_sgat[i][3]=-1; // îáîçíà÷èòü íà÷àëî ñëîæíîé êîðð. ëèíèèè
         if (i>=2 && mas_sgat[i-1][2]==0) // ñëåä.-êîðð.
         {
            i--;
            mas_sgat[i][3]=-2;
            i--;
            n_k=3;
            while (i>0 && mas_sgat[i][2]==0)
            {
               mas_sgat[i][3]=-n_k;
               i--;
               n_k++;
               if (i<1)break;
               b1=mas_sgat[i-1][0];
               if (ND(iHigh(_Symbol,TF1,b1))>ND(p0))break; // ïðåâûñèëè îñíîâíîé âåðõíèé ôðàêòàë
               mas_sgat[i][3]=-n_k;
               i--;
               n_k++;
            }
         }
         else
         {
            i--;
            continue;
         }
      }
      else // êîðð. âîëíû ââåðõ
         if (z1>0 && z0<0 && mas_sgat[i+1][2]<0 && mas_sgat[i][2]==0) // ïðåä.ëèíèÿ èìïóëüñ âíèç, òåê -êîðð.
         {
            mas_sgat[i][3]=1; // îáîçíà÷èòü íà÷àëî ñëîæíîé êîðð. ëèíèèè
            if (i>=2 && mas_sgat[i-1][2]==0) // ñëåä.-êîðð.
            {
               i--;
               mas_sgat[i][3]=2;
               i--;
               n_k=3;
               while (i>0 && mas_sgat[i][2]==0)
               {
                  mas_sgat[i][3]=n_k;
                  i--;
                  n_k++;
                  if (i<1)break;
                  b1=mas_sgat[i-1][0];
                  if (ND(iLow(_Symbol,TF1,b1))<ND(d0))break; // ïðåâûñèëè îñíîâíîé íèæíèé ôðàêòàë
                  mas_sgat[i][3]=n_k;
                  i--;
                  n_k++;
               }
            }
            else
            {
               i--;
               continue;
            }
         }
         else
            i--;
   }
}
//-------------------------------------
void Out_ZZ(int TF1,int& mas_sgat[][], int kol_sgat)
{   // Âûâåñòè ZZ       
   int z0,z1,b0,b1,m0=0,m1=0;
   double L0,H0,L1,H1;
   datetime t0,t1;
      
   for (int i=1;i<kol_sgat;i++)
   {
      z1=mas_sgat[i][1]; // ëåâûé  ôð.
      b1=mas_sgat[i][0];
      L1=iLow (_Symbol,TF1,b1);
      H1=iHigh(_Symbol,TF1,b1);
      t1=iTime(_Symbol,TF1,b1);
      
      z0=mas_sgat[i-1][1]; // ïðàâûé ôð.
      b0=mas_sgat[i-1][0];
      L0=iLow (_Symbol,TF1,b0);
      H0=iHigh(_Symbol,TF1,b0);
      t0=iTime(_Symbol,TF1,b0);
      //................................
      if (z1>0 && z0<0) // ëèíèÿ âíèç
      {
         Out_TL(m0, t0, L0, t1, H1, "T_D", mas_sgat[i][4]>0?clr_Series_Up:clr_Series_Dw, TF1, mas_sgat[i][2]!=0,4);
         m0++;
      }
      else
         if (z1<0 && z0>0) // ëèíèÿ ââåðõ
         {
            Out_TL(m1, t0, H0, t1, L1, "T_U", mas_sgat[i][4]>0?clr_Series_Up:clr_Series_Dw, TF1, mas_sgat[i][2]!=0,4);
            m1++;
         }
   }
   Del_extra_obj(TF1,"T_U",m0);
   Del_extra_obj(TF1,"T_D",m1);
}
//---------------------------------
void Del_extra_obj (int tf, string s, int n)
{
   string name;
   bool F;
   do
   {
      name=pref+str_TF(tf)+"_"+s+(string)n;
      F=ObjectFind(name)>=0;
      if(F)ObjectDelete(name);
      n++;
   }
   while (F);
}
//-------------------------------
int Main_iHighest(int tf, int n, int beg)
{
   double pr,pr_max=0.0;
   int n_max=beg;
   for (int i=beg;i<beg+n;i++)
   {
      pr=iHigh(_Symbol,tf,i);
      if (pr>pr_max)
      {
         pr_max=pr;
         n_max=i;
      }
   }
   return(n_max);
}
//-----------------------------
int Main_iLowest(int tf, int n, int beg)
{
   double pr,pr_min=999999.0;
   int n_min=beg;
   for (int i=beg;i<beg+n;i++)
   {
      pr=iLow(_Symbol,tf,i);
      if (pr<pr_min)
      {
         pr_min=pr;
         n_min=i;
      }
   }
   return(n_min);
}
//-----------------------------
void Out_Nom_Series(int TF1,int& mas_sgat[][], int kol_sgat)
{   // âûâåñòè ôðàêòàëû
   int m=0,n=0,b,k;
   color clr;
         
   for (int i=0;i<kol_sgat-1;i++)
   {
      int z=mas_sgat[i][1];
      b=mas_sgat[i][0];
      k=mas_sgat[i+1][4];
      if (k!=0)
      {
         if (b>=Bars)break;
         
         if (b<=2 && i<=2)
            clr=clr_Tail_ZZ;
         else
            if (mas_sgat[i+1][4]>0)
               clr=clr_Series_Up;
            else
               clr=clr_Series_Dw;
               
         if (z>0){Out_txt(n,iTime(_Symbol,TF1,b),iHigh(_Symbol,TF1,b),"N_U",clr,TF1,ANCHOR_LOWER, k);n++;}
         if (z<0){Out_txt(m,iTime(_Symbol,TF1,b),iLow (_Symbol,TF1,b),"N_D",clr,TF1,ANCHOR_UPPER, k);m++;}
      }
   }
   Del_extra_obj(TF1,"N_U",n);
   Del_extra_obj(TF1,"N_D",m);
}
//------------------------------
void Out_TL(int i,datetime t1, double pr1, datetime t2, double pr2, string s, color col, int TF1, bool impuls, int width)
{
   string name=pref+str_TF(TF1)+"_"+s+(string)i;
   if (ObjectFind(name))ObjectCreate(name,OBJ_TREND,0,0,0,0,0);
      
   ObjectSet(name,OBJPROP_TIME1,t1);
   ObjectSet(name,OBJPROP_TIME2,t2);
   ObjectSet(name,OBJPROP_PRICE1,pr1);
   ObjectSet(name,OBJPROP_PRICE2,pr2);
   ObjectSet(name,OBJPROP_COLOR,col);
   ObjectSet(name,OBJPROP_RAY,0);
   if (impuls)
   {
      ObjectSet(name,OBJPROP_WIDTH,width);
      ObjectSet(name,OBJPROP_STYLE,STYLE_SOLID);
   }
   else
   {
      ObjectSet(name,OBJPROP_WIDTH,1);
      ObjectSet(name,OBJPROP_STYLE,STYLE_SOLID);
   }
}
//------------------------------------
void Out_Arrow(int i,datetime t, double pr,string s, color col, int cod,int TF1, int anchor)
{
   string name=pref+str_TF(TF1)+"_"+s+(string)i;
   if (ObjectFind(name))ObjectCreate(name,OBJ_ARROW,0,0,0);
      
   ObjectSet(name,OBJPROP_TIME1,t);
   ObjectSet(name,OBJPROP_PRICE1,pr);
   ObjectSet(name,OBJPROP_COLOR,col);
   ObjectSet(name,OBJPROP_WIDTH,1);
   ObjectSet(name,OBJPROP_ARROWCODE,cod);
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,anchor);
}
//------------------------------------
void Out_txt(int i,datetime t, double pr,string s, color col, int TF1, int anchor, int n)
{
   string name=pref+str_TF(TF1)+"_"+s+(string)i;
   if (ObjectFind(name))ObjectCreate(name,OBJ_TEXT,0,0,0);
      
   ObjectSetText(name,IntegerToString(n),10,"Arial Black");
   ObjectSet(name,OBJPROP_TIME1,t);
   ObjectSet(name,OBJPROP_PRICE1,pr);
   ObjectSet(name,OBJPROP_COLOR,col);
   ObjectSet(name,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,anchor);
}
//------------------------------------
             
            
            
            
Comments