//+------------------------------------------------------------------+
//|                                                shablon 3.0.mq4 |
//|                                                          mixa |
//+------------------------------------------------------------------+
//Блок №1 - настройка демо версии, ключа, номер счета
// если не используем оставляем все как есть
#property copyright "mixa"//ваше имя
#property link      "https://"//адрес вашего сайта
#property version   "3.00"
#property strict
#define miz DBL_EPSILON
#define EV  EMPTY_VALUE
#include <stdlib.mqh> 
#define dat     D'13.03.2115' // Максимальная дата работы советника, если 0=откл.
#define account 0             // Номер счёта, если 0=откл.
#define key     0             // Ключ, если 0=откл.
//+------------------------------------------------------------------+
enum eTF
  {CURRENT,M1,M5,M15,M30,H1,H4,D1,W1,MN1};
//+------------------------------------------------------------------+
//Блок №2 - Имя основного индикатора, по которому советник будет открывать лоты.
enum eIndicator
  {Scalper_MA};//Основной индикатор
//+------------------------------------------------------------------+
//Блок №3 - Основные настройки советника и индикаторов
input int              Key = 0;// Ключ, если 0=откл.
input eTF           WorkTF = CURRENT;// рабочий TF
input eIndicator Indicator = Scalper_MA;// имя основного индикатора
input int      StepDistans = 0;// дополнительный лот через в пунктах
input int         StopLoss = 500;         // Стоплос, 0 = откл.
input int       TrailStart = 10;          // Старт Трала, 0=откл.
input int    TrailDistance = 350;   // Дистанция трала от цены
input int        TrailStep = 5; // Шаг трала
input int   BreakevenStart = 250;         // Выход в плюс на скольки пунктах, 0=откл.
input int    BreakevenStep = 5;  //Шаг 
input double           Lot = 0.01; // величина лота
//Блок №4 - настройки основного индикатора.
input string _0 = "Scalper_MA";// настройки индикатора
extern int MaMetod = 2;
extern int MaPeriod = 50;
extern bool Signal = TRUE;
extern bool Mail = TRUE;
extern int Step = 5;
//Блок №5 - настроки индикатора по которому будут закрываться лоты.
input string _1 = "Reversals properties"; // индикатор закрытия сделки
input int small_bar_count1 = 40;//настройки
input int  medium_bar_count1 = 500;
input int  big_bar_count1 = 500;
// Блок №6 - настройки индикатора фильтра
input string _2 = "Solar properties";//индикатор фильтр
extern int period=35;//настройки
extern int smooth=10;
// Блок №7 - оставляем все как есть.
input string _3 = "____________";
sinput bool UseOldPips = false;        // true = в старых пунктах.
sinput color    BayCol = clrLawnGreen; // Бай, NONE = по умолчанию.
sinput color    SelCol = clrOrangeRed; // Сел, NONE = по умолчанию.
sinput int       Magic = 101208;       // Маджик, не более 6 цифр.
sinput int      NamTry = 2;            // Количество попыток.
sinput int     Slipage = 10;           // Проскальзывание.
sinput string      Com = "shablon 3.0"; // Комментарий к ордерам советника.
sinput bool   ShowInfo = true;         // Отображать информацию.
sinput color      Gcol = clrWhite;      // Позитивные показатели.
sinput color      Fcol = clrRed;       // Негативные показатели.
sinput int        Size = 14;            // Размер шрифта.
sinput int           X = 20;          // Дистанция по горизонтали для текста.
sinput int           Y = 20;           // Дистанция по вертикали для текста.
sinput string     Font = "Verdana";    // Шрифт.
ENUM_BASE_CORNER Cor=CORNER_LEFT_LOWER;
//+------------------------------------------------------------------+
string textcom,prevtextcom;
datetime time;
int ydist=0,dig,slipag,tf;
double lotstep,minlot,maxlot;
bool first=true,opnovis,useECNNDD;
//+------------------------------------------------------------------+
int OnInit()
  {
   time=TimeCurrent();
   prevtextcom="";
   if(ydist==0)ydist=Y;
   lotstep=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   minlot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   maxlot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   switch(int(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_EXEMODE)))
     {case SYMBOL_TRADE_EXECUTION_MARKET:useECNNDD=true;slipag=0;break;default:useECNNDD=false;slipag=Slipage;break;}
   if(UseOldPips){if(Digits==3 || Digits==5 || Digits==1)dig=10;else dig=1;}else dig=1;
   if(IsOptimization() || (IsTesting() && !IsVisualMode())){opnovis=false;}else opnovis=true;
   if(!IsOptimization() && !IsTesting())EventSetTimer(1);
   tf=TFe(WorkTF);
   //---
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void Signal(double& ar[][],bool& op[],bool& cl[])
  {
   int trd=-1;
   double up=0.0,dn=0.0;
   //---
   ArrayInitialize(cl,false);
   ArrayInitialize(op,false);
   //Блок №8 - подключаем индикатор фильтра Solar
   up=iCustom(_Symbol,tf,"Solar",period,smooth,false,false,0,0);//имя, настройки, буфер, старт свеча для BUY
   dn=iCustom(_Symbol,tf,"Solar",period,smooth,false,false,1,0);//имя, настройки, буфер, старт свеча для SELL
   if(dn==EV) trd=0;
   if(up==EV) trd=1; //Comment(trd);
   //Блок №9 - подключаем индикатор реверса и выхода из сделки
   up=iCustom(_Symbol,tf,"Reversals",small_bar_count1,medium_bar_count1,big_bar_count1,0,1);//имя, настройки, буфер, старт свеча для BUY
   dn=iCustom(_Symbol,tf,"Reversals",small_bar_count1,medium_bar_count1,big_bar_count1,1,1);//имя, настройки, буфер, старт свеча для SELL
   // ниже оставляем как есть
   if(up>0.0 && up<EV) cl[1]=true;
   if(dn>0.0 && dn<EV) cl[0]=true;
   up=0.0;
   dn=0.0;
   //Блок №10 - подключаем основной индикатор по которому входим в рынок.
   switch(Indicator)
     {
     case Scalper_MA://пишем имя
         up=iCustom(_Symbol,tf,"Scalper_MA",MaMetod,MaPeriod,Signal,Mail,Step,false,false,4,2);//имя,настроки, буфер, старт свеча для BUY
         dn=iCustom(_Symbol,tf,"Scalper_MA",MaMetod,MaPeriod,Signal,Mail,Step,false,false,5,2);//имя,настроки, буфер, старт свеча для SELL
         break;
     }//Далее ничего не трогаем!
   switch(trd)
     {
      case 0:
         if(up==0.0 || up==EV) break;
         op[trd]=true;
         break;
      case 1:
         if(dn==0.0 || dn==EV) break;
         op[trd]=true;
         break;
     }
  }
