Navigation:Home > Content >

Integra_NR_Virexes_MOD_v0.1.1.mq4

Time: 2016-10-06 | Download file:Integra_NR_Virexes_MOD_v0.1.1.mq4

//|                                               Integra_NR_Virexes MOD v01
/*
   Советник с динамическим лотом выставления колен сопровождения серии. Т.е. колени выставляются не ранее PipStep по сигналам индикаторов.  
   Лотность колен возрастает с увеличением пройденного расстояния от PipStep до сигнала индикаторов с целью максимально приблизить
уровень ТП к текущей цене.
   Трал в валюте депозита сделан с целью приближения уровня динамического ТП серии с каждым коленом к текущей цене при больших объемах
и максимальному извлечению прибыли в начале серии при еще малых объемах ордеров.
   Добавлено перекрытие ордеров.
*/
#property copyright             "Kordan"
#property link                  "http://www.leprecontrading.com/client/register.php?ref=103264"
#include                                                              
#include           

extern string t0 =              "ТП в валюте депозита";
extern double DefaultProfit      =          2.2;      // Тейк профит в валюте депозита (гарантированная сумма профита)
  
extern string t1 =              "Установки расстояний";
extern int    Tral_Start         =            6;      // Расстояние начала трала от линии Profit в пунктах (классический ТП в пунктах)
extern int    Tral_Size          =            3;      // Величина трала после Tral_Start в пунктах
extern int    PipStep            =           45;      // Шаг открытия колен в пунктах
extern string t13 =           "Установки увеличения лота";
            ////////////////////////////////////////////////////
               extern double K_cp              =          1;   /// Коэфициент чувствительности (для увеличения лота)
               extern double CP_Lot_step_Per =         0.01;   /// Увеличение лота в зависимости от пройденного растояния(лот в случае необходимости увеличивается НА заданую величину)  
            ////////////////////////////////////////////////////
extern string t2 =              "Установки объемов и MМ";
       int    Bonus              =            0;      // Средства, не учавствующие в торговле (в валюте депозита)
       double Risk               =            0;      // Первая сделка размером в % от свободных средств, если Risk=0 то первая сделка открывается размером DefaultLot
extern double DefaultLot         =         0.01;      // Начальный лот, работает если Risk=0
extern double LotExponent        =            1;      // Коэффициент увеличения лота
extern int    LockPercent        =           40;      // Процент локового ордера от суммарного объема основной серии (пока только инфо)

extern string t3 =              "Переход на фикслот";
extern int    FixLotPercent      =           20;      // Процент просадки для автоперехода на фиксированный лот
extern bool   FixLot             =        FALSE;      // Если TRUE, то фиксированный лот, если FALSE - динамический

extern string t4 =              "Установки перекрытия";
extern int    LeadingOrder       =            4;      // C какого колена работает перекрытие
extern int    ProfitPersent      =           30;      // Процент перекрытия(10...50)
extern int    SecondProfitPersent=           50;      // Процент перекрытия когда подключается предпоследний ордер

extern string t5 =              "Ограничения"  ;
extern int    MaxTrades          =           10;      // Максимальное количество одновременно открытых колен
extern double MaxLot             =          0.5;      // Ограничение на максимальный лот, если MaxLot=0, то макс возможный лот ДЦ
       int    CurrencySL         =            0;      // Ограничение по просадке в валюте депозита. Если  CurrencySL=0, то отключено.

extern string t6 =              "Закрыть Всё"  ;
extern bool   Close_All          =        FALSE;      // При вкл - принудительно закрываются все позиции, новый цикл не начинается

extern string t7 =              "Разрешить торговлю";
extern bool   NewCycle_ON        =         TRUE;      // При запрете - цикл дорабатывается до конца, новый цикл не начинается
extern bool   TradeBuy           =         TRUE;      // FALSE\TRUE - Запретить\Разрешить длинные позиции  
extern bool   TradeSell          =         TRUE;      // FALSE\TRUE - Запретить\Разрешить короткие позиции 

extern string t8 =              "Установки CCI";
extern int    CCI_TimeFrame      =            3;      // ТФ      CCI  (0-текущий ТФ графика, 1=М1,2=М5,3=М15,4=М30,5=Н1)   
extern int    Level              =          120;      // Уровень CCI     
extern int    Period_CCI         =           14;      // Период  CCI 
extern double Sens               =           10;      // Порог шумоподавления в пунктах.
extern int    CCI_kalibr         =            3;      // ( 2, 3)
       int    PriceTip           =            5;      // Тип цены
                                                      // 0 - PRICE_CLOSE    - цена закрытия 
                                                      // 1 - PRICE_OPEN     - цена открытия
                                                      // 2 - PRICE_HIGH     - макс.цена
                                                      // 3 - PRICE_LOW      - мин.цена
                                                      // 4 - PRICE_MEDIAN   - средняя цена,(high+low)/2
                                                      // 5 - PRICE_TYPICAL  - типичная цена,(high+low+close)/3
                                                      // 6 - PRICE_WEIGHTED - взвешенная цена закрытия,(high+low+close+close)/4

extern string t9 =              "Фильтры уровней по МА";
       int    TipMAFilter        =            1;      // Тип фильтра. Если 0-Выкл, если 1-фильтр shvondera, если 2-фильтр Kordana
extern int    TF_MA              =           15;      // Таймфрейм МА по фильтру Швондера ( 5, 15, 60)
extern int    Period_МА          =           24;      // Период скользящей средней
extern int    Distance_МА        =           10;      // Если Тип1 - Дистанция в пунктах на сколько цена должна отойти от МА для открытия ордера. Работа в сторону МА.
                                                      // Если Тип2 - Уровень запрета открытия ордеров выше/ниже от скользящей средней в пунктах. Отсечка на краях диапазона.
       string t10 =             "Фильтр времени на выходные"; 
       bool   UseFilterTime      =        FALSE;      // Использовать запрет торговли в пятницу после и в понедельник до указанных времен
       int    StartHourMonday    =            7;      // Время начала торговли в понедельник
       int    EndHourFriday      =           19;      // Время конца  торговли в пятницу

       string t11 =             "Изменение цвета и размера индикации";
       color  ColorInd           =       Silver;      // Цвет основной индикации
       color  ColorTP            =       Silver;      // Цвет линии Profit
       color  ColTPTrail         =   DarkOrange;      // Цвет линии Profit после срабатывания трала
       color  ColorZL            =  DeepSkyBlue;      // Цвет линии безубытка
       int    xDist1             =          300;      // Расстояние по горизонтали блока трала и нехватки средств
       int    xDist2             =          350;      // Расстояние по горизонтали блока суммарных профитов и объемов
       int    FontSize           =            8;      // Размер шрифта индикации

