Road_Map_expert_v04

Author: Inkov Evgeni
Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest prices of each barSeries array that contains close prices for each bar
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reachedIt Closes Orders by itself
Miscellaneous
It plays sound alerts
0 Views
0 Downloads
0 Favorites
Road_Map_expert_v04
//+------------------------------------------------------------------+
//|                                          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

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---