//+------------------------------------------------------------------+
void BE(double& ar[][],double& pr[],bool all=true,bool show=true,int tip=-1,int ind=-1,datetime st=0,datetime ft=EV)
  {
   if(!all)return;
   string Nam[]={"BuyBE","SellBE"};
   int i=0;
   color Col[2];
   double Pr[2],Lo[2];
   datetime Tim[3];
   ArrayInitialize(Pr,0.0);
   ArrayInitialize(Lo,0.0);
   ArrayInitialize(Tim,0);
   Tim[2]=Time[0]+_Period*240;
   Col[0]=BayCol;
   Col[1]=SelCol;
   for(i=1;i<=ar[0][0];i++)
     {
      int type=int(ar[i][6]);
      if(type>1)continue;
      if(ind>-1){if(int(ar[i][9])!=ind)continue;}
      datetime ti=datetime(ar[i][8]);
      if(ti<st || ti>ft)continue;
      Lo[type]+=ar[i][5];
      Pr[type]+=ar[i][1]*ar[i][5];
      if(Tim[type]>ti || Tim[type]==0)Tim[type]=ti;
     }
   for(i=0;i<2;i++)
     {if(!(Lo[i]>0.0))continue;pr[i]=Pr[i]/Lo[i];}
   for(i=0;i<2;i++)
     {
      int tipe=1;
      if(MathMod(tip,2.0)==0.0)tipe=0;
      if(!all){DelObj(Com+Nam[i]);continue;}
      if(!(Lo[i]>0.0)){DelObj(Com+Nam[i]);continue;}
      if(show)Tline(Com+Nam[i],Tim[i],pr[i],Tim[2],pr[i],Col[i]);else DelObj(Com+Nam[i]);
     } 
  }