extern string t12 =             "Дополнительные параметры";
extern bool   Info               =        FALSE;      // Вкл индикации, звукового сопровождения открытия колен и подробного протоколирования
extern int    MagicNumber        =           15;      // Уникальный номер советника (при Magic=0 сов подхватывает ручные ордера)
extern string MagicNumList       =  "11 0 888 55 15";      // Список, через пробел, магиков которые советник будет считать своими (не более 10)
extern int    PauseTrade         =            6;      // Время ожидания между торговыми командами в сек 

//INTEGRA=INTEGRA=INTEGRA=INTEGRA=INTEGRA=INTEGRA=INTEGRA=INTEGRA

   int      mper[10]={0,1,5,15,30,60,240,1440,10080,43200},magic[10];
   int      CloseTrigger,dig,Error,Lpos,Lpos1,Cpos,PrcCL1,cmagic,totalord,totalbuy,totalsell,spr,freez,stlev;
   color    col,ZLcolor,TPcolor;
   double   TPPrice,ZeroLine,Cprofit,Lprofit,Lprofit1,PrcCL,CurrentDrawdown,CurrentUrov,Profit,SumProfit,SumLotBuy,SumLotSell,
            Lot,Sum_lot,Sumlot,minLot,maxLot,delta,delta2,Free,TV,Price,DrawDownRate;
   string   comment,prevar,DrawDownString="no_drawdown";
   bool     NoTrade,CloseAll,CloseFM,fixlot; 

//INTEGRA=INTEGRA=INTEGRA=INTEGRA=INTEGRA=INTEGRA=INTEGRA=INTEGRA
   
int init(){  
   DeleteObject()    ;  // Сброс триггера и очистка экрана
   dig = LotDecimal();
   
//***************** Автоматический переход на пятизнак *************

   int _digits = MarketInfo(Symbol(), MODE_DIGITS);
      if (_digits == 5 || _digits == 3){
         Tral_Start        *= 10;
         Tral_Size         *= 10;
         PipStep           *= 10;
         Distance_МА       *= 10;
         Sens              *= 10;
      }
         
//*********  Защита от неправильного выставления параметров  *******

   if(CCI_TimeFrame > 5 )  CCI_TimeFrame =   2  ;
   if(LockPercent  <= 0 )  LockPercent   =   1  ;
   if(DefaultLot   <= 0 )  DefaultLot    =0.01  ;
   if(AllowTrade() == false) return(0)          ;
      
//*******************************************************************

cmagic=0; string st; int k=StringLen(MagicNumList);
for (int a=0; a= 2) CheckOverlapping(totalbuy,totalsell)   ; 
 
//*********  Защита от неправильного выставления стопуровней  *************

int levels        =spr+freez+stlev          ;
   if(PipStep    <=levels) PipStep   =levels;
   if(Tral_Start <=levels) Tral_Start=levels; 
 
//====================  Управление закрытием ордеров  ======================

if (SumProfit<0 && CurrencySL!=0){
   if (MathAbs(SumProfit)>=CurrencySL){
      if (Info) Print("Просадка превысила заданный уровень");
         CloseFM=true;
   }
} 
if (totalord==0)  {CloseAll=false; Close_All=false;}
   if (Close_All || CloseAll || CloseFM){
      CloseOrders() ; Indication ("ICloseAll",2,10,150,"Закрытие ордеров",FontSize,"Times New Roman",ColorInd);
      DeleteObject(); // Сброс триггера и очистка экрана
      CloseFM=false;
         if (Info && Close_All)   Print("Закрыть ВСЁ");
   return;
   }

//===================   Переход на фиксированный лот   ======================

if (CurrentDrawdown<=FixLotPercent) fixlot=false; else fixlot=true ;
if (FixLot)  fixlot=true ; 

//====================  Расчет динамического профита  =======================

if(Risk!=0) Profit = NormalizeDouble(Lot*DefaultProfit/minLot,2); else Profit = DefaultProfit;  

//========================  Трейлинг профита  ===============================
   
if (SumProfit>(Profit+Tral_Start*TV*Sumlot) && !CloseTrigger){
   CloseTrigger=1; TPcolor=ColTPTrail; ZLcolor=ColorZL ;
}   
   if (!CloseTrigger){
   TPcolor=ColorTP; ZLcolor=ColorZL      ;
   delta  = (Profit-SumProfit)/TV/Sumlot ; // Число пунктов до профита
   delta2 =  SumProfit/TV/Sumlot         ; // Число пунктов до безубытка 
      if (Sum_lot>0){
      TPPrice=NormalizeDouble(Bid+delta*Point,Digits); ZeroLine=NormalizeDouble(Bid-delta2*Point,Digits)  ;
      }
      else{
      TPPrice=NormalizeDouble(Ask-delta*Point,Digits); ZeroLine=NormalizeDouble(Ask+delta2*Point,Digits)  ;
      } 
   }

      if (!IsTesting() || IsVisualMode() || !IsOptimization()){
         DrawLine("ILineTP",TPPrice,TPcolor,2); DrawLine("ILineZL",ZeroLine,ZLcolor,0); 
         DrawText("ItxtTP","Уровень ТП",TPPrice,TPcolor); DrawText("ItxtБУ","Уровень БУ",ZeroLine,ZLcolor);
      }
      if (totalord==0) ObjectDelete("ItxtБУ");
      
//==========================  Триггер трала  ===================================
if (CloseTrigger==1){       
//==========================  Buy  =============================================

   if (Sum_lot>0){
      if (Bid<=NormalizeDouble(TPPrice,Digits)){
         if (Info)  Print("Команда трала на закрытие Buy SL");                 CloseAll=true ;
      }
            else 
      if (TPPrice<(Bid-Tral_Size*Point)) TPPrice=NormalizeDouble(Bid-Tral_Size*Point,Digits) ;
   }

//==========================  Sell  ============================================ 

   if (Sum_lot<0){
      if (Ask>=NormalizeDouble(TPPrice,Digits)){
         if (Info)  Print("Команда трала на закрытие Sell SL ");               CloseAll=true ;
      }
            else 
      if (TPPrice>(Ask+Tral_Size*Point)) TPPrice=NormalizeDouble(Ask+Tral_Size*Point,Digits) ;
   }
} 

//******************************************************************************

if (!IsTesting() || IsVisualMode() || !IsOptimization()){
   if (Info){
   MainIndication(); 
   SetOrdersInfo(); 
   } 
}

//============================  Начало серии  ===================================
if (NewCycle_ON && time() && !Close_All && !NoTrade){
//========================  Открытие первого Buy  ===============================

double StartLot                                      ; 
int ticketbuy=0, ticketsell=0                        ;  
   if (TradeBuy && totalbuy==0){
      if (ticketbuy ==0){
         if (GetMASignalS()==1 || !TipMAFilter==1){
            if (GetMASignal("Buy")==true || !TipMAFilter==2){
               if (Signal_CCI()==1){
                  DeleteObject()                     ;
                  StartLot = NormalizeDouble(Lot,dig);     
                  if(Info) Print("Команда на открытие первого BUY");
                     comment=StringConcatenate("1-й ордер Buy, ","Magic : ",MagicNumber)           ;
                        ticketbuy = SendOrder(OP_BUY , StartLot, 0, 0, MagicNumber, comment, Error);
                  if (!IsTesting() || IsVisualMode() || !IsOptimization()){
                     if (Info) PlaySound("alert.wav");
                        Sleep(1000); // если это не тестирование - "засыпаем" на 1 секунду.; 
                  }
               }
            }
         }
      } 
   }   
   
//======================  Открытие первого Sell  ===============================

   if (TradeSell && totalsell==0){
      if (ticketsell==0){
         if (GetMASignalS()==-1 || !TipMAFilter==1){
            if (GetMASignal("Sell")==true || !TipMAFilter==2){
               if (Signal_CCI()==-1){
                  DeleteObject()                     ;
                  StartLot = NormalizeDouble(Lot,dig);    
                  if(Info) Print("Команда на открытие первого SELL");
                     comment=StringConcatenate("1-й ордер Sell, ","Magic : ",MagicNumber)            ;
                        ticketsell  = SendOrder(OP_SELL, StartLot, 0, 0, MagicNumber, comment, Error);
                  if (!IsTesting() || IsVisualMode() || !IsOptimization()){
                     if (Info) PlaySound("alert.wav");
                        Sleep(1000); // если это не тестирование - "засыпаем" на 1 секунду.; 
                  }
               }
            } 
         }   
      }        
   }   
}        

//============================  Сопровождение серии  ===========================

if (time() && !Close_All && !NoTrade){  
double NewLot,afmc;
ObjectDelete("InewLot");
double LastPriceBuy  = CurrentCondition("Buy" , "LastPriceBuy" );
double LastPriceSell = CurrentCondition("Sell", "LastPriceSell");

      //==========================  Buy  ======================================

   if (TradeBuy && totalbuy>0 && totalbuy<=MaxTrades){
      if (Ask<(LastPriceBuy-PipStep*Point)){  
         NewLot = NewLot("Buy", LastPriceBuy)                           ;
            afmc = AccountFreeMarginCheck(Symbol(), OP_BUY, NewLot)     ;
if(Info) Indication ("InewLot",3,10,115,StringConcatenate("Ожидаем ордер: Buy ",DoubleToStr(NewLot,dig)," / ","Оcтанется : $",DoubleToStr(afmc,0)),FontSize,"Times New Roman",ColorInd);            
           
      if(afmc<=0) return; else 
         if (GetMASignalS()==1 || !TipMAFilter==1){
            if (GetMASignal("Buy")==true || !TipMAFilter==2){
               if (Signal_CCI()==1){
                  if (Info)  Print("Команда индикаторов на открытие колена - BUY")                 ;   
                     comment=StringConcatenate(totalbuy+1,"-й ордер Buy, " ,"Magic : ",MagicNumber);
                        ticketbuy = SendOrder(OP_BUY, NewLot, 0, 0, MagicNumber, comment, Error);
                  if (!IsTesting() || IsVisualMode() || !IsOptimization()){
                     if (Info) PlaySound("alert.wav")                   ;
                        Sleep(1000); // если это не тестирование - "засыпаем" на 1 секунду.;  
                  }     
               }         
            }
         }     
      }         
   }   
      
      //==========================  Sell  =====================================

   if (TradeSell && totalsell>0 && totalsell<=MaxTrades){
      if (Bid>(LastPriceSell+PipStep*Point)){ 
         NewLot = NewLot("Sell", LastPriceSell)                         ;
            afmc = AccountFreeMarginCheck(Symbol(), OP_SELL, NewLot)    ;
if(Info) Indication ("InewLot",3,10,115,StringConcatenate("Ожидаем ордер: Sell ",DoubleToStr(NewLot,dig)," / ","Оcтанется : $",DoubleToStr(afmc,0)),FontSize,"Times New Roman",ColorInd);            
  
      if(afmc<=0) return; else 
         if (GetMASignalS()==-1 || !TipMAFilter==1){
            if (GetMASignal("Sell")==true || !TipMAFilter==2){
               if (Signal_CCI()==-1){
                  if (Info)  Print("Команда индикаторов на открытие колена - SELL")                   ; 
                     comment=StringConcatenate(totalsell+1,"-й ордер Sell, ","Magic : ",MagicNumber)  ;
                        ticketsell = SendOrder(OP_SELL, NewLot, 0, 0, MagicNumber, comment, Error); 
                  if (!IsTesting() || IsVisualMode() || !IsOptimization()){
                     if (Info) PlaySound("alert.wav")                   ;
                        Sleep(1000); // если это не тестирование - "засыпаем" на 1 секунду.;
                  }
               }
            }  
         } 
      }        
   }            
}    
                    
//====================================================================== 
   
      return;  // Выход из start
}

//++++++++++++++++++++           ФУНКЦИИ            ++++++++++++++++++++

// Qimer . Функция контроля наличия своего магика   ++++++++++++++++++++                                                                                       //

bool MagicCheck(){
   for(int i=0; i Distance_МА && Bid > iMA_Signal) Signal = -1; //Sell   
   if(Ma_Bid_Diff > Distance_МА && Bid < iMA_Signal) Signal = 1; //Buy   
double LevelNoBuy =iMA_Signal-Distance_МА*Point;
double LevelNoSell=iMA_Signal+Distance_МА*Point; 
      if (!IsTesting() || IsVisualMode() || !IsOptimization()){
         DrawLine("ILevelNoBuy  ", LevelNoBuy  , RoyalBlue, 3); 
         DrawLine("ILevelNoSell ", LevelNoSell , Crimson  , 3);  
         DrawText("ItxtLevelBuy ","Filter shvonder - запрет Buy" , LevelNoBuy , RoyalBlue);
         DrawText("ItxtLevelSell","Filter shvonder - запрет Sell", LevelNoSell, Crimson  );
      }
   }
return(Signal);
}

// Kordan . Фильтр уровней по МА K    ++++++++++++++++++++++++++++++++ //


int    GetMASignal(string inf)
{
   if (TipMAFilter==2)
   {
bool   SignalBuy   = true, SignalSell = true;
double iMA_Signal  = iMA(Symbol(), TF_MA, Period_МА, 0, MODE_SMMA, PRICE_CLOSE, 1);
int    Ma_Bid_Diff = MathAbs(iMA_Signal - Bid)/Point;
double LevelNoBuy =iMA_Signal+Distance_МА*Point;
double LevelNoSell=iMA_Signal-Distance_МА*Point;
      if(Ma_Bid_Diff > Distance_МА)
      { 
         if(Bid > iMA_Signal) SignalBuy  = false; //Запрет Buy
         if(Bid < iMA_Signal) SignalSell = false; //Запрет Sell  
      }   
      if (!IsTesting() || IsVisualMode() || !IsOptimization())
      {
         DrawLine("ILevelNoBuy  ", LevelNoBuy  , RoyalBlue, 3); 
         DrawLine("ILevelNoSell ", LevelNoSell , Crimson  , 3);
         DrawText("ItxtLevelBuy ","Filter Kordan - запрет Buy" , LevelNoBuy , RoyalBlue);  
         DrawText("ItxtLevelSell","Filter Kordan - запрет Sell", LevelNoSell, Crimson  ); 
      }  
   }
if (inf=="Buy" ) return(SignalBuy ) ;  //Запрет Buy
if (inf=="Sell") return(SignalSell) ;  //Запрет Sell
return(0);
}