//+------------------------------------------------------------------+
double GetDou(string name,int id)
  {
   double res=0.0;
   if(opnovis && ObjectFind(name)>-1)res=ObjectGetDouble(0,name,id);
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
void Stops(double &ar[][],
           const int take,
           const int stop,
           const int trstart,
           const int tr,
           const int trstep,
           const int nl,
           const int nlstep,
           const bool all=false,
           const bool virt=false,
           const int tip=-1,
           const int ind=-1,
           const datetime st=0,
           const datetime ft=EV
           )
  {
   static int Count[2];
   bool Zero[2];
   ArrayInitialize(Zero,false);
   string Nam[]={"BuySL","SellSL","BuyTP","SellTP"};
   datetime Tim[3],tim1=0;
   color Col[2];
   int z=0,i=0;
   double Pr[2],tralb=MathFloor(((Bid-NormE(tr-trstep)*_Point)/_Point)/MathMax(trstep,1))*_Point*MathMax(trstep,1),
          trals=MathFloor(((Ask+NormE(tr-trstep)*_Point)/_Point)/MathMax(trstep,1))*_Point*MathMax(trstep,1);
//---
   for(i=0;i<2;i++)
     {
      if(Count[i]==0.0){Count[i]=int(ValO(ar,6,4,6,i,ind,st,ft));continue;}
      if(ValO(ar,6,4,6,i,ind,st,ft)<1){Count[i]=int(ValO(ar,6,4,6,i,ind,st,ft));continue;}
      if(Count[i]<ValO(ar,6,4,6,i,ind,st,ft)){Zero[i]=true;Count[i]=int(ValO(ar,6,4,6,i,ind,st,ft));}
     }
   for(i=0;i<2;i++)
     {
      if(ValO(ar,6,4,6,i)>0)continue;
      DelBP(Com+Nam[i+2]);
      DelBP(Com+Nam[i]);
     }
   for(i=0;i<2;i++)
     {
      if(virt)continue;
      DelBP(Com+Nam[i+2]);
      DelBP(Com+Nam[i]);
     }
//---     
   ArrayInitialize(Tim,0);
   Tim[0]=datetime(ValO(ar,8,2,8,8));
   Tim[1]=datetime(ValO(ar,8,2,8,9));
   Tim[2]=Time[0]+_Period*240;
   Col[0]=BayCol;
   Col[1]=SelCol;
   ArrayInitialize(Pr,0.0);   
//---
   if(virt)
     {
      if(all)
        {
         double tp=GetDou(Com+Nam[2],OBJPROP_PRICE1);
         if(tp>0.0){if(!(tp-Bid>miz)){if(ClosDel(ar,8)){DelBP(Com+Nam[2]);DelBP(Com+Nam[0]);}}}
         double sl=GetDou(Com+Nam[0],OBJPROP_PRICE1);
         if(sl>0.0){if(!(Bid-sl>miz)){if(ClosDel(ar,8)){DelBP(Com+Nam[2]);DelBP(Com+Nam[0]);}}}
         tp=GetDou(Com+Nam[3],OBJPROP_PRICE1);
         if(tp>0.0){if(!(Ask-tp>miz)){if(ClosDel(ar,9)){DelBP(Com+Nam[3]);DelBP(Com+Nam[1]);}}}
         sl=GetDou(Com+Nam[1],OBJPROP_PRICE1);
         if(sl>0.0){if(!(sl-Ask>miz)){if(ClosDel(ar,9)){DelBP(Com+Nam[3]);DelBP(Com+Nam[1]);}}} 
        }
      else
        {
         for(i=1;i<=ar[0][0];i++)
           {
            int tipe=int(ar[i][6]),tik=int(ar[i][4]),q=0;
            bool modbuy=false,flag=false;
            datetime ti=datetime(ar[i][8]);
            string suf=IntegerToString(tik);
            if(MathMod(tipe,2.0)==0.0)modbuy=true;
            if(!modbuy)q=1;
            double tp=GetDou(Com+Nam[q+2]+suf,OBJPROP_PRICE1),sl=GetDou(Com+Nam[q]+suf,OBJPROP_PRICE1); 
            if(tp>0.0){switch(q){case 0:if(!(tp-Bid>miz))flag=true;break;case 1:if(!(Ask-tp>miz))flag=true;break;}}
            if(flag){if(ClosOrd(tipe,tik,ar[i][2],ar[i][3],ar[i][5]))DelObj(Com+Nam[q+2]+suf);DelObj(Com+Nam[q]+suf);continue;} 
            if(sl>0.0){switch(q){case 0:if(!(Bid-sl>miz))flag=true;break;case 1:if(!(sl-Ask>miz))flag=true;break;}}
            if(flag){if(ClosOrd(tipe,tik,ar[i][2],ar[i][3],ar[i][5]))DelObj(Com+Nam[q+2]+suf);DelObj(Com+Nam[q]+suf);continue;}         
           }
        }
      Orders(ar);          
     } 
   if(all)BE(ar,Pr,all,true,tip,ind,st,ft); 
//---
   for(i=1;i<=ar[0][0];i++)
     {
      int tipe=int(ar[i][6]);
      bool modbuy=false;
      if(MathMod(tipe,2.0)==0.0)modbuy=true;
      int q=0;
      if(!modbuy)q=1;
      if(tip>-1)
        {
         if(tip<6){if(tipe!=tip)continue;}
         else
           {
            if(tip==8 && !modbuy)continue;
            if(tip==9 && modbuy)continue;
            if(tip==10 && tipe>1)continue;
            if(tip==11 && tipe<2)continue;
           }
        }
      if(ind>-1){if(int(ar[i][9])!=ind)continue;}
      datetime ti=datetime(ar[i][8]);
      if(ti<st || ti>ft)continue;
      int tik=int(ar[i][4]);
      string suf="";
      if(!all){suf=IntegerToString(tik);tim1=ti;}else tim1=Tim[q];
      double osl=0.0,otp=0.0;
      if(virt){osl=NormD(GetDou(Com+Nam[q]+suf,OBJPROP_PRICE1));otp=NormD(GetDou(Com+Nam[q+2]+suf,OBJPROP_PRICE1));}
      else{osl=NormD(ar[i][2]);otp=NormD(ar[i][3]);}
      double pr=NormD(ar[i][1]),sl=osl,slpr=osl,tral=osl,nlos=osl,tp=otp;
//---
      if(modbuy)
        {
         if(all)pr=Pr[0];
         if(take>0)tp=NormD(pr+take*_Point);
         if(stop>0)slpr=NormD(pr-stop*_Point); 
         if(tipe==0)
           {
            if(trstart>0)
              {
               tral=NormD(tralb);
               if((pr+trstart*_Point)-Ask>miz)tral=osl;
               //if(pr>tral)tral=osl;
               if(osl>0.0){if(tral<=osl)tral=osl;}
              }
            if(nl>0){nlos=NormD(pr+nlstep*_Point);if(osl>0.0){if(osl>=pr)nlos=osl;}if(nlos>NormD(Bid-NormE(nl-nlstep)*_Point))nlos=osl;}
           }
        }
      else
        {
         if(all)pr=Pr[1];
         if(take>0)tp=NormD(pr-take*_Point); 
         if(stop>0)slpr=NormD(pr+stop*_Point);
         if(tipe==1)
           {
            if(trstart>0)
              {
               tral=NormD(trals);
               if(Bid-(pr-trstart*_Point)>miz)tral=osl;
               //if(tral>pr)tral=osl;
               if(osl>0.0){if(osl<=tral)tral=osl;}
              }
            if(nl>0){nlos=NormD(pr-nlstep*_Point);if(osl>0.0){if(pr>=osl)nlos=osl;}if(NormD(Ask+NormE(nl-nlstep)*_Point)>nlos)nlos=osl;}
           }
        }
//---
      if(modbuy)
        {
         if(slpr>0.0)
           {
            if(nlos>0.0){if(tral>0.0)sl=MathMax(slpr,MathMax(nlos,tral));else sl=MathMax(slpr,nlos);}
            else{if(tral>0.0)sl=MathMax(slpr,tral);else sl=slpr;}
           } 
         else{if(nlos>0.0){if(tral>0.0)sl=MathMax(nlos,tral);else sl=nlos;}else{if(tral>0.0)sl=tral;}}
        } 
      else
        {
         if(slpr>0.0)
           {
            if(nlos>0.0){if(tral>0.0)sl=MathMin(slpr,MathMin(nlos,tral));else sl=MathMin(slpr,nlos);}
            else{if(tral>0.0)sl=MathMin(slpr,tral);else sl=slpr;}
           } 
         else{if(nlos>0.0){if(tral>0.0)sl=MathMin(nlos,tral);else sl=nlos;}else{if(tral>0.0)sl=tral;}}
        } 
//---
      if(virt)
        {
         if(sl>0.0)Tline(Com+Nam[q]+suf,tim1,sl,Tim[2],sl,Col[q]);else DelObj(Com+Nam[q]+suf);
         if(tp>0.0)Tline(Com+Nam[q+2]+suf,tim1,tp,Tim[2],tp,Col[q]);else DelObj(Com+Nam[q+2]+suf);
        }  
      else
        {
         if(modbuy)
           {
            if(Zero[0])
              {
               if(ar[i][2]>0.0){if(ModOrd(0,tik,ar[i][1],ar[i][2],ar[i][3],ar[i][1],0,ar[i][3]))z++;}
               if(ar[i][3]>0.0){if(ModOrd(0,tik,ar[i][1],ar[i][2],ar[i][3],ar[i][1],ar[i][2],0))z++;}
               continue;
              }
           }
         else
           {
            if(Zero[1])
              {
               if(ar[i][2]>0.0){if(ModOrd(1,tik,ar[i][1],ar[i][2],ar[i][3],ar[i][1],0,ar[i][3]))z++;}
               if(ar[i][3]>0.0){if(ModOrd(1,tik,ar[i][1],ar[i][2],ar[i][3],ar[i][1],ar[i][2],0))z++;}
               continue;
              }
           }
         if(NormD(MathAbs(sl-ar[i][2]))>0.0)
           {
            if(NormD(MathAbs(tp-ar[i][3]))>0.0)
              {if(ModOrd(tipe,tik,ar[i][1],ar[i][2],ar[i][3],ar[i][1],sl,tp))z++;}
            else{if(ModOrd(tipe,tik,ar[i][1],ar[i][2],ar[i][3],ar[i][1],sl,ar[i][3]))z++;}
           }
         else
           {
            if(NormD(MathAbs(tp-ar[i][3]))>0.0)
              {if(ModOrd(tipe,tik,ar[i][1],ar[i][2],ar[i][3],ar[i][1],ar[i][2],tp))z++;}
           }
        }
     }
   if(z>0)Orders(ar);
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   if(!IsTradeAllowed())return;
   time=TimeCurrent();
   if(dat!=0 && time>dat){Comment("Время демонстрации истекло.");return;}
   if(account!=0 && AccountNumber()!=account){Comment("Неверный номер счёта.");return;}
   if(key!=0 && Key!=key){Comment("Неверный ключ.");return;}
   textcom="";
   double Ord[][12],OrdH[][12];
   static bool Op[2],Cl[2];
   Orders(Ord);
   Signal(Ord,Op,Cl);
   if(first){Info(Ord);}
   int i=0;
   for(i=0;i<2;i++)
     {
      int contr=int(MathAbs(i-1));
      if(Cl[i] || Op[contr]) ClosDel(Ord,i);
     }
   Orders(OrdH,true);
   datetime opbar=iTime(_Symbol,tf,0)-1,opordh=datetime(ValO(OrdH,8,1,8));
   for(i=0;i<2;i++)
     {
      if(opordh>opbar) continue;
      if(!Op[i]) continue;
      if(Cl[i]) continue;
      int contr=int(MathAbs(i-1));
      if(ValO(Ord,6,4,6,contr)>0) continue;
      double opr=0.0,pr=0.0;
      switch(i) {case 0:opr=Ask;break;case 1:opr=Bid;break;}
      if(ValO(Ord,6,4,6,i,-1,opbar)<1 && ValO(OrdH,6,4,6,i,-1,opbar)<1) Op(i,Lot,opr,0,0);
      else
        {
         if(StepDistans<1) continue;
         pr=ValO(Ord,8,1,1,i,-1,opbar);
         if(pr==0.0) continue;
         if(!FreePr(Ord,opr,StepDistans*dig,i,-1,opbar)) continue;
         bool fl=false;
         switch(i) {case 0:if(opr-pr>miz) fl=true;break;case 1:if(pr-opr>miz) fl=true;break;}
         if(fl) continue;
         Op(i,Lot,opr,StopLoss*dig,0);
        }
     }
   Stops(Ord,0,StopLoss*dig,TrailStart*dig,TrailDistance*dig,TrailStep*dig,BreakevenStart*dig,BreakevenStep*dig,true);
   Info(Ord);
   //int er=GetLastError();
   //if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   //if(textcom!="" && textcom!=prevtextcom){Print(textcom);if(opnovis)Comment(textcom);prevtextcom=textcom;}
   if(first)first=false;
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   string txt="";
   if(!IsConnected())txt=StringConcatenate(txt,"Отсутствует связь с торговым сервером; ");
   if(!IsTradeAllowed())txt=StringConcatenate(txt,"Торговля запрещена; ");
   if(IsTradeContextBusy())txt=StringConcatenate(txt,"Поток для выполнения торговых операций занят");
   if(txt!="")GetText(Cor,Com+"98",txt,Fcol,X,Y,Size,Font,true);else DelObj(Com+"98",true);
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(IsTesting() || IsOptimization())return;
   EventKillTimer();
   Comment("");
   int ur=UninitializeReason();
   if(ur==1 || ur==6){DelBP(Com);DelBP("100");}
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Op(int tip,double olo,double opr,int stop,int take,int ind=0)
  {
   bool res=false;
   double sl=0.0,tp=0.0;
   //if(!UseClasicTral && !UseTralAll){if(TrailStart>0)stop=TrailStart*dig;}
   if(MathMod(tip,2.0)==0.0){if(!useECNNDD){if(stop>0)sl=opr-NormE(stop)*_Point;if(take>0)tp=opr+NormE(take)*_Point;}}
   else{if(!useECNNDD){if(stop>0)sl=opr+NormE(stop)*_Point;if(take>0)tp=opr-NormE(take)*_Point;}}
   if(SendOrd(tip,olo,opr,sl,tp,Com,ind)>0)res=true;
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SLTP(double &ar[][],int stop,int take,int tip=-1,int ind=-1,datetime st=0,datetime ft=EV)
  {
   if(!useECNNDD)return;
   //if(!UseClasicTral && !UseTralAll){if(TrailStart>0)stop=TrailStart*dig;}
   if(stop<1 && take<1)return;
   int z=0,i=0;
   for(i=1;i<=int(ar[0][0]);i++)
     {
      if(tip>-1)
        {
         if(tip<6){if(int(ar[i][6])!=tip)continue;}
         else
           {
            if(tip==8 && MathMod(ar[i][6],2)!=0)continue;
            if(tip==9 && MathMod(ar[i][6],2)==0)continue;
            if(tip==10 && ar[i][6]>1)continue;
            if(tip==11 && ar[i][6]<2)continue;
           }
        }
      if(ind>-1){if(int(ar[i][9])!=ind)continue;}
      datetime ti=datetime(ar[i][8]);
      if(ti<st || ti>ft)continue;
      double sl=0.0,tp=0.0;
      if(MathMod(ar[i][6],2.0)==0.0)
        {
         if(stop>0){if(ar[i][2]==0.0)sl=ar[i][1]-NormE(stop)*_Point;}
         if(take>0){if(ar[i][3]==0.0)tp=ar[i][1]+NormE(take)*_Point;}
        }
      else
        {
         if(stop>0){if(ar[i][2]==0.0)sl=ar[i][1]+NormE(stop)*_Point;}
         if(take>0){if(ar[i][3]==0.0)tp=ar[i][1]-NormE(take)*_Point;}
        }
      if(sl==0.0){if(tp==0.0)continue;sl=ar[i][2];}
      if(tp==0.0){if(sl==0.0)continue;tp=ar[i][3];}
      if(MathAbs(NormD(sl-ar[i][2]))>miz)
        {
         if(MathAbs(NormD(tp-ar[i][3]))>miz)
           {if(ModOrd(int(ar[i][6]),int(ar[i][4]),ar[i][1],ar[i][2],ar[i][3],ar[i][1],sl,tp))z++;}
         else{if(ModOrd(int(ar[i][6]),int(ar[i][4]),ar[i][1],ar[i][2],ar[i][3],ar[i][1],sl,ar[i][3]))z++;}
        }
      else
        {
         if(MathAbs(NormD(tp-ar[i][3]))>miz)
           {if(ModOrd(int(ar[i][6]),int(ar[i][4]),ar[i][1],ar[i][2],ar[i][3],ar[i][1],ar[i][2],tp))z++;}
        }
     }
   if(z>0)Orders(ar);
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
  }
//+------------------------------------------------------------------+
//|Трейлинг, индивидуальный либо общий с уровнем безубытка направления
//+------------------------------------------------------------------+
void TRNL(double &ar[][],int trstart,int tr,int trst,int nl,int nlst,bool all=false,int tip=-1,int ind=-1,datetime st=0,datetime ft=EV)
  {
   if(tr<1 && nl<1)return;
   int z=0,i=0;
   double prb=0.0,prs=0.0,lob=0.0,los=0.0,
   tralb=MathFloor(((Bid-NormE(tr-trst)*_Point)/_Point)/MathMax(trst,1))*_Point*MathMax(trst,1),
   trals=MathFloor(((Ask+NormE(tr-trst)*_Point)/_Point)/MathMax(trst,1))*_Point*MathMax(trst,1);
//---
   if(all)
     {
      datetime timb=0,tims=0,tim=Time[0]+_Period*240;
      for(i=1;i<=ar[0][0];i++)
        {
         if(ar[i][6]>1)continue;
         if(tip>-1)
           {
            if(tip<6){if(int(ar[i][6])!=tip)continue;}
            else
              {
               if(tip==8 && MathMod(ar[i][6],2)!=0)continue;
               if(tip==9 && MathMod(ar[i][6],2)==0)continue;
               if(tip==10 && ar[i][6]>1)continue;
               if(tip==11 && ar[i][6]<2)continue;
              }
           }
         if(ind>-1){if(int(ar[i][9])!=ind)continue;}
         datetime ti=datetime(ar[i][8]);
         if(ti<st || ti>ft)continue;
         switch(int(ar[i][6]))
           {
            case 0:lob+=ar[i][5];prb+=ar[i][1]*ar[i][5];if(timb>ti || timb==0)timb=ti;break;
            case 1:los+=ar[i][5];prs+=ar[i][1]*ar[i][5];if(tims>ti || tims==0)tims=ti;break;
           }
        }
      if(lob>0.0){prb=prb/lob;Tline(Com+"NLB",timb,prb,tim,prb,BayCol,true);}else DelObj(Com+"NLB",true);
      if(los>0.0){prs=prs/los;Tline(Com+"NLS",tims,prs,tim,prs,SelCol,true);}else DelObj(Com+"NLS",true);
     }
//---
   for(i=1;i<=ar[0][0];i++)
     {
      if(ar[i][6]>1)continue;
      if(tip>-1)
        {
         if(tip<6){if(int(ar[i][6])!=tip)continue;}
         else
           {
            if(tip==8 && MathMod(ar[i][6],2)!=0)continue;
            if(tip==9 && MathMod(ar[i][6],2)==0)continue;
            if(tip==10 && ar[i][6]>1)continue;
            if(tip==11 && ar[i][6]<2)continue;
           }
        }
      if(ind>-1){if(int(ar[i][9])!=ind)continue;}
      datetime ti=datetime(ar[i][8]);
      if(ti<st || ti>ft)continue;
      double sl=0.0,tral=0.0,nlos=0.0,pr=ar[i][1];
      switch(int(ar[i][6]))
        {
         case 0:
            if(all)pr=prb;
            if(tr>0)
              {
               tral=tralb;
               //if(UseClasicTral)
               {if(pr-tral>miz)tral=0.0;}
               if(tral>0.0){if((pr+trstart*_Point)-Bid>miz)tral=0.0;}
               if(tral>0.0){if(ar[i][2]>0.0){if(!(tral-ar[i][2]>miz))tral=0.0;}}
              }
            if(nl>0)
              {
               nlos=pr+nlst*_Point;
               if(ar[i][2]>0.0){if(ar[i][2]-pr>miz)nlos=0.0;}
               if(nlos-(Bid-NormE(nl-nlst)*_Point)>miz)nlos=0.0;
              }
            break;
         case 1:
            if(all)pr=prs;
            if(tr>0)
              {
               tral=trals;
               //if(UseClasicTral)
               {if(tral-pr>miz)tral=0.0;}
               if(tral>0.0){if(Ask-(pr+trstart*_Point)>miz)tral=0.0;}
               if(tral>0.0){if(ar[i][2]>0.0){if(!(ar[i][2]-tral>miz))tral=0.0;}}
              }
            if(nl>0)
              {
               nlos=pr-nlst*_Point;
               if(ar[i][2]>0.0){if(pr-ar[i][2]>miz)nlos=0.0;}
               if((Ask+NormE(nl-nlst)*_Point)-nlos>miz)nlos=0.0;
              }
            break;
        }
      if(tral==0.0 && nlos==0.0)continue;
      if(nlos==0.0 || tral==0.0)sl=MathMax(nlos,tral);
      if(tral>0.0 && nlos>0.0)
        {switch(int(ar[i][6])){case 0:sl=MathMax(nlos,tral);break;case 1:sl=MathMin(nlos,tral);break;}}
      if(MathAbs(NormD(sl-ar[i][2]))>miz)
        {if(ModOrd(int(ar[i][6]),int(ar[i][4]),ar[i][1],ar[i][2],ar[i][3],ar[i][1],sl,ar[i][3]))z++;}
     }
   if(z>0)Orders(ar);
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Tline(string name,datetime tim1,double pr1,datetime tim2,double pr2,color col,bool fl=false)
  {
   if(!opnovis)return;
   if(ObjectFind(0,name)<0){if(!ObjectCreate(0,name,OBJ_TREND,0,tim1,pr1,tim2,pr2))return;}
   ObjectSetInteger(0,name,OBJPROP_COLOR,col);
   ObjectSetInteger(0,name,OBJPROP_TIME1,tim1);
   ObjectSetInteger(0,name,OBJPROP_TIME2,tim2);
   ObjectSetDouble(0,name,OBJPROP_PRICE1,pr1);
   ObjectSetDouble(0,name,OBJPROP_PRICE2,pr2);
   if(fl)ChartRedraw();
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mod(double &ar[][],double pcup,double pcdn,int tip=-1,int ind=-1,datetime st=0,datetime ft=EV)
  {
   int z=0,i=0;
   for(i=1;i<=int(ar[0][0]);i++)
     {
      if(ar[i][6]<2)continue;
      if(tip>-1)
        {
         if(tip<6){if(int(ar[i][6])!=tip)continue;}
         else
           {
            if(tip==8 && MathMod(ar[i][6],2)!=0.0)continue;
            if(tip==9 && MathMod(ar[i][6],2)==0.0)continue;
            if(tip==10 && ar[i][6]>1)continue;
            if(tip==11 && ar[i][6]<2)continue;
           }
        }
      if(ind>-1){if(int(ar[i][9])!=ind)continue;}
      datetime ti=datetime(ar[i][8]);
      if(ti<st || ti>ft)continue;
      double op=0.0,sl=0.0,tp=0.0;
      switch(int(ar[i][6]))
        {
         case 2:op=pcdn;if(ar[i][2]>0.0)sl=op-(ar[i][1]-ar[i][2]);if(ar[i][3]>0.0)tp=op+(ar[i][3]-ar[i][1]);break;
         case 3:op=pcup;if(ar[i][2]>0.0)sl=op+(ar[i][2]-ar[i][1]);if(ar[i][3]>0.0)tp=op-(ar[i][1]-ar[i][3]);break;
         case 4:op=pcup;if(ar[i][2]>0.0)sl=op-(ar[i][1]-ar[i][2]);if(ar[i][3]>0.0)tp=op+(ar[i][3]-ar[i][1]);break;
         case 5:op=pcdn;if(ar[i][2]>0.0)sl=op+(ar[i][2]-ar[i][1]);if(ar[i][3]>0.0)tp=op-(ar[i][1]-ar[i][3]);break;
        }
      if(!(MathAbs(NormD(op-ar[i][1]))>0.0) || op==0.0)continue;
      if(ModOrd(int(ar[i][6]),int(ar[i][4]),ar[i][1],ar[i][2],ar[i][3],op,sl,tp))z++;
     }
   if(z>0)Orders(ar);
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ClosDel(double &ar[][],int tip=-1,int ind=-1,datetime st=0,datetime ft=EV)
  {
   bool res=true;
   int z=0,i=0;
   for(i=1;i<=ar[0][0];i++)
     {
      if(tip>-1)
        {
         if(tip<6){if(int(ar[i][6])!=tip)continue;}
         else
           {
            if(tip==8 && MathMod(ar[i][6],2)!=0.0)continue;
            if(tip==9 && MathMod(ar[i][6],2)==0.0)continue;
            if(tip==10 && ar[i][6]>1)continue;
            if(tip==11 && ar[i][6]<2)continue;
           }
        }
      if(ind>-1){if(int(ar[i][9])!=ind)continue;}
      datetime ti=datetime(ar[i][8]);
      if(ti<st || ti>ft)continue;
      if(ar[i][6]<2){if(ClosOrd(int(ar[i][6]),int(ar[i][4]),ar[i][2],ar[i][3],ar[i][5]))z++;else res=false;}
      if(ar[i][6]>1){if(DelOrd(int(ar[i][6]),int(ar[i][4]),ar[i][1]))z++;else res=false;}
     }
   if(z>0)Orders(ar);
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool FreePr(double &ar[][],double pr,int step,int tip=-1,int ind=-1,datetime st=0,datetime ft=EV)
  {
   bool res=true;
   int i=0;
   double up=pr+(step*_Point-_Point),dn=pr-(step*_Point-_Point);
   for(i=1;i<=ar[0][0];i++)
     {
      if(tip>-1)
        {
         if(tip<6){if(int(ar[i][6])!=tip)continue;}
         else
           {
            if(tip==8 && MathMod(ar[i][6],2)!=0)continue;
            if(tip==9 && MathMod(ar[i][6],2)==0)continue;
            if(tip==10 && ar[i][6]>1)continue;
            if(tip==11 && ar[i][6]<2)continue;
           }
        }
      if(ind>-1){if(int(ar[i][9])!=ind)continue;}
      datetime ti=datetime(ar[i][8]);
      if(ti<st || ti>ft)continue;
      if(dn-ar[i][1]>miz || ar[i][1]-up>miz)continue;
      res=false;
      break;
     }
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double ValO(double &ar[][],int val=1,int mod=1,int par=1,int tip=-1,int ind=-1,datetime st=0,datetime ft=EV,bool modcl=false)
  {
   double temp=0.0,res=0.0;
   int i=0;
   datetime ti=0,tim=0;
   if(mod<3){if(par==6 || par==9)res=-1;}
   for(i=1;i<=ar[0][0];i++)
     {
      if(tip>-1)
        {
         if(tip<6){if(int(ar[i][6])!=tip)continue;}
         else
           {
            if(tip==8 && MathMod(ar[i][6],2)!=0)continue;
            if(tip==9 && MathMod(ar[i][6],2)==0)continue;
            if(tip==10 && ar[i][6]>1)continue;
            if(tip==11 && ar[i][6]<2)continue;
           }
        }
      if(ind>-1){if(int(ar[i][9])!=ind)continue;}
      if(st>0 || ft<EV){if(modcl)ti=datetime(ar[i][11]);else ti=datetime(ar[i][8]);if(ti<st || ti>ft)continue;}
      switch(mod)
        {
         case 1:if(temp>0.0 && ar[i][val]>0.0 && !(ar[i][val]-temp>miz))break;temp=ar[i][val];res=ar[i][par];break;// max.
         case 2:if(temp>0.0 && ar[i][val]>0.0 && !(temp-ar[i][val]>miz))break;temp=ar[i][val];res=ar[i][par];break;// min.
         case 3:res+=ar[i][par];break;// summa.
         case 4:res+=1.0;break;// orders.
        }
     }
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
double Lots(double lot,double risk)
  {
   double res=lot;
   if(res==0.0 && risk>0.0)res=(AccountBalance()/(100.0/risk))/MarketInfo(_Symbol,MODE_MARGINREQUIRED);
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
double PipsPrice(int tip,double lot)
  {
   double res=0.0,lotsize=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
   string sy1=StringSubstr(_Symbol,0,3),sy2=StringSubstr(_Symbol,3,6);
   if(sy1=="USD")res=lotsize*lot*_Point;
   else
     {
      switch(tip)
        {
         case 0:
            if(sy2=="USD")res=lotsize*lot*_Point/Bid;
            else res=(lotsize*lot*_Point*SymbolInfoDouble(sy1+"USD",SYMBOL_BID))/Bid;
            break;
         case 1:
            if(sy2=="USD")res=lotsize*lot*_Point/Ask;
            else res=(lotsize*lot*_Point*SymbolInfoDouble(sy1+"USD",SYMBOL_ASK))/Ask;
            break;
        }
     }
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
double LotsRiskSL(double lot,double risk,int dist)
  {
   double res=lot;
   if(res==0.0 && risk>0.0)
     {
      double tikval=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE),sum=MathMin((AccountBalance()/100.0)*risk,AccountFreeMargin());
      res=1*(sum/(tikval*dist));
     }
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
bool TimeF(string st="",string fs="")
  {
   bool res=true;
   datetime s=0,f=EV;
   if(st!="")s=StringToTime(st);
   if(fs!="")f=StringToTime(fs);
   if(s==f)return(res);
   else{if(s<f){if(time<s || time>=f)res=false;}if(s>f){if(time<s){if(time>=f)res=false;}}}
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
bool NewBar()
  {
   static datetime newbar;
   if(newbar==0)newbar=Time[0];
   bool res=false;
   if(newbar==Time[0])return(res);
   newbar=Time[0];
   res=true;
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
void DelBP(string name)
  {
   if(!opnovis)return;
   int obj=ObjectsTotal(0,0);
   for(int i=obj-1;i>=0;i--)
     {
      string objnam=ObjectName(0,i,0);
      if(StringFind(objnam,name,0)>-1)
         ObjectDelete(0,objnam);
     }
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
  }
//+------------------------------------------------------------------+
double Spred()
  {
   long spread=SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
   double res=Ask-Bid;
   if(spread>0)res=spread*_Point;
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
void Info(double &ar[][])
  {
   if(!opnovis)return;
   string txt="",com=StringConcatenate(Com," I ");
   if(!ShowInfo){DelBP(com);return;}
   GetText(3,"100","=Created by mixa=",Gcol,100,15,6,"Verdana");
   long stoplevel=SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   color col=CLR_NONE;
   int y=Y;
   int ord=int(ValO(ar,6,4,0,8));
   if(ord>0)
     {
      y=int(y+Size*1.5);
      ord=int(ValO(ar,6,4,0,0));
      if(ord>0)txt=StringConcatenate("Buy = ",DoubleToString(ValO(ar,5,3,5,0),2)," [",IntegerToString(ord),"]");
      else txt="";
      ord=int(ValO(ar,6,4,0,2));
      if(ord>0)txt=StringConcatenate(txt,"BuyLimit = ",DoubleToString(ValO(ar,5,3,5,2),2)," [",IntegerToString(ord),"]");
      ord=int(ValO(ar,6,4,0,4));
      if(ord>0)txt=StringConcatenate(txt,"BuyStop = ",DoubleToString(ValO(ar,5,3,5,4),2)," [",IntegerToString(ord),"]");
      GetText(Cor,com+"1",txt,Gcol,X,y,Size,Font);
     }
   else DelObj(com+"1");
   ord=int(ValO(ar,6,4,0,9));
   if(ord>0)
     {
      y=int(y+Size*1.5);
      ord=int(ValO(ar,6,4,0,1));
      if(ord>0)txt=StringConcatenate("Sell = ",DoubleToString(ValO(ar,5,3,5,1),2)," [",IntegerToString(ord),"]");
      else txt="";
      ord=int(ValO(ar,6,4,0,3));
      if(ord>0)txt=StringConcatenate(txt,"SellLimit = ",DoubleToString(ValO(ar,5,3,5,3),2)," [",IntegerToString(ord),"]");
      ord=int(ValO(ar,6,4,0,5));
      if(ord>0)txt=StringConcatenate(txt,"SellStop = ",DoubleToString(ValO(ar,5,3,5,5),2)," [",IntegerToString(ord),"]");
      GetText(Cor,com+"2",txt,Gcol,X,y,Size,Font);
     }
   else DelObj(com+"2");
   /*y=int(y+Size*1.5);
   if(TakeProfit==0){txt="TakeProfit OFF";col=Gcol;}
   else
     {
      txt=StringConcatenate("TakeProfit = ",IntegerToString(NormE(TakeProfit*dig)));
      if(TakeProfit*dig<stoplevel)col=Fcol;else col=Gcol;
     }
   GetText(Cor,com+"3",txt,col,X,y,Size,Font);
   y=int(y+Size*1.5);
   if(StopLoss==0){txt="StopLoss OFF";col=Gcol;}
   else
     {
      txt=StringConcatenate("StopLoss = ",IntegerToString(NormE(StopLoss*dig)));
      if(StopLoss*dig<=stoplevel)col=Fcol;else col=Gcol;
     }
   GetText(Cor,com+"4",txt,col,X,y,Size,Font);
   y=int(y+Size*1.5);
   if(TrailStart==0){txt="Trail OFF";col=Gcol;}
   else
     {
      if(UseTralAll)txt="TralAll ON; ";else txt="TralAll OFF; ";
      if(UseClasicTral)txt=StringConcatenate(txt,"ClasicTral ON; ");
      else txt=StringConcatenate(txt,"ClasicTral OFF; ");
      GetText(Cor,com+"5",txt,col,X,y,Size,Font);
      y=int(y+Size*1.5);
      txt=StringConcatenate("TrailStart = ",IntegerToString(NormE(TrailStart*dig)));
      txt=StringConcatenate(txt," TrailDistance = ",IntegerToString(NormE(TrailDistance*dig)));
      if(TrailDistance*dig<stoplevel)col=Fcol;else col=Gcol;
      txt=StringConcatenate(txt," TrailStep = ",IntegerToString(MathMax(TrailStep*dig,1)));         
     }
   GetText(Cor,com+"6",txt,col,X,y,Size,Font);
   y=int(y+Size*1.5);
   if(BreakevenStart==0){txt="Breakeven OFF";col=Gcol;}
   else
     {
      if((BreakevenStart-BreakevenStep)*dig<stoplevel)col=Fcol;else col=Gcol;
      txt=StringConcatenate("BreakevenStart = ",IntegerToString(MathMax(BreakevenStart*dig,NormE((BreakevenStart-BreakevenStep)*dig))));
      txt=StringConcatenate(txt," BreakevenStep = ",IntegerToString(BreakevenStep*dig));
     }
   GetText(Cor,com+"7",txt,col,X,y,Size,Font);
   y=int(y+Size*1.5);
   txt="Время работы : ";
   if(TimeStart==TimeFinish)txt=StringConcatenate(txt,"круглосуточно");
   else txt=StringConcatenate(txt,"с ",TimeStart," до ",TimeFinish);
   GetText(Cor,com+"8",txt,Gcol,X,y,Size,Font);*/
   y=int(y+Size*1.5);
   double bal=AccountBalance();
   txt=StringConcatenate("Balance = ",DoubleToString(bal,2));
   GetText(Cor,com+"9",txt,Gcol,X,y,Size,Font);
   y=int(y+Size*1.5);
   double eq=AccountEquity();
   txt=StringConcatenate("Equity = ",DoubleToString(eq,2));
   if(bal-eq>miz)col=Fcol;else col=Gcol;
   GetText(Cor,com+"10",txt,col,X,y,Size,Font);
   y=int(y+Size*1.5);
   double prof=ValO(ar,7,3,7);
   txt=StringConcatenate("EA profit = ",DoubleToString(prof,2));
   if(prof<0.0)col=Fcol;else col=Gcol;
   GetText(Cor,com+"11",txt,col,X,y,Size,Font);
   y=int(y+Size*1.5);
   txt=TimeToString(time);
   GetText(Cor,com+"12",txt,Gcol,X,y,Size,Font,true);
   ydist=MathMax(int(y+Size*1.5),ydist);
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
  }
//+------------------------------------------------------------------+
void GetText(int cor,string name,string text,color col,int x,int y,int size,string font,bool fl=false)
  {
   if(!opnovis)return;
   if(ObjectFind(0,name)<0){if(!ObjectCreate(0,name,OBJ_LABEL,0,0,0))return;}
   ObjectSetInteger(0,name,OBJPROP_CORNER,cor);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
   ObjectSetText(name,text,size,font,col);
   if(fl)ChartRedraw();
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
  }
//+------------------------------------------------------------------+
void DelObj(string name,bool fl=false)
  {
   if(!opnovis)return;
   if(ObjectFind(0,name)<0)return;
   ObjectDelete(0,name);
   if(fl)ChartRedraw();
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
  }
//+------------------------------------------------------------------+
void Orders(double  &ar[][],bool his=false)
  {
   int q=0,i=0;
   int tot=0,pool;
   if(his){tot=OrdersHistoryTotal();pool=MODE_HISTORY;}else{tot=OrdersTotal();pool=MODE_TRADES;}
   if(tot>0)
     {
      ArrayResize(ar,tot+1);
      ArrayInitialize(ar,0.0);
      for(i=tot-1;i>=0;i--)
        {
         if(!OrderSelect(i,SELECT_BY_POS,pool))continue;
         if(OrderSymbol()!=_Symbol)continue;
         int mag=OrderMagicNumber();
         if(MathFloor(mag/1000)!=Magic)continue;
         q++;
         ar[q][1]=OrderOpenPrice();
         ar[q][2]=OrderStopLoss();
         ar[q][3]=OrderTakeProfit();
         ar[q][4]=OrderTicket();
         ar[q][5]=OrderLots();
         int tip=OrderType();
         ar[q][6]=tip;
         if(tip<2)ar[q][7]=OrderProfit()+OrderCommission()+OrderSwap();
         ar[q][8]=double(OrderOpenTime());
         ar[q][9]=mag-Magic*1000;
         ar[q][10]=OrderClosePrice();
         ar[q][11]=double(OrderCloseTime());
        }
      ar[0][0]=q;
      ArrayResize(ar,q+1);
     }
   else{ArrayResize(ar,1);ArrayInitialize(ar,0.0);}
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
  }
//+------------------------------------------------------------------+
int TFe(int ind)
  {
   int res=_Period;
   switch(ind)
     {
      case M1:res=PERIOD_M1;break;case M5:res=PERIOD_M5;break;case M15:res=PERIOD_M15;break;case M30:res=PERIOD_M30;break;
      case H1:res=PERIOD_H1;break;case H4:res=PERIOD_H4;break;case D1:res=PERIOD_D1;break;case W1:res=PERIOD_W1;break;case MN1:res=PERIOD_MN1;break;
     }
   return(res);
  }
//+------------------------------------------------------------------+
bool FreeM(double lo,int tip)
  {
   bool res=true;
   if(AccountFreeMarginCheck(_Symbol,tip,NormL(lo))<0.0){res=false;ResetLastError();}
   if(!res)GetText(Cor,Com+"97","Недостаточно средств для открытия позиции",Fcol,X,ydist,Size,Font,true);
   else DelObj(Com+"97",true); 
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
bool Conect()
  {
   bool res=true;
   if(!IsConnected())res=false;
   if(!IsTradeAllowed())res=false;
   if(IsTradeContextBusy())res=false;
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
string StrTip(int tip)
  {
   string name;
   switch(tip)
     {
      case 1:name=" Sell ";break;case 2:name=" BuyLimit ";break;case 3:name=" SellLimit ";break;
      case 4:name=" BuyStop ";break;case 5:name=" SellStop ";break;default:name=" Buy ";
     }
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(name);
  }
//+------------------------------------------------------------------+
int NormE(int pr)
  {
   long res=SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   //if(res<1)res=long((Spred()*2)/_Point);
   res++;
   if(pr>res)res=pr;
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(int(res));
  }
//+------------------------------------------------------------------+
double NormD(double pr)
  {
   double res=NormalizeDouble(pr,_Digits);
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
double NormL(double lo)
  {
   double res=lo;
   if(lotstep==0.0) lotstep=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   if(minlot==0.0) minlot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   if(maxlot==0.0) maxlot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   int mf=int(MathCeil(lo/lotstep));
   res=mf*lotstep;
   res=MathMax(res,minlot);
   res=MathMin(res,maxlot);
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
bool StopLev(double pr1,double pr2)
  {
   bool res=true;
   long par=SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   if(long(MathFloor((pr1-pr2)/_Point))<=par)res=false;
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
bool Freez(double pr1,double pr2)
  {
   bool res=true;
   long par=SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL);
   if(long(MathFloor((pr1-pr2)/_Point))<=par)res=false;
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
int SendOrd(int tip,double lo,double op,double sl,double tp,string com,int ind=0)
  {
   int i=0,tiket=0;
   color col=clrNONE;
   if(MathMod(tip,2.0)==0.0){if(!FreeM(lo,OP_BUY))return(tiket);col=BayCol;}else{if(!FreeM(lo,OP_SELL))return(tiket);col=SelCol;}
   for(i=1;i<=NamTry;i++)
     {
      if(!Conect())Sleep(4000);
      RefreshRates();
      switch(tip){case 0:op=Ask;break;case 1:op=Bid;break;}
      if(!ChekPar(tip,0.0,0.0,0.0,op,sl,tp,0))break;
      tiket=OrderSend(_Symbol,tip,NormL(lo),NormD(op),slipag,NormD(sl),NormD(tp),com,Magic*1000+ind,0,col);
      if(tiket>0){Comment("");break;}
      else
        {
         int er=GetLastError();
         textcom=StringConcatenate(textcom,"\n",__FUNCTION__,"Ошибка открытие позиции",StrTip(tip)," : ",
                                   ErrorDescription(er)," ,попытка ",IntegerToString(i),"  ",time);
         Err(er);
        }
     }
   return(tiket);
  }
//+------------------------------------------------------------------+
bool ClosOrd(int tip,int tik,double osl,double otp,double olo,double lo=-1.0)
  {
   bool res=false;
   int i=0;
   color col=SelCol;
   if(MathMod(tip,2.0)==0.0)col=BayCol;
   double lot=lo;
   if(lo<0.0)lot=olo;else lot=NormL(lo);
   for(i=1;i<=NamTry;i++)
     {
      if(!Conect())Sleep(4000);
      RefreshRates();
      if(!ChekPar(tip,0.0,osl,otp,0.0,0.0,0.0,1))break;
      double pr=0.0;
      if(MathMod(tip,2.0)==0.0)pr=Bid;else pr=Ask;
      res=OrderClose(tik,lot,NormD(pr),slipag,col);
      if(!res)
        {
         int er=GetLastError();
         textcom=StringConcatenate(textcom,"\n",__FUNCTION__,"Ошибка удаления",StrTip(tip),IntegerToString(tik)," : ",
                                   ErrorDescription(er)," ,попытка ",IntegerToString(i),"  ",time);
         Err(er);
        }
      else{Comment("");res=true;break;}
     }
   return(res);
  }
//+------------------------------------------------------------------+
bool DelOrd(int tip,int tik,double oop)
  {
   bool res=false;
   int i=0;
   color col=SelCol;
   if(MathMod(tip,2.0)==0.0)col=BayCol;
   for(i=1;i<=NamTry;i++)
     {
      if(!Conect())Sleep(4000);
      RefreshRates();
      if(!ChekPar(tip,oop,0.0,0.0,0.0,0.0,0.0,2))break;
      res=OrderDelete(tik,col);
      if(!res)
        {
         int er=GetLastError();
         textcom=StringConcatenate(textcom,"\n",__FUNCTION__,"Ошибка удаления",StrTip(tip),IntegerToString(tik)," : ",
                                   ErrorDescription(er)," ,попытка ",IntegerToString(i),"  ",time);
         Err(er);
        }
      else{Comment("");res=true;break;}
     }
   return(res);
  }
//+------------------------------------------------------------------+
bool ModOrd(int tip,int tik,double oop,double osl,double otp,double op,double sl,double tp)
  {
   bool res=false;
   int i=0;
   color col=SelCol;
   if(MathMod(tip,2.0)==0.0)col=BayCol;
   for(i=1;i<=NamTry;i++)
     {
      if(!Conect())Sleep(4000);
      RefreshRates();
      if(!ChekPar(tip,oop,osl,otp,op,sl,tp,3))break;
      res=OrderModify(tik,NormD(op),NormD(sl),NormD(tp),0,col);
      if(!res)
        {
         int er=GetLastError();
         textcom=StringConcatenate(textcom,"\n",__FUNCTION__,"Ошибка модификации",StrTip(tip),IntegerToString(tik)," : ",
                                   ErrorDescription(er)," ,попытка ",IntegerToString(i),"  ",time);
         Err(er);
        }
      else{Comment("");res=true;break;}
     }
   return(res);
  }
//+------------------------------------------------------------------+
bool ChekPar(int tip,double oop,double osl,double otp,double op,double sl,double tp,int mod=0)
  {
   bool res=true;
   double pro=0.0,prc=0.0;
   if(MathMod(tip,2.0)==0.0){pro=Ask;prc=Bid;}else{pro=Bid;prc=Ask;}
   switch(mod)
     {
      case 0: // Открытие ордеров.
         switch(tip)
           {
            case 0:
            if(sl>0.0 && !StopLev(prc,sl)){res=false;break;}
            if(tp>0.0 && !StopLev(tp,prc)){res=false;break;}
            break;
            case 1:
            if(sl>0.0 && !StopLev(sl,prc)){res=false;break;}
            if(tp>0.0 && !StopLev(prc,tp)){res=false;break;}
            break;
            case 2:
            if(!StopLev(pro,op)){res=false;break;}
            if(sl>0.0 && !StopLev(op,sl)){res=false;break;}
            if(tp>0.0 && !StopLev(tp,op)){res=false;break;}
            break;
            case 3:
            if(!StopLev(op,pro)){res=false;break;}
            if(sl>0.0 && !StopLev(sl,op)){res=false;break;}
            if(tp>0.0 && !StopLev(op,tp)){res=false;break;}
            break;
            case 4:
            if(!StopLev(op,pro)){res=false;break;}
            if(sl>0.0 && !StopLev(op,sl)){res=false;break;}
            if(tp>0.0 && !StopLev(tp,op)){res=false;break;}
            break;
            case 5:
            if(!StopLev(pro,op)){res=false;break;}
            if(sl>0.0 && !StopLev(sl,op)){res=false;break;}
            if(tp>0.0 && !StopLev(op,tp)){res=false;break;}
            break;
           }
         break;
      case 1: // Закрытие рыночных.
         switch(tip)
           {
            case 0:
            if(osl>0.0 && !Freez(prc,osl)){res=false;break;}
            if(otp>0.0 && !Freez(otp,prc)){res=false;break;}
            break;
            case 1:
            if(osl>0.0 && !Freez(osl,prc)){res=false;break;}
            if(otp>0.0 && !Freez(prc,otp)){res=false;break;}
            break;
           }
         break;
      case 2: // Удаление отложенников.
      if(prc>oop){if(!Freez(prc,oop)){res=false;break;}}
      else{if(!Freez(oop,prc)){res=false;break;}}
      break;
      case 3: // Модификация.
         switch(tip)
           {
            case 0:
            if(osl>0.0 && !Freez(prc,osl)){res=false;break;}
            if(otp>0.0 && !Freez(otp,prc)){res=false;break;}
            if(sl>0.0 && !StopLev(prc,sl)){res=false;break;}
            if(tp>0.0 && !StopLev(tp,prc)){res=false;break;}
            break;
            case 1:
            if(osl>0.0 && !Freez(osl,prc)){res=false;break;}
            if(otp>0.0 && !Freez(prc,otp)){res=false;break;}
            if(sl>0.0 && !StopLev(sl,prc)){res=false;break;}
            if(tp>0.0 && !StopLev(prc,tp)){res=false;break;}
            break;
            case 2:
            if(sl>0.0 && !StopLev(op,sl)){res=false;break;}
            if(tp>0.0 && !StopLev(tp,op)){res=false;break;}
            if(!StopLev(pro,op) || !Freez(pro,op)){res=false;break;}
            break;
            case 3:
            if(sl>0.0 && !StopLev(sl,op)){res=false;break;}
            if(tp>0.0 && !StopLev(op,tp)){res=false;break;}
            if(!StopLev(op,pro) || !Freez(op,pro)){res=false;break;}
            break;
            case 4:
            if(sl>0.0 && !StopLev(op,sl)){res=false;break;}
            if(tp>0.0 && !StopLev(tp,op)){res=false;break;}
            if(!StopLev(op,pro) || !Freez(op,pro)){res=false;break;}
            break;
            case 5:
            if(sl>0.0 && !StopLev(sl,op)){res=false;break;}
            if(tp>0.0 && !StopLev(op,tp)){res=false;break;}
            if(!StopLev(pro,op) || !Freez(pro,op)){res=false;break;}
            break;
           }
         break;
     }
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
   return(res);
  }
//+------------------------------------------------------------------+
//|Обработка ошибок по коду в соответствии с рекомендациями          |
//+------------------------------------------------------------------+
void Err(int id)
  {
   if(id==6 || id==129 || id==130 || id==136)Sleep(5000);
   if(id==128 || id==142 || id==143 || id==4 || id==132)Sleep(60000);
   if(id==145)Sleep(15000);
   if(id==146)Sleep(10000);
   int er=GetLastError();
   if(er>0)textcom=StringConcatenate(textcom,"\n",__FUNCTION__,ErrorDescription(er),"  ",time);
  }
//+------------------------------------------------------------------+