// Kordan . Сигнал СCI  ++++++++++++++++++++++++++++++++++++++++++++++//

int Signal_CCI(){
int Signal = 0;
       //double x0 = iClose(Symbol(),mper[CCI_TimeFrame+1], 0)      ; 
       //double x1 = iClose(Symbol(),mper[CCI_TimeFrame+1], 2)      ; 
double x2 = iCustom(NULL,mper[CCI_TimeFrame],"iCCI.NR", Period_CCI,PriceTip,Sens, 0,0);
double x3 = iCustom(NULL,mper[CCI_TimeFrame],"iCCI.NR", Period_CCI,PriceTip,Sens, 0,1);
double x4 = iCustom(NULL,mper[CCI_TimeFrame],"iCCI.NR", Period_CCI,PriceTip,Sens, 0,CCI_kalibr); 
   if (x2>-Level && x3<-Level && x2>x4) Signal = 1;     //buy  //// && x1>x0
   if (x2< Level && x3> Level && x20 && profit>Lprofit) {
                  Lprofit = profit                                   ; //макс значение
                  Lpos    = Pos                                      ;
                  }
                  
                  if (profit<0 && profit0) 
                  result =AccountEquity()/AccountMargin()*100        ;     
               if (inf=="TotalOrd"        )  result++                ;
               
               if (OrdType == "Buy"){
                  if(OrderType()==OP_BUY){ 
                     if (inf=="TotalBuy"  )  result++                         ; 
                     if (inf=="LastLotBuy")  result  = OrderLots()            ;
                     if (inf=="SumLotBuy" )  result += OrderLots()            ;
                     AveragePrice += OrderOpenPrice()* OrderLots()            ;
                     Count        += OrderLots()                              ;
                     LastPriceBuy  = OrderOpenPrice()                         ;
                     ProfitBuy += OrderProfit()+OrderSwap()+OrderCommission() ;
                        if(AveragePrice > 0 && Count > 0){
                           if (inf=="CalculateAveragePriceBuy" )  return(NormalizeDouble(AveragePrice/Count, Digits));   
                        }     else return(0);
                  }
               }   
               
               if (OrdType == "Sell"){       
                  if (OrderType()==OP_SELL){                                                  
                     if (inf=="TotalSell"  )  result++                        ;                                                                   
                     if (inf=="LastLotSell")  result  = OrderLots()           ;                           
                     if (inf=="SumLotSell" )  result += OrderLots()           ;
                     AveragePrice  += OrderOpenPrice()* OrderLots()           ;
                     Count         += OrderLots()                             ;
                     LastPriceSell  = OrderOpenPrice()                        ;                                                                             
                     ProfitSell += OrderProfit()+OrderSwap()+OrderCommission();  
                        if(AveragePrice > 0 && Count > 0){  
                           if (inf=="CalculateAveragePriceSell")  return(NormalizeDouble(AveragePrice/Count, Digits));
                        }     else return(0);                
                  }
               }
            }
         }
      }   
   } 
 
if (inf=="Lpos")           return(Lpos)                                    ;  //Ордер с наибольшим профитом  
if (inf=="Cpos")           return(Cpos)                                    ;  //Ордер с наименьшим профитом 
if (inf=="LastPriceBuy" )  return(NormalizeDouble(LastPriceBuy , Digits))  ;
if (inf=="LastPriceSell")  return(NormalizeDouble(LastPriceSell, Digits))  ;        
if (inf=="ProfitBuy"    )  return(NormalizeDouble(ProfitBuy    ,      2))  ;        
if (inf=="ProfitSell"   )  return(NormalizeDouble(ProfitSell   ,      2))  ;                                                                                                  
if (inf=="SumProfit"    )  return(NormalizeDouble(_SumProfit    ,      2))  ;
return(result)                                                             ;
}

// Kordan . Расчет средств, участвующих в торговле   -------------------------------

double GetMoney(string inf){
   double FreeMargin = AccountFreeMargin();
   double Balance    = AccountBalance   ();
   FreeMargin       -= Bonus              ;     // Свободные средства
   Balance          -= Bonus              ;  
if (inf=="FreeMargin") return(NormalizeDouble( FreeMargin    , 2));
if (inf=="Balance"   ) return(NormalizeDouble( Balance       , 2));
if (inf=="Sredstva"  ) return(NormalizeDouble(AccountEquity(), 2));
return(0);
}

// Kordan . Функция расчета лота для открытия колен   --------------------------------

double NewLot(string OrdType, double LastPrice){
double newlot,cps,cpb,LastLot,CP_Lot_step                                             ;     /// Добавлено объявление переменной CP_Lot_step

   if (OrdType=="Buy"){
      LastLot  = CurrentCondition("Buy","LastLotBuy")                                 ;
                                 CP_Lot_step = 0                                      ;    /// Обнуление CP_Lot_step
         if (!fixlot) cpb=MathAbs(((LastPrice-Ask )/Point/PipStep)*K_cp); else cpb=1  ;    /// Изначально - if (!fixlot) cpb=MathAbs((LastPrice-Ask )/Point/PipStep);   else cpb=1 
                             if (cpb>1)  CP_Lot_step = CP_Lot_step_Per ;  else CP_Lot_step = 0 ;   /// Проверка необходимости увеличения лота
                                 newlot = NormalizeDouble(LastLot*LotExponent + CP_Lot_step,dig);  /// *cpb - убрано  /// Увеличение лота на величину CP_Lot_step
         if (MaxLot ==0)         newlot = newlot; else
         if (newlot > MaxLot)    newlot = NormalizeDouble(MaxLot,dig)                 ;
   }
   
   if (OrdType=="Sell"){
      LastLot  = CurrentCondition("Sell","LastLotSell")                               ;
                                 CP_Lot_step = 0                                      ;    /// Обнуление CP_Lot_step       
         if (!fixlot) cps=MathAbs(((Bid-LastPrice)/Point/PipStep)*K_cp);  else cps=1  ;    /// if (!fixlot) cps=MathAbs((Bid-LastPrice)/Point/PipStep);    else cps=1  
                              if (cps>1)  CP_Lot_step = CP_Lot_step_Per ; else CP_Lot_step = 0 ;   /// Проверка необходимости увеличения лота
                                 newlot = NormalizeDouble(LastLot*LotExponent + CP_Lot_step,dig);  /// *cps - убрано  /// Увеличение лота на величину CP_Lot_step
         if (MaxLot ==0)         newlot = newlot; else 
         if (newlot > MaxLot)    newlot = NormalizeDouble(MaxLot,dig)                 ;        
   } 
   
if(newlot < minLot)  newlot = minLot                                                  ;            
return(newlot)                                                                        ;
} 

// Kordan . Функция расчета начального лота ------------------------------------------
//
double GetLot(){  
double _Lot=0                                                      ;
   RefreshRates()                                                 ;  // Обновление данных
   double One_Lot = MarketInfo(Symbol(),MODE_MARGINREQUIRED)      ;  // Размер свободных средств, необходимых для открытия 1 лота на покупку
   double Step    = MarketInfo(Symbol(),MODE_LOTSTEP)             ;  // Шаг изменения размера лота
      if(Risk!=0)                                                    // Если кол-во лотов заданно в % от свободных средств,                                                          
         _Lot  =MathAbs(Free*Risk/3200/One_Lot/Step)*Step ;  else     // то считаем стоимость лота
         _Lot  =MathMax(DefaultLot,minLot)                         ;  // иначе выставляется заданное значение DefaultLot не меньше мин. размерa лота
      if(_LotFree){                                         // Если лот дороже свободных средств,
         if (!IsTesting() || IsVisualMode() || !IsOptimization()){   // то выводим сообщение в режиме Тест,
            Indication ("INoMoney",2,xDist1,40,"Недостаточно средств!!!",FontSize+5,"Courier",Red) ;  // Нулевая маржа              
         }
            else{ 
               Indication ("INoMoney",2,xDist1,40,"Недостаточно средств!!! Торговля остановлена!!!",FontSize+5,"Courier",Red); 
                  NoTrade=TRUE                                    ;  // останавливаем торговлю
            }          
         return (0)                                               ;  // и выходим из функции start()
      } 
      else  ObjectDelete("INoMoney")                              ;                                           
return(_Lot)                                                       ;
}

//// shvonder . 

bool AllowTrade(){
   if(Bars < Period_МА){
      Print("Недостачно баров в истории!"); 
         return(false); 
   }
   if (Bid == 0.0 || Ask == 0.0){
      Print(StringConcatenate("Неправильные цены. Ask: ", Ask, " Bid: ", Bid)); 
         return(false); 
   }
return(true);
}

// Функция расчета знака после запятой    ----------------------                                                                                                 //

int LotDecimal(){
int digits;   
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);   
   if (Step >= 1   ) digits = 0;
   if (Step >= 0.1 ) digits = 1;
   if (Step >= 0.01) digits = 2;
return(digits);
}   
 
// Qimer . Функция фильтра по времени      ------------------- //

bool time(){
   if (((Hour()=EndHourFriday && DayOfWeek()==5)) && UseFilterTime) return(false);
   else return(true);
}

// ir0407 . Функция открытия ордеров   -------------------------

int SendOrder (int Type, double Lots, int TP, int SL, int _magic, string Cmnt, int _Error){
double _Price, Take, Stop;
int Ticket, Slippage, Color, Err; 
bool Delay = False;
   if (Info) Print("Функция открытия ордеров");
while(!IsStopped()){  
   if (!IsTesting()){ //Если мы не в режиме тестирования
      if(!IsExpertEnabled()){
         _Error = ERR_TRADE_DISABLED;
         Print ("Эксперту запрещено торговать! Кнопка \"Советники\" отжата.");
         return(-1);
      }
         if (Info) Print("Эксперту разрешено торговать");
            if(!IsConnected()){
               _Error = ERR_NO_CONNECTION;
               Print("Связь отсутствует!");
            return(-1);
            }
      if (Info) Print("Связь с сервером установлена");
      if(IsTradeContextBusy()){
         Print("Торговый поток занят!");
         Print(StringConcatenate("Ожидаем ",PauseTrade," cek"));
         Sleep(PauseTrade*1000);
         Delay = True;
         continue;
      }
      if (Info) Print("Торговый поток свободен");
         if(Delay){
            if(Info) Print("Обновляем котировки");
            RefreshRates();
            Delay = False;
         }
      else if (Info) Print("Котировки актуальны");
      }
            switch(Type){
               case OP_BUY:
//               if (Info) Print("Инициализируем параметры для BUY-ордера");
                _Price = NormalizeDouble( Ask, Digits);
                Take = IIFd(TP == 0, 0, NormalizeDouble( Ask + TP * Point, Digits));
                Stop = IIFd(SL == 0, 0, NormalizeDouble( Ask - SL * Point, Digits));
                Color = Blue;
                break;
             case OP_SELL:
//                 if (Info) Print("Инициализируем параметры для SELL-ордера");
                 _Price = NormalizeDouble( Bid, Digits);
                 Take = IIFd(TP == 0, 0, NormalizeDouble( Bid - TP * Point, Digits));
                 Stop = IIFd(SL == 0, 0, NormalizeDouble( Bid + SL * Point, Digits));
                 Color = Red;
                 break; 
             default:
               Print("!Тип ордера не соответствует требованиям!");
               return(-1);
             }   
       string NameOP=GetNameOP(Type);      
       Slippage = 2*MarketInfo(Symbol(), MODE_SPREAD);      
       if (Info) Print(StringConcatenate("Ордер: ",NameOP," / "," Цена=",_Price," / ","Lot=",Lots," / ","Slip=",Slippage," pip"," / ",Cmnt)); 
       
	if(IsTradeAllowed()){
		if (Info) Print(">>>>>Торговля разрешена, отправляем ордер >>>>>");
			Ticket = OrderSend(Symbol(), Type, Lots, _Price, Slippage, Stop, Take, Cmnt, _magic, 0, Color);
   
		if(Ticket < 0){
         Err = GetLastError();
      if(Err == 4   || /* SERVER_BUSY       */
         Err == 129 || /* ERR_INVALID_PRICE */
         Err == 130 || /* INVALID_STOPS     */ 
         Err == 135 || /* PRICE_CHANGED     */ 
         Err == 137 || /* BROKER_BUSY       */ 
         Err == 138 || /* REQUOTE           */ 
         Err == 146 || /* TRADE_CONTEXT_BUSY*/
         Err == 136 )  /* OFF_QUOTES        */
            {
               if (!IsTesting()){
                  Print(StringConcatenate("Ошибка(OrderSend - ",Err,"): ",ErrorDescription(Err), ")"));
                  Print(StringConcatenate("Ожидаем ",PauseTrade," cek"));
                  Sleep (PauseTrade*1000);
                  Delay = True;
               continue;
               }
            }
               else{
                  Print(StringConcatenate("Критическая ошибка(OrderSend - ",Err,"): ",ErrorDescription(Err), ")"));
                  Error = Err;
               break;
               }
		}
      break;
	}
      else{
         if(Info) Print("Эксперту запрещено торговать! Снята галка в свойствах эксперта.");
      break;
      }
}
   if(Ticket > 0)
      if(Info) Print(StringConcatenate("Ордер отправлен успешно. Тикет = ",Ticket));
   else {
      if(Info) Print(StringConcatenate("Ошибка! Ордер не отправлен. (Код ошибки = ",Error,": ",ErrorDescription(Error), ")"));
   }
   return(Ticket);
}

// KimIV . Функция "если-то" для double    ----------------------------

double IIFd(bool condition, double ifTrue, double ifFalse) 
{if (condition) return(ifTrue); else return(ifFalse);}

// ir0407 . Функция закрытия ордеров  ---------------------------------                                                                                                     //

void CloseOrders(){
bool Delay = False;
double  ClosePrice;
color   CloseColor;
int Err;
	if (Info) Print("Функция закрытия ордеров");
		if (!IsTesting()){ //Если мы не в режиме тестирования
			if(!IsExpertEnabled()){
				Error = ERR_TRADE_DISABLED;
				Print("Эксперту запрещено торговать!");
				return;
			}
		if (Info) Print("Эксперту разрешено торговать");
			if(!IsConnected()){
				Error = ERR_NO_CONNECTION;
				Print("Связь отсутствует!");
				return;
			}
		}
		
   if (!IsTesting()){		
      if (Info) Print("Связь с сервером установлена");
   }
   
	for(int trade = OrdersTotal() - 1; trade >= 0; trade--){
		if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)){
			if(OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck())){
if (Info) Print("Закрываем ордер #", OrderTicket());
				while(!IsStopped()){
					if(IsTradeContextBusy()){
						Print("Торговый поток занят!");
						Print(StringConcatenate("Ожидаем ",PauseTrade," cek")); 
						Sleep(PauseTrade*1000);
						Delay = True;
					continue;
					}
					
   if (!IsTesting()){		
      if (Info) Print("Торговый поток свободен");
   }					
						if (Delay){
							if (Info) Print("Обновляем котировки");
							RefreshRates();
							Delay = False;
						}
							switch(OrderType()){
								case OP_BUY : ClosePrice = NormalizeDouble(Bid, Digits); CloseColor = Blue; break;
								case OP_SELL: ClosePrice = NormalizeDouble(Ask, Digits); CloseColor = Red ; break;
							}
							
   int Slippage = 2*MarketInfo(Symbol(), MODE_SPREAD);
      if (Info) Print(StringConcatenate("Цена закрытия=",ClosePrice," / ","Slip = ",Slippage," pip"));  
							if(!IsTradeAllowed()){
								Print("Эксперту запрещено торговать, снята галка в свойствах эксперта!");
								return;
							}
								else
					if(!OrderClose(OrderTicket(), OrderLots(), ClosePrice, Slippage, CloseColor)){
						Err = GetLastError();
						if(Err == 4   || /* SERVER_BUSY       */
							Err == 129 || /* ERR_INVALID_PRICE */ 
							Err == 130 || /* INVALID_STOPS     */ 
							Err == 135 || /* PRICE_CHANGED     */ 
							Err == 137 || /* BROKER_BUSY       */ 
							Err == 138 || /* REQUOTE           */ 
							Err == 146 || /* TRADE_CONTEXT_BUSY*/
							Err == 136 ){ /* OFF_QUOTES        */
								Print(StringConcatenate("Ошибка(OrderClose - ",Err,"): ",ErrorDescription(Err), ")")); 
								Print(StringConcatenate("Ожидаем ",PauseTrade," cek")); 
								Sleep(PauseTrade*1000);
								Delay = True;
								continue;
							}
							else{
								Print(StringConcatenate("Критическая ошибка(OrderClose - ",Err,"): ",ErrorDescription(Err), ")"));
								break;
							}
					} 	else break;								
				}   Sleep(100);        // конец while(!IsStopped())	
			}
		}	
	}		
if (Info) Print("Конец функции закрытия ордеров.");
	return;
}

// shvonder . Перекрытие ордеров    ------------------------------

void CheckOverlapping(int totbuy, int totsell){
Lpos = 0; Cpos = 0; Lprofit = 0; Cprofit = 0;

Lpos = CurrentCondition("","Lpos");
Cpos = CurrentCondition("","Cpos");

   if (totbuy >= LeadingOrder){
      if(Lprofit > 0 && Lprofit1 <= 0){
         if(Lprofit + Cprofit > 0 && (Lprofit + Cprofit)*100/Lprofit > ProfitPersent){
            Lpos1 = 0;
            CloseSelectOrder(OP_BUY); 
         }
      }else
         if(Lprofit > 0 && Lprofit1 > 0){
            if(Lprofit + Lprofit1 + Cprofit > 0 && (Lprofit + Lprofit1 + Cprofit)*100/(Lprofit + Lprofit1) > SecondProfitPersent) CloseSelectOrder(OP_BUY); 
         }
  } 

   if (totsell >= LeadingOrder){
      if(Lprofit > 0 && Lprofit1 <= 0){
         if(Lprofit + Cprofit > 0 && (Lprofit + Cprofit)*100/Lprofit > ProfitPersent){
            Lpos1 = 0;
            CloseSelectOrder(OP_SELL); 
         }
      }  
         if(Lprofit > 0 && Lprofit1 > 0){
            if(Lprofit + Lprofit1 + Cprofit > 0 && (Lprofit + Lprofit1 + Cprofit)*100/(Lprofit + Lprofit1) > SecondProfitPersent) CloseSelectOrder(OP_SELL); 
         }
   } 
}

// shvonder . Перекрытие ордеров   ------------------------------------------

int CloseSelectOrder(int Tip){
if (Info) Print("Функция перекрытия ордеров.");
   int error =  0;
   int error1 = 0;
   int error2 = 0;
   int Result = 0;
   int Slippage = 2*MarketInfo(Symbol(), MODE_SPREAD);
//  ----------------- последний  ---------------------------------------------                      
       
   while (error1 == 0) {
      RefreshRates();
         int i = OrderSelect(Lpos, SELECT_BY_TICKET, MODE_TRADES);
            if (i != 1){
               Print ("Ошибка! Невозможно выбрать ордер с наибольшим профитом. Выполнение перекрытия отменено.");
                  return (0);
            }  
            if (OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck())){
               if (Tip == OP_BUY) {
                  error1 =  (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, Blue));
                  if (error1 == 1) {
                     if (Info) Print ("Лидирующий ордер закрыт успешно."); 
                     Sleep (500);   
                  } else {
                     Print ("Ошибка закрытия лидирующего ордера, повторяем операцию. ");                     
                  }      
               } 
//                        -----------------------------------------------------               
               if (Tip == OP_SELL) {
                  error1 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, Red));
                  if (error1 == 1) {
                     if (Info) Print ("Лидирующий ордер закрыт успешно"); 
                     Sleep (500);   
                  } else {
                     Print ("Ошибка закрытия лидирующего ордера, повторяем операцию. ");                     
                  }
               }
            } 
      }

//                       ---------------------- пред последний  -----------------                           
   if(Lpos1 != 0){
      while (error2 == 0) {
         RefreshRates();
            i = OrderSelect(Lpos1, SELECT_BY_TICKET, MODE_TRADES);
               if  (i != 1 ){
                  Print ("Ошибка! Невозможно выбрать пред ордер с наибольшим профитом. Выполнение перекрытия отменено.");
                  return (0);
               }  
            if (OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck())){
               if (Tip == OP_BUY){
                  error2 =  (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, Blue));
                  if (error2 == 1){
                     if (Info) Print ("Пред Лидирующий ордер закрыт успешно."); 
                     Sleep (500);   
                  } else{
                     Print ("Ошибка закрытия пред лидирующего ордера, повторяем операцию. ");                     
                  }      
               } 
//                        -----------------------------------------------------               
               if (Tip == OP_SELL){
                  error2 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, Red));
                  if (error2 == 1){
                     if (Info) Print ("Пред Лидирующий ордер закрыт успешно"); 
                     Sleep (500);   
                  } else {
                     Print ("Ошибка закрытия Пред лидирующего ордера, повторяем операцию. ");                     
                  }
               }
            } 
      }
      }
//                      ----------- выбранный (обычно с наименьшим профитом ) -----------
   while (error == 0){
      RefreshRates();
         i = OrderSelect(Cpos, SELECT_BY_TICKET, MODE_TRADES);
            if  (i != 1 ){
               Print ("Ошибка! Невозможно выбрать ордер с наименьшим профитом. Выполнение перекрытия отменено.");
               return (0);
            }    
            if (OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck())){
               if (Tip == OP_BUY){
                  error = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, Blue)); 
                  if (error == 1 ){
                     if (Info) Print ("Перекрываемый ордер закрыт успешно."); 
                     Sleep (500);   
                  } else {
                     Print ("Ошибка закрытия перекрываемого ордера, повторяем операцию. ");                    
                  } 
               }        
//                             --------------------------------------------------                
               if (Tip == OP_SELL){
                  error = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, Red));
                  if (error == 1){
                     if (Info) Print ("Перекрываемый ордер закрыт успешно."); 
                     Sleep (500);   
                  } else {
                     Print ("Ошибка закрытия перекрываемого ордера, повторяем операцию. ");                     
                  }
               }
            }
      }     
       
   Result = 1;
   return (Result);    
} 

// Kordan . Функция удаления объектов      ------------------------------

int DeleteObject() {
CloseTrigger=0; TPPrice=0; ZeroLine=0     ;
int    ObjTotal = ObjectsTotal()          ;
string ObName                             ;
   for(int i = 0; i < ObjTotal; i++){
   ObName = ObjectName(i)                 ;
      if(StringSubstr(ObName,0,1) == "I" 
      || StringSubstr(ObName,0,1) == "i"){ 
         ObjectDelete(ObName)             ;
            Comment("")                   ; 
         i = i - 1                        ;
      }
   }
return(0);      
} 

// Qimer . Отрисовка линий   -------------------------------------------                                                                                                              //

void DrawLine(string name,double price, color _Color, int width){
   if (ObjectFind(name)<0)
      ObjectCreate(name,OBJ_HLINE,0,0,price); 
         else 
            ObjectMove(name,0,Time[1],price);
         ObjectSet(name,OBJPROP_COLOR,_Color)  ;
      ObjectSet(name,OBJPROP_WIDTH,width)   ;
}

// Qimer . Отрисовка текста  -------------------------------------------

void DrawText(string name, string txt, double y, color col1){  
   if (ObjectFind(name)<0) ObjectCreate(name,OBJ_TEXT,0,Time[WindowFirstVisibleBar()-WindowFirstVisibleBar()/5],y);
      else ObjectMove(name,0,Time[WindowFirstVisibleBar()-WindowFirstVisibleBar()/4],y);
   ObjectSetText(name,txt,10,"Times New Roman",col1);
}

// Kordan . Индикация --------------------------------------------------                                                                                                                //

void Indication (string name,int corner,int Xdist,int Ydist,string txt,int fontsize,string font,color col2){
   if (ObjectFind(name)<0)
      ObjectCreate(name,OBJ_LABEL,0,0,0)             ; 
         ObjectSet(name, OBJPROP_CORNER, corner)     ;
            ObjectSet(name, OBJPROP_XDISTANCE, Xdist);
         ObjectSet(name, OBJPROP_YDISTANCE, Ydist)   ;
      ObjectSetText(name,txt,fontsize,font,col2)      ; 
} 

// shvonder . Функция отрисовки профита и лотов ордеров    -------------

void SetOrdersInfo(){
int ObjTotal = ObjectsTotal();
   string ObName;
      for(int i = 0; i < ObjTotal; i++){
         ObName = ObjectName(i);
         if(StringSubstr(ObName,0,1) == "i"){ 
            ObjectDelete(ObName);
         i = i - 1;
         }
      }

int TotalBuyOrd = 1;
   for(i=OrdersTotal();i>=0;i--){
      if (OrderSelect(i,SELECT_BY_POS, MODE_TRADES)){
         if (OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck())){  
            if (OrderType()==OP_BUY){ 
               ObjectCreate (StringConcatenate("iB",TotalBuyOrd), OBJ_TEXT, 0, Time[40], OrderOpenPrice());
               ObjectSetText(StringConcatenate("iB",TotalBuyOrd), StringConcatenate("Lot: ",DoubleToStr(OrderLots(), 2)," Prof: ",DoubleToStr(OrderProfit(),2)), 8, "Verdana", DeepSkyBlue);
            TotalBuyOrd = TotalBuyOrd + 1;
            }       
         }
      }
   }
  
int TotalSellOrd = 1;
   for(i=OrdersTotal();i>=0;i--){
      if (OrderSelect(i,SELECT_BY_POS, MODE_TRADES)){
         if (OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck())){ 
            if (OrderType()==OP_SELL){  
               ObjectCreate (StringConcatenate("iS",TotalSellOrd), OBJ_TEXT, 0, Time[40], OrderOpenPrice());
               ObjectSetText(StringConcatenate("iS",TotalSellOrd), StringConcatenate("Lot: ",DoubleToStr(OrderLots(), 2)," Prof: ",DoubleToStr(OrderProfit(),2)), 8, "Verdana", DarkOrange);
            TotalSellOrd = TotalSellOrd + 1;
            }      
         }
      }
   }
}

// Kordan . Функция главной индикации   ----------------------------------

void MainIndication() {

   if(ObjectFind("DrawDown")>=0){
        datetime time_coordinate=ObjectGet("DrawDown",OBJPROP_TIME1)      ;
        int shift=iBarShift(Symbol(),0,time_coordinate)    ;
        double price_coordinate=iHigh(Symbol(),0,shift)+(WindowPriceMax()-WindowPriceMin())/20 ;
        bool changed=ObjectSet("DrawDown",OBJPROP_PRICE1,price_coordinate);
    }
  
    if(DrawDownRate<(AccountBalance()+AccountCredit()-AccountEquity()+AccountCredit())/AccountBalance()+AccountCredit()){
        ObjectDelete("DrawDown")                           ;
        DrawDownRate=(AccountBalance()+AccountCredit()-AccountEquity()+AccountCredit())/AccountBalance()+AccountCredit();
        prevar=StringConcatenate(DoubleToStr(DrawDownRate*100,2)," %")    ;
        ObjectCreate("DrawDown",OBJ_ARROW,0,Time[0],High[0]+(WindowPriceMax()-WindowPriceMin())/20);
        ObjectSet("DrawDown",OBJPROP_ARROWCODE,117)        ;
        ObjectSet("DrawDown",OBJPROP_COLOR,DarkOrange)     ;
        ObjectSet("DrawDown",OBJPROP_TIMEFRAMES,0)         ;
        ObjectSetText("DrawDown",prevar)                   ;
    }

   double ProfitBuy = CurrentCondition("Buy" ,"ProfitBuy" );
   double ProfitSell= CurrentCondition("Sell","ProfitSell");  
   double Balance   = GetMoney("Balance" )                 ;
   double Sredstva  = GetMoney("Sredstva")                 ;  
      if (Sredstva >= Balance/6*5) col = ColorInd          ; 
      if (Sredstva >= Balance/6*4 && Sredstva < Balance/6*5) col = DeepSkyBlue ;
      if (Sredstva >= Balance/6*3 && Sredstva < Balance/6*4) col = Gold        ;
      if (Sredstva >= Balance/6*2 && Sredstva < Balance/6*3) col = OrangeRed   ;
      if (Sredstva >= Balance/6   && Sredstva < Balance/6*2) col = Crimson     ;
      if (Sredstva <  Balance/6                            ) col = Red         ;
     
   //-------------------------
   
   string spips;
   int pips=NormalizeDouble((AccountEquity()-AccountStopoutLevel()*AccountEquity()/ 100.0)/Sumlot/TV,0) ;
   string lock=DoubleToStr(NormalizeDouble(Sumlot/100*LockPercent,dig),dig);
      if (Sum_lot!=0){
         string Prof  = StringConcatenate("До профита "  ,DoubleToStr(delta+Tral_Start, 0)," пунктов");  // Число пунктов до профита
         string Bezub = StringConcatenate("До безубытка ",DoubleToStr(delta2, 0)          ," пунктов");  // Число пунктов до безубытка       
            if (Sum_lot <0){
               spips = StringConcatenate("До слива ",pips," пунктов вверх")  ;
               lock  = StringConcatenate("Ордер для лока: Buy ",lock)        ;
            }
               else{ 
                  spips = StringConcatenate("До слива ",pips," пунктов вниз");
                  lock  = StringConcatenate("Ордер для лока: Sell ",lock)    ;
               }
      }
                  else{
                     if (SumLotBuy==0 && SumLotSell==0){
                        spips="Нет ордеров"; Prof=""; Bezub="" ;
                     }
                        else{
                           spips ="Ждем первое колено"         ;
                           Prof  ="Трал отдыхает"              ;
                           Bezub ="Выставлен замок"            ;
                        }
                        lock = StringConcatenate("Процент локового ордера = ",LockPercent);
                  }                                

//==========================  Левый верхний угол  =====================================     
if (MaxLot!=0) maxLot=MaxLot                                   ; 
   if (IsDemo()) string tip = "Демо"; else tip = "Реал"        ;  
   Comment(  
      "\n", StringConcatenate(" Счет : ",tip," - №: ",AccountNumber()," \ ",AccountCompany()), 
      "\n", StringConcatenate(" Серверное время = ", TimeToStr(TimeCurrent(),TIME_SECONDS))," \ ",NameDayOfWeek(DayOfWeek()),
      "\n", StringConcatenate(" Макс. лот = ",NormalizeDouble(maxLot,dig)," \ "," Мин.  лот = ",NormalizeDouble(minLot,dig)),
      "\n", StringConcatenate(" Плечо = ",AccountLeverage()," : 1  \ "," Спред = ",spr),    
      "\n", StringConcatenate(" Уровни : Заморозки = ",freez," \ "," Стопов = ",stlev," \ "," StopOut = ",AccountStopoutLevel(),"%"), 
      "\n", StringConcatenate(" Свопы : Buy = ",MarketInfo(Symbol(), MODE_SWAPLONG)," \ "," Sell = ",MarketInfo(Symbol(), MODE_SWAPSHORT)), 
      "\n","====================================",
      "\n"
        );   
            
//==========================  Левый нижний угол и центр ===============================

   if ( fixlot        ) string txt="Фиксированный лот"; else txt="Динамический лот"                                         ;
   if (!NewCycle_ON   ) Indication ("INewCycleON",2,10,135,"Запрет начала нового цикла",FontSize,"Times New Roman",ColorInd);
   if (!TradeBuy      ) Indication ("ITradeBuy"  ,2,10,120,"Ручной запрет Buy" ,FontSize,"Times New Roman",ColorInd        );
   if (!TradeSell     ) Indication ("ITradeSell" ,2,10,105,"Ручной запрет Sell",FontSize,"Times New Roman",ColorInd        );
   
if (TipMAFilter==1 || TipMAFilter==2){   
   if (GetMASignal("Buy" )==false && (GetMASignalS()==-1 || GetMASignalS()==0)) Indication ("ILevelBuy" ,2,10,90 ,"Запрет Buy" ,FontSize,"Times New Roman",ColorInd ); else ObjectDelete("ILevelBuy" );
   if (GetMASignal("Sell")==false && (GetMASignalS()== 1 || GetMASignalS()==0)) Indication ("ILevelSell",2,10,75 ,"Запрет Sell",FontSize,"Times New Roman",ColorInd ); else ObjectDelete("ILevelSell");
}   
   
   if (!time()        ) Indication ("Itime",2,10,60 ,"Включен фильтр выходныx дней",FontSize,"Times New Roman",ColorInd); else ObjectDelete("Itime" );
   if (CloseTrigger==1) Indication ("ITrail",2,xDist1,10,"Поздравляю! Пошел трал профита!",FontSize+5,"Courier",Lime   ); else ObjectDelete("ITrail"); 
Indication ("IFixLot",2,10,45 ,txt,FontSize,"Times New Roman",ColorInd);   
Indication ("ICCI",2,10,30,StringConcatenate("CCI (",DoubleToStr(Level,0),",",Period_CCI,",",CCI_TimeFrame,")"),FontSize,"Times New Roman",ColorInd);
//==========================  Правый нижний угол  ===================================== 

Indication ("Ispips"   ,3,10,55 ,spips,FontSize,"Times New Roman",col)     ;      
Indication ("Ilock"    ,3,10,10 ,lock ,FontSize,"Times New Roman",ColorInd);
Indication ("IProf"    ,3,10,40 ,Prof ,FontSize,"Times New Roman",col)     ;  
Indication ("IBezub"   ,3,10,25 ,Bezub,FontSize,"Times New Roman",col)     ;  
Indication ("MaxDrDown",3,10,145,StringConcatenate("Макс. Просадка: ",DoubleToStr(MathMax(DrawDownRa        

Recommend