//+------------------------------------------------------------------+
//|                                           Lock&&PipsingXR2.5.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "#Copyright © 2008, XrustSolution.#"
#property link      "#http://www.xrust.ucoz.net#"
#include <stdlib.mqh>
//-------------------------------------------------------------------+
extern string a="KEY PARAMETERS OF THE ADVISER";
extern bool      FullAuto=true;
extern string ha="the percentage of risk as% of deposit amount";
extern double    Risk=3;
extern string x="Permission to use the dynamic changes in the lot";
extern bool      Martin=false;
extern string gb="dynamic change lot factor. if <1 it increases lot , if > 1 it is lot decreases ";
extern double    MartinKoff=1;
extern string k="Trailing step on equity as% of the deposit";
extern double    EqwTralStep=0.03;
extern string í="minimum break between the opening of orders in minutes";
extern int       MinTradePause=15;
extern string m="Permission to restrict trade in time";
extern bool      TradeTime=true;
extern string n="Hour start of trading";
extern int       StartTrade=20;
extern string o="Hour late trade";
extern int       EndTrade=8;
extern string p="Permission to display information in the main window";
extern bool      ShowComment=true;
extern string r="switch alarm systems and security";
extern bool      MargineVarning=false;
extern string ss="switch emergency return";
extern bool      EmergencyReturn=false;
extern string rr="the percentage of the deposit for the emergency return";
extern double    EmergencyPersent=100;
extern string s="permission for drawing graphic elements";
extern bool      SetArrow=false;
extern string t="Key closing level position without loss";
extern bool      WithoutLoss=false;
int       TotalOrders=50;
//----Variables for KimIV funcions ---------------------------------+
bool NumberOfTry=3,UseSound=false,print=false;
string NameFileSound = "expert.wav";   // Íàèìåíîâàíèå çâóêîâîãî ôàéëà
color  clOpenBuy     = Blue;           // Öâåò çíà÷êà îòêðûòèÿ Buy
color  clOpenSell    = Red;            // Öâåò çíà÷êà îòêðûòèÿ Sell
bool   MarketWatch=false;
bool   gbDisabled    = False;          // Áëîêèðîâêà
int BuyMagic1=2891;
int SellMagic1=73351;
static int PrevTime=0;double Lot;
double MinLot, MaxLot, MarginMinLot;   
int    MinLotDgts,period,GrossPeriod,GrossTrand=0;
int       Slippage=3;static double prr;
//------------------------------------------------------------------+
static double StartDepo, gEqviti;
static double gPriseAp,gPriseDn,gMidPrise;
int gFrChSize,tP;
static bool asd=false;
int BuySell_1=0,BuySell_2=0,BuySell_3=0;
int gCountBuy_1=1,gCountSell_1=1;
double lot;
static string gTime;
static bool Expdis=false;
int MaxOrd_1;
bool eqvtrade,TradeOfTime;
double Sredstva;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
void init()
  {
  MaxOrd_1=TotalOrders;
  StartDepo = AccountBalance(); 
  if(GlobalVariableCheck("stop")){GlobalVariableDel("stop");}
  if(!GlobalVariableCheck("multi")){GlobalVariableSet("multi",1);}else{
    double set=GlobalVariableGet("multi");
    set++;
    GlobalVariableSet("multi",set);
  }
  if(!GlobalVariableCheck("Risc")){GlobalVariableSet("Risc",Risk);}else{
    Risk=GlobalVariableGet("Risc");
  }
  if(!GlobalVariableCheck("pause")){GlobalVariableSet("pause",MinTradePause);}else{
    MinTradePause=GlobalVariableGet("pause");
  }  
  if(!GlobalVariableCheck("disable")){GlobalVariableSet("disable",0);}
  if(GlobalVariableCheck("stop")){GlobalVariableDel("stop");}
  if(GlobalVariableGet("multi")>1){SetArrow=false;} 
   return;
  }
//+------------------------------------------------------------------+
void deinit(){
  if(GlobalVariableCheck("stop")){GlobalVariableDel("stop");}
  Comment("  ");
  if(GlobalVariableCheck("multi")){
  double set=GlobalVariableGet("multi");
    if(set>1){
      set--;
      GlobalVariableSet("multi",set);
    }else{
      GlobalVariableDel("multi");
      GlobalVariableDel("disable");
      if(GlobalVariableCheck("Risc")){
        GlobalVariableDel("Risc");
      GlobalVariableDel("sredstva");   
      GlobalVariableDel("pause");     
      }
    }
  }
  if(Expdis){
    double Exdis=GlobalVariableGet("disable");
    Exdis--;
    GlobalVariableSet("disable",Exdis);      
    Expdis=false;
  }
return(0);} //deinit                   |
//+------------------------------------------------------------------+
int start()
  { 
  if(GlobalVariableGet("multi")>1){SetArrow=false;TradeOfTime=false;}else{TradeOfTime=TradeTime;}//óäàëÿåì ñòðåëêè â ìóëüòèðåæèìå
  if(gEqviti==0){gEqviti=AccountBalance();}//èñïðàâëÿåì ïåðåìåííóþ
// Ðàñ÷åò êîëè÷åñòâà îðäåðîâ îò ðèñêà è êîëè÷åñòâà óñòàíîâëåííûõ ñîâåòíèêîâ       
    MaxOrd_1=TotalOrders;
    if(MargineVarning){
      if(MaxOrd_1>AccountBalance()/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto()*2*(GlobalVariableGet("multi")-GlobalVariableGet("disable")))){
      MaxOrd_1=(AccountBalance()/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto()*2*(GlobalVariableGet("multi")-GlobalVariableGet("disable"))));}
    }else{
      if(MaxOrd_1>AccountBalance()/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto()*(GlobalVariableGet("multi")-GlobalVariableGet("disable")))){
      MaxOrd_1=(AccountBalance()/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto()*(GlobalVariableGet("multi")-GlobalVariableGet("disable"))));}
    }  
//çàïèñü êîëè÷åñòâà íàëè÷íûõ ñðåäñâ ïîñëå óäàëåíèÿ âñåõ îðäåðîâ   
   if(OrdersTotal()<1){
     Sredstva=AccountBalance();
     if(!GlobalVariableCheck("sredstva")){GlobalVariableSet("sredstva",Sredstva);}
     else{if(GlobalVariableGet("sredstva")!=Sredstva){GlobalVariableSet("sredstva",Sredstva);}}
   }
//îòêëþ÷åíèå îãðàíè÷åíèé ïî âðåìåíè ðàáîòû â ìóëüòèðåæèìå   
   if((GlobalVariableGet("multi")-GlobalVariableGet("disable"))>2){TradeOfTime=false;}
//ñèñòåìà áåçîïàñíîñòè è îãðàíè÷åíèÿ ïî ñ÷åòó   
   if(MargineVarning){if(Varning()){Sleep(10000);return(0);}}
//ñèñòåìà áåçîïàñíîñòè è îãðàíè÷åíèÿ ïî ñ÷åòó    
   if(!IsDemo()&&!IsOptimization()&&!IsTesting()){
     if(AccountNumber()!=38962){
       Comment("Bad Account!!!");
       Sleep(500);
       Comment("  ");
       return(0);
     }
   }  
   eqvtrade=false; 
//ïðåäîõðàíèòåëüíûé êëàïàí ñáðîñà íà óðîâåíü íà÷àëüíîãî áàëàíñà ïðè ïîæàðå  
  if(EmergencyReturn){
    if(AccountEquity()<=AccountBalance()/100*EmergencyPersent){
      CloseAll();
      double crash=GlobalVariableGet("disable");
      crash++;
      GlobalVariableSet("disable",crash);
      Expdis=true;
      Comment("System crashed! Restart!");
      Sleep(500);
      Comment("  ");
      return(0);           
    }
  }  
//óäàëÿåì çàïðåò íà òîðãîâëþ ïîñëå óäàëåíèÿ âñåõ îðäåðîâ 
  if(OrdersTotal()<1){
    if(GlobalVariableCheck("stop")){GlobalVariableDel("stop");}  
    gEqviti=AccountBalance(); 
  } 
//òðàëèì ýêâèòè
  if(EcvitiTral3(EqwTralStep)){
    return(0);}
  if(GlobalVariableCheck("stop")){return(0);}
//-----------------------------------------------------------------------------+
// Ðàñ÷åò êîëè÷åñòâà ñîâåòíèêîâ â çàâèñèìîñòè îò ðèñêà íà îäíó ñäåëêó          |
//-----------------------------------------------------------------------------+
  if(GlobalVariableGet("multi")>1){
    if(MaxOrd_1<15){
      if(!GlobalVariableCheck("disable")){
        GlobalVariableSet("disable",1);
      }else{
        if(!Expdis){
          double dis=GlobalVariableGet("disable");
          dis++;
          GlobalVariableSet("disable",dis);
          Expdis=true;
        }  
      } 
      Comment("\nMulti Chart Mode \n",
              "STOPPED\n",
              "Because AccountFreeMargin is few"
               );
      return(0);        
    }
    if(MaxOrd_1>18){
      if(Expdis){
        double Exdis=GlobalVariableGet("disable");
        Exdis--;
        if(Exdis<=0){Exdis=0;}
        GlobalVariableSet("disable",Exdis);      
        Expdis=false;
      }  
    }
  }  
//----------------------------------------------------------------------------  
  BuySell_1=0;BuySell_2=0;BuySell_3=0;
  Info();  
  if(GlobalVariableGet("multi")<2){
    if(CountOpOrd("0")>=MaxOrd_1/2){
      //DelBigestLoss2();
      //DelDamage();
      //if(AccountBalance()+GrPorfit()<AccountBalance()-(AccountBalance()/100*10)){CloseAll();}
    }
  }
//Óñòàíîâêà îðäåðîâ-------------------------------------------------------------------------------------  
  if(!GlobalVariableCheck("stop")){
  if(NevBar()){
  if(SetArrow){if(CountOpOrd("0")>0){SetArrow("NullProfitDot",4,1,0,NullDot(),White);}}
    if(TradeTime()){
      IfZZ();
      if(BuySell_1>0){
        if(CountOpOrd("0")<MaxOrd_1&&TimeOfTrade()){
          lot=CalcLotsAuto();
          if(CountOpOrd("0")>2){if(Martin){lot=OrdersLot();}}
          if(FullAuto){if(CountOpOrd("0")>=MaxOrd_1/2){lot=OrdersLot();}}
          if(PorfitBuySell(1)>=PorfitBuySell(0)){OpenPosition("",0,lot,0,0,BuyMagic1);}
          if(PorfitBuySell(1)<PorfitBuySell(0)){OpenPosition("",1,lot,0,0,SellMagic1);}
        }
      }
      if(BuySell_1<0){
        if(CountOpOrd("0")<MaxOrd_1&&TimeOfTrade()){
          lot=CalcLotsAuto();
          if(CountOpOrd("0")>2){if(Martin){lot=OrdersLot();}}
          if(FullAuto){if(CountOpOrd("0")>=MaxOrd_1/2){lot=OrdersLot();}}
          if(PorfitBuySell(0)>=PorfitBuySell(1)){OpenPosition("",1,lot,0,0,SellMagic1);}
          if(PorfitBuySell(0)<PorfitBuySell(1)){OpenPosition("",0,lot,0,0,BuyMagic1);}
        }
      }
    }
  }
  }
//-------------------------------------------------------------------------------------------------------
   return(0);
  } 
int   MInProfit=0;
//-----------------------------------------------------------------------------+
// Óäàëåíèå ñàìîãî áîëüøîãî ëîñÿ                                               |
//-----------------------------------------------------------------------------+
void DelBigestLoss(){
static double gBigLoss=0;
double BigLoss=0,profit=0,Lossticket,FarLot,FarProfit;
int Ticket[];int count=0; 
if(OrdersTotal()<2){return;gBigLoss=0;}
double MinLot=MarketInfo(Symbol(),MODE_MINLOT);
for(int i=0;i<OrdersTotal();i++){
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
    if(OrderSymbol()==Symbol()){
      if(OrderProfit()<0){
        if((gBigLoss<0&&OrderProfit()>gBigLoss)||(gBigLoss==0)){
        if(OrderProfit()<BigLoss){
          BigLoss=OrderProfit();
          Lossticket=OrderTicket();
          FarLot=OrderLots();
          FarProfit=OrderProfit();
        }
        }
      }
    }
  }
}
if(FarLot<=MinLot){gBigLoss=0;return;}
for(int n=0;n<OrdersTotal();n++){
  if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
    if(OrderSymbol()==Symbol()){
      if(OrderProfit()>0){
        profit=profit+OrderProfit();
        count++;
        Ticket[count]=OrderTicket();
        profit=NormalizeDouble(profit,1);
      }
    }
  }
} 
//if(count==1){OneOrdTral(TralStep);return;}
if(profit+BigLoss<0){gBigLoss=BigLoss;return;}
int lot=(FarLot/MinLot);
double MinFarProfit=FarProfit/lot;
int y;
double lotstep;
for(y=lot;y>0;y--){
  if(profit+(MinFarProfit*y)>MathAbs(MinFarProfit)){
    lotstep=MinLot*y;
    break;
  }
}      
if(lotstep>=MinLot){
  ArrayResize(Ticket,count+1);         
  for(int x=0;x<count+1;x++){if(OrderSelect(Ticket[x],SELECT_BY_TICKET)){if(OrderCloseTime()==0){del(OrderTicket());}}}     
  if(OrderSelect(Lossticket,SELECT_BY_TICKET)){if(OrderCloseTime()==0){dellot(Lossticket,lotstep);return(true);}}     
}      
return;     
}
//-----------------------------------------------------------------------------+
//Óäàëÿåò ðûíî÷íûé îðäåð ñ óêàçàííûì åé òèêåòîì è ëîòîì                        |
//+----------------------------------------------------------------------------+
void dellot(int ticket,double lot){int err;
int step;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.1){step=1;}
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01){step=2;}
lot=NormalizeDouble(lot,step);
 for(int i=0;i<1;i++){
   GetLastError();//îáíóëÿåì îøèêó
   OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
   string symbol = OrderSymbol();
   if(OrderType()==OP_BUY){RefreshRates();
     double prise = MarketInfo(symbol,MODE_BID);
     if(!OrderClose(ticket,lot,prise,3,Green)){err = GetLastError();}}
   if(OrderType()==OP_SELL){RefreshRates();
     prise = MarketInfo(symbol,MODE_ASK);
     if(!OrderClose(ticket,lot,prise,3,Green)){err = GetLastError();}}
 if(err == 0){PlaySound("expert.wav");break;} 
 if(err != 0){PlaySound("timeout.wav");Print("Error for Close Funtion =",err);} 
 while(!IsTradeAllowed()){Sleep(5000);}// åñëè ðûíîê çàíÿò òî ïîäîæäåì 5 ñåê 
 if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
 } 
}
//-----------------------------------------------------------------------------+
// Èñùåò ñàìûé äàëüíèé îðäåð ñ îòðèöàòåëüíîé ïðèáûëüþ                          |
//-----------------------------------------------------------------------------+
int FarOrder(){double dist=0;int tick=0;
//if(OrdersTotal()<1)return;
for(int i=0;i<OrdersTotal();i++){
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
    if(OrderSymbol()==Symbol()){
      if(OrderProfit()<0){
        RefreshRates();
        if((MathAbs(OrderOpenPrice()-Ask)/Point)>dist){
          dist=(MathAbs(OrderOpenPrice()-Ask))/Point;
          tick=OrderTicket();
        }
      }
    }
  }
}
return(tick);
}
//+----------------------------------------------------------------------------+
// Óäàëåíèå ñàìîãî äàëüíåãî îðäåðà                                             +
//-----------------------------------------------------------------------------+
bool DelDamage(){double FarProfit=1,FarLot=0,profit=0;int count=-1,x;
//if(OrdersTotal()<1)return;
double spred=NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*MarketInfo(Symbol(),MODE_TICKVALUE),Digits);
double PipsPrise=MarketInfo(Symbol(),MODE_TICKVALUE);
double MinLot=MarketInfo(Symbol(),MODE_MINLOT);
int Ticket[];
  if(FarOrder()>0){
   if(OrderSelect(FarOrder(),SELECT_BY_TICKET)){if(OrderCloseTime()==0){FarLot=OrderLots();FarProfit=OrderProfit();}}
  }
  if(FarProfit<0){
   profit=0;
   for(int n=0;n<OrdersTotal();n++){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       if(OrderSymbol()==Symbol()){
         if(OrderProfit()>0){
            profit=profit+OrderProfit();
            count++;
            Ticket[count]=OrderTicket();
            profit=NormalizeDouble(profit,1);
            FarProfit=NormalizeDouble(FarProfit,1);
          }
        }
      }
    }             
            if(profit+FarProfit>spred+(MInProfit*Bid*PipsPrise)){
              ArrayResize(Ticket,count+1);         
              for(x=0;x<count+1;x++){if(OrderSelect(Ticket[x],SELECT_BY_TICKET)){if(OrderCloseTime()==0){del(OrderTicket());}}}     
              if(OrderSelect(FarOrder(),SELECT_BY_TICKET)){if(OrderCloseTime()==0){del(FarOrder());return(true);}}
            }
            if(profit+FarProfit<0&&profit>0){
              if(FarLot<MinLot*2){return(false);}
              int lot=(FarLot/MinLot);
              double MinFarProfit=FarProfit/lot;
              int y;
              double lotstep;
              for(y=lot;y>0;y--){
                if(profit+(MinFarProfit*y)>0){
                  lotstep=MinLot*y;
                  break;
                }
              }
              if(lotstep>=MinLot){
                ArrayResize(Ticket,count+1);         
                for(x=0;x<count+1;x++){if(OrderSelect(Ticket[x],SELECT_BY_TICKET)){if(OrderCloseTime()==0){del(OrderTicket());}}}     
                if(OrderSelect(FarOrder(),SELECT_BY_TICKET)){if(OrderCloseTime()==0){dellot(FarOrder(),lotstep);return(true);}}     
              }          
            }
          
  }  
return(false);  
}   
//-----------------------------------------------------------------------------+
// Òèò ïîñëåäíåãî óñòàíîâëåííîãî îðäåðà                                        |
//-----------------------------------------------------------------------------+   
int Typ(){int time=0,tip= -1;
for(int i=0;i<OrdersTotal();i++){
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
    if(OrderSymbol()==Symbol()){
      if(OrderOpenTime()>time){
        time=OrderOpenTime();
        tip=OrderMagicNumber();
      }
    }
  }
}    
if(tip==BuyMagic1){return(0);}
if(tip==SellMagic1){return(1);}
return(-1);
}
//-----------------------------------------------------------------------------+
// Òî÷êà ðàâíîâåñèÿ                                                            |
//-----------------------------------------------------------------------------+
double NullDot(){double prise=0;int count=0,countlot=0;
if(OrdersTotal()<1){return(Bid);}
double MinLot=MarketInfo(Symbol(),MODE_MINLOT);
for(int i=0;i<OrdersTotal();i++){
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
    if(OrderSymbol()==Symbol()){
      countlot=(OrderLots()/MinLot);
      count=count+countlot;
      prise=prise+(OrderOpenPrice()*countlot);
    }
  }
}
prise=prise/count;
return(prise);
}  
//+----------------------------------------------------------------------------+
//       Óäàëÿåò ñàìîãî áîëüøîãî ëîñÿ                                          +
//+----------------------------------------------------------------------------+ 
void DelBigestLoss2(){
if(CountOpOrd("0")<2){return;}
double loss=0,profit=0,GrProfit=0;int n,x,y,ticket=0,count=0;
int Ticket[50];
ArrayInitialize(Ticket,0);
   for(n=0;n<OrdersTotal();n++){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       if(OrderSymbol()==Symbol()){
         if(OrderProfit()+OrderSwap()+OrderCommission()>0){
           profit=profit+OrderProfit()+OrderSwap()+OrderCommission();
         }
         else{
           if(OrderProfit()+OrderSwap()+OrderCommission()<loss){
             loss=OrderProfit()+OrderSwap()+OrderCommission();
             ticket=OrderTicket();         
           }
         }  
       }  
     }    
   }
   if(ticket==0){return;}
   if(profit+loss>=0){
     profit=0;
   for(x=0;x<OrdersTotal();x++){  
     for(n=0;n<OrdersTotal();n++){
       if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
         if(OrderProfit()+OrderSwap()+OrderCommission()>0){
           profit=profit+OrderProfit()+OrderSwap()+OrderCommission();
           if(OrderProfit()+OrderSwap()+OrderCommission()<profit){
             profit=OrderProfit()+OrderSwap()+OrderCommission();
           }
         }
       }
     }
     if(profit!=0){
     Ticket[count]=OrderTicket();
     count++;
     for(n=0;n<1;n++){GrProfit=GrProfit+profit;}
     if(GrProfit+loss>=0){
       ArrayResize(Ticket,count+1);      
       Comment(GrProfit," = ",loss);   
       for(y=0;y<count+1;y++){if(OrderSelect(Ticket[y],SELECT_BY_TICKET)){if(OrderCloseTime()==0){del(OrderTicket());}}}     
       if(OrderSelect(ticket,SELECT_BY_TICKET)){if(OrderCloseTime()==0){del(ticket);return(true);}}
     } 
     
     }//if(profit!=0){
   }//for(x=0;x<OrdersTotal();x++){           
   }//if(profit+loss>=0){
}  
//+----------------------------------------------------------------------------+
// Ïîäñ÷èòûâàåò Îáùóþ íå ðåàëèçîâàííóþ ïðèáûëü íà äàííîì èíñòðóìåíòå           +
//-----------------------------------------------------------------------------+
double GrPorfit(){double grpr=0;
   for(int n=0;n<OrdersTotal();n++){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       if(OrderSymbol()==Symbol()){
         grpr=grpr+OrderProfit()+OrderSwap()+OrderCommission();
       }  
     }    
   } 
return(grpr);
}  
//-----------------------------------------------------------------------------+
// Ñðåäíåå àðèôìåòè÷åñêîå ëîòà óñòàíîâëåííûõ îðäåðîâ                           |
//-----------------------------------------------------------------------------+
double OrdersLot(){int count=0;double Lt=0;
double StepLot=MarketInfo(Symbol(),MODE_LOTSTEP);
if(StepLot==0.01){int step=2;}else{step=1;}
//if(OrdersTotal()<5){return(CalcLotsAuto());}
  for(int i=0;i<OrdersTotal();i++){
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Symbol()){
        if(OrderCloseTime()==0){
          Lt=Lt+OrderLots();
          count++;
        }  
      }  
    }
  }
return(NormalizeDouble((Lt/(count*MartinKoff)),step));
}  
//+------------------------------------------------------------------+
//| Ðàñ÷åò ëîòà ñîîòâ ðèñêó è áàëàíñó                                |
//+------------------------------------------------------------------+
double CalcLotsAuto(){double LotOpt,LotNeOpt,Zalog;
   RefreshRates();
   double Set=GlobalVariableGet("multi")-GlobalVariableGet("disable");
   double Sredstwa =GlobalVariableGet("sredstva");
   double lott=MarketInfo(Symbol(),MODE_MARGINREQUIRED)/1000;
   double Marga=AccountFreeMargin();
   double Balans=AccountBalance();
   double LotMin=MarketInfo(Symbol(),MODE_MINLOT);
   double LotMax=MarketInfo(Symbol(),MODE_MAXLOT);
   double StepLot=MarketInfo(Symbol(),MODE_LOTSTEP);
   double StopLv=AccountStopoutLevel();
   int PrsMinLot=1000*LotMin;
   if(Sredstwa==0){Sredstwa=AccountBalance();GlobalVariableSet("sredstva",Balans);}
   if(GlobalVariableGet("multi")>1){Risk=GlobalVariableGet("Risc");}
   if(Risk<0)Risk=0;
   if(Risk>100)Risk=100; 
   if(StepLot==0.01){int step=2;}else{step=1;}  
   if(Set<1){Set=1;}
//---------------------------     
   Zalog=(Sredstwa*(Risk/100))/Set;
   LotOpt=NormalizeDouble((Zalog/1000),step);
   if(LotOpt>LotMax)LotOpt=LotMax;
   if(LotOpt<LotMin)LotOpt=LotMin;
   //if(Marga<Sredstva/2){return(0);}
   return(LotOpt);
}  
//+------------------------------------------------------------------+
//| Óñòàíîâêà ñòðåëîê                                                |
//+------------------------------------------------------------------+
void SetArrow(string nm,int kod,int razm,int bar,double prs,color col){
//if(!DriveArrow)return;
string Name=StringConcatenate(nm,TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS));
ObjectCreate(Name,OBJ_ARROW,0,0,0,0,0,0,0);
ObjectSet(Name,OBJPROP_ARROWCODE,kod);
ObjectSet(Name,OBJPROP_STYLE,DRAW_ARROW);
ObjectSet(Name,OBJPROP_TIME1,Time[bar]);
ObjectSet(Name,OBJPROP_PRICE1,prs);
ObjectSet(Name,OBJPROP_WIDTH,razm);
ObjectSet(Name,OBJPROP_COLOR,col);
return;}
//-----------------------------------------------------------------------------+
// Äåòåêòîð ìóëüòè ðåæèìà ñ÷åò÷èê óñòàíîâëåííûõ ñîâåòíèêîâ                     |
//-----------------------------------------------------------------------------+
string MutiDet(){
  double set =GlobalVariableGet("multi")-GlobalVariableGet("disable");
  string mode=StringConcatenate("MULTI CHART MODE \n",DoubleToStr(set,0)," EXPERT ENABLES");
  string mode2="SINGLE CHART MODE";
  if(GlobalVariableGet("multi")<2){return(mode2);}
  if(GlobalVariableGet("multi")>1){return(mode);}                                         
}
//-----------------------------------------------------------------------------+
// Âûâîäèò èíôîðìàöèþ íà ýêðàí                                                 |
//-----------------------------------------------------------------------------+
void Info(){
Comment(
        "ACCOUNT BALANSE                                 ="+(DoubleToStr(AccountBalance()+PorfitBuySell(0)+PorfitBuySell(1),1))+"$\n"+
        "ACCOUNT FREE MARGIN                         ="+(DoubleToStr(AccountFreeMargin(),1))+"$\n"+
        "CURRENT PROFIT                                    ="+(DoubleToStr(GrPorfit(),1))+"$\n"+
        "PROFIT FROM THE START OF TRADING  ="+(DoubleToStr(AccountBalance()-StartDepo,1))+"$\n"+
        "ALOVED ORDERS FOR THE OPENING      ="+MaxOrd_1+"Pc.\n"+
        "OPEN ORDERS                                         ="+CountOpOrd("0")+"Pc.\n"+
        gTime,"\n", 
        MutiDet(),"\n",
        "Risk = ",GlobalVariableGet("Risc")," %"
        );     
return;
}
//-----------------------------------------------------------------------------+
// Âûâîäèò ïðåäóïðåæäàþùåå ñîîáùåíèå                                           |
//-----------------------------------------------------------------------------+
bool Varning(){int ord;double depo,rick;
double Set2=GlobalVariableGet("multi")-GlobalVariableGet("disable");
if(Set2<1){Set2=1;}
  if(MaxOrd_1<15){
      depo=MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto()*30;
      ord=AccountBalance()/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto()*2);
      rick=NormalizeDouble((AccountBalance()/Set2/15/MarketInfo(Symbol(),MODE_MARGINREQUIRED)*10),1);
        Alert("THERE IS NOT ENOUGH MEANS FOR THE ACCOUNT"+"\n"+
        "For such quantity of warrants it is necessary"+"\n"+
        "The starting Deposit ="+depo+" $\n"+
        "On your means it is possible to open "+ord+" Orders"+"\n"+
        "Fill up your account please"+"\n"+
        "Or reduce quantity of warrants"+"\n"+
        "Or reduce the Risk of lower ="+DoubleToStr(rick,2)+" % \n"+
        "Or disconnect the alarm system");
    return(true);
  }
return(false);
}
//-----------------------------------------------------------------------------+
// Ôóíêöèÿ êîíòðîëÿ âðåìåíè òîðãîâëè                                           |
//-----------------------------------------------------------------------------+
bool TradeTime(){
int StartTradeHour=StartTrade;
int EndTradeHour=EndTrade;
if(!TradeOfTime){
gTime=StringConcatenate("the end of trading on Friday in ",DoubleToStr(EndTradeHour,0),":00 am");
if(DayOfWeek()==5){if(TimeHour(TimeCurrent())>EndTradeHour){return(false);}}
if(DayOfWeek()==1){if(TimeHour(TimeCurrent())<2){return(false);}}
if(DayOfWeek()==6||DayOfWeek()==0){return(false);}
return(true);}
if(DayOfWeek()==5){StartTradeHour=0;if(TimeHour(TimeCurrent())>EndTradeHour){return(false);}}else{StartTradeHour=StartTrade;}
if(DayOfWeek()==1){if(TimeHour(TimeCurrent())<2){gTime="Start tarde in  01:00 am";return(false);}}
if(DayOfWeek()==6||DayOfWeek()==0){return(false);}
if(StartTradeHour<EndTradeHour){
  if(TimeHour(TimeCurrent())>=StartTradeHour&&TimeHour(TimeCurrent())<EndTradeHour
    ||(CountOpOrd("0")+CountOpOrd("1"))){
    gTime=StringConcatenate("By the end of trading session :",DoubleToStr((EndTradeHour-TimeHour(TimeCurrent())),0)," hours");
    return(true);}}
if(StartTradeHour>EndTradeHour){
  if(TimeHour(TimeCurrent())>=StartTradeHour||TimeHour(TimeCurrent())<EndTradeHour
    ||(CountOpOrd("0")+CountOpOrd("1"))){
    gTime=StringConcatenate("By the end of trading session :",DoubleToStr((EndTradeHour-TimeHour(TimeCurrent())),0)," hours");
    return(true);}}    
gTime=StringConcatenate("resting to : ",StartTradeHour,": 00");    
return(false);
}
//-----------------------------------------------------------------------------+
// Óñëîâèÿ âõîäà â ðûíîê                                                       |
//-----------------------------------------------------------------------------+
int IfZZ(){
if(iClose(Symbol(),30,1)<iOpen(Symbol(),30,1)){
 if(iClose(Symbol(),15,1)<iOpen(Symbol(),15,1)){
  if(iClose(Symbol(),5,1)<iOpen(Symbol(),5,1)){
  //if(iCustom(Symbol(),0,"my_Fractals",1,2)!=0){
   BuySell_1=-1;
   gCountBuy_1++;
   gCountSell_1=1;
return(1);}}}
if(iClose(Symbol(),30,1)>iOpen(Symbol(),30,1)){
 if(iClose(Symbol(),15,1)>iOpen(Symbol(),15,1)){
  if(iClose(Symbol(),5,1)>iOpen(Symbol(),5,1)){
  //if(iCustom(Symbol(),0,"my_Fractals",0,2)!=0){
   BuySell_1=1;
   gCountBuy_1=1;
   gCountSell_1++; 
return(-1);}}}
BuySell_1=0;
return(0);
}
//+------------------------------------------------------------------+
//|Òðàë ïî ýêâèòè                                                    |
//+------------------------------------------------------------------+
bool EcvitiTral3(double EqStep){static double EqvTralStep=0.01;
if(OrdersTotal()<1){gEqviti=AccountBalance();if(FullAuto){EqvTralStep=CalcLotsAuto();}else{EqvTralStep=EqStep;}return(false);}
if(FullAuto){
 if(EqvTralStep<CalcLotsAuto()*(GlobalVariableGet("multi")-GlobalVariableGet("disable"))){
   EqvTralStep=CalcLotsAuto()*(GlobalVariableGet("multi")-GlobalVariableGet("disable"));
 }
}else{
 if(EqvTralStep<EqStep*(GlobalVariableGet("multi")-GlobalVariableGet("disable"))){
   EqvTralStep=EqStep*(GlobalVariableGet("multi")-GlobalVariableGet("disable"));
 }
}
//EqvTralStep=EqvTralStep*(GlobalVariableGet("multi")-GlobalVariableGet("disable"));
  if(CountOpOrd("0")>=MaxOrd_1/2||WithoutLoss){
    if(AccountEquity()>=AccountBalance()){
      if(AccountEquity()-AccountBalance()>((AccountBalance()/100)*((EqvTralStep*2)+EqvTralStep))){EqvTralStep=EqvTralStep*2;eqvtrade=true;}
      if(AccountEquity()>(gEqviti+(gEqviti/100*EqvTralStep))){
        gEqviti=gEqviti+(gEqviti/200*EqvTralStep);
        if(!GlobalVariableCheck("stop")){GlobalVariableSet("stop",0);}
      }
      if(AccountEquity()<=gEqviti){CloseAll();GlobalVariableDel("stop");return(false);}
      else{Comment(
                 "EQUITY TRALING MODE\n",
                 "EQUITY TRALING STEP   =",EqvTralStep," %",
                 "\nACCOUNT BALANS         = ",AccountBalance(),
                 "\nCLOSE LEVEL                  = ",gEqviti,
                 "\nACCOUNT EQUITY        = ",AccountEquity(),
                 "\nNEXT STEP                     = ",gEqviti+(gEqviti/100*EqvTralStep));
                 return(true);
      }
    }else{GlobalVariableDel("stop");if(FullAuto){EqvTralStep=CalcLotsAuto();}else{EqvTralStep=EqStep;}} 
  }else{
    if(AccountEquity()>AccountBalance()){
      if(AccountEquity()-AccountBalance()>((AccountBalance()/100)*((EqvTralStep*2)+EqvTralStep))){EqvTralStep=EqvTralStep*2;eqvtrade=true;}
      if(AccountEquity()>(gEqviti+(gEqviti/100*EqvTralStep))){
        gEqviti=gEqviti+(gEqviti/200*EqvTralStep);       
        if(!GlobalVariableCheck("stop")){GlobalVariableSet("stop",0);}
      }
      if(AccountEquity()<=gEqviti){CloseAll();GlobalVariableDel("stop");return(false);}
      else{Comment(
                 "EQUITY TRALING MODE\n",
                 "EQUITY TRALING STEP   =",EqvTralStep," %",
                 "\nACCOUNT BALANS         = ",AccountBalance(),
                 "\nCLOSE LEVEL                  = ",gEqviti,
                 "\nACCOUNT EQUITY        = ",AccountEquity(),
                 "\nNEXT STEP                     = ",gEqviti+(gEqviti/100*EqvTralStep));
                 return(true);
      }
    }else{GlobalVariableDel("stop");if(FullAuto){EqvTralStep=CalcLotsAuto();}else{EqvTralStep=EqStep;}}  
  }
return(false);
} 
//+------------------------------------------------------------------+
//| ïðîâåðÿåò ðûíî÷íûé îðäåð íà ïðèíàäëåæíîñòü ñîãëàñíî óñëîâèÿì     |
//+------------------------------------------------------------------+
bool IfOrder(string Sy="",int Typ=-1,int Magik=-1){
if(Sy=="0"){Sy=Symbol();}
  if(OrderSymbol()==Sy||Sy==""){
    if(OrderType()==Typ||Typ==(-1)){
      if(OrderMagicNumber()==Magik||Magik==(-1)){
        return(true);
      }
    }
  }
 return(false); 
}
//+------------------------------------------------------------------+
//| Ïîäñ÷èòûâàåò êîëè÷åñòâî îòêðûòûõ îðäåðîâ ñîãëàñíî óñëîâèÿì       |
//+------------------------------------------------------------------+
int CountOpOrd(string Sy="",int Typ=-1,int Magik=-1){int count=0;
if(Sy=="0"){Sy=Symbol();}
  for(int i=0;i<OrdersTotal();i++){
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Sy||Sy==""){
        if(OrderType()==Typ||Typ==(-1)){
          if(OrderMagicNumber()==Magik||Magik==(-1)){
            count++;
          }
        }
      }
    }
  }
 return(count);  
}
//+----------------------------------------------------------------------------+
// Ïîäñ÷èòûâàåò Îáùóþ íå ðåàëèçîâàííóþ ïðèáûëü íà äàííîì èíñòðóìåíòå           +
//-----------------------------------------------------------------------------+
double PorfitBuySell(int tip){double grpr=0;
if(OrdersTotal()<1){return(-1);}
   for(int n=OrdersTotal()+1;n>=0;n--){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       if(IfOrder("0",tip)){grpr=grpr+OrderProfit()+OrderSwap()+OrderCommission();}
     }    
   } 
return(grpr);
}
//+----------------------------------------------------------------------------+
// Ïîäñ÷èòûâàåò Îáùóþ íå ðåàëèçîâàííóþ ïðèáûëü íà äàííîì èíñòðóìåíòå           +
//-----------------------------------------------------------------------------+
double GlobalProfitBuySell(int tip){double grpr=0;
if(OrdersTotal()<1){return(-1);}
   for(int n=OrdersTotal()+1;n>=0;n--){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       grpr=grpr+OrderProfit()+OrderSwap()+OrderCommission();
     }    
   } 
return(grpr);
}
//+----------------------------------------------------------------------------+
// Çàêðûâàåò âñå îðäåðà íà äàííîì èíñòðóìåíòå                                  +
//-----------------------------------------------------------------------------+
void CloseAll(){
 while(OrdersTotal()>0){
   double profit=1000000;
   for(int n=OrdersTotal()+1;n>=0;n--){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       if(OrderProfit()<profit){
         profit=OrderProfit();
       }
     }    
   } 
  del(OrderTicket()); 
 }
return;    
}
//+----------------------------------------------------------------------------+
// Çàäàåò ïàóçó ìåæäó óñòàíîâêàìè îðäåðîâ                                      +  
//-----------------------------------------------------------------------------+
bool TimeOfTrade(){int count=0,distanse=0;double OpPrs=0;
if(CountOpOrd("0")<1){return(true);}
if(GlobalVariableCheck("pause")){int pause=GlobalVariableGet("pause");}
else{pause=MinTradePause;GlobalVariableSet("pause",MinTradePause);}
  for(int n=0;n<OrdersTotal();n++){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
      if(OrderSymbol()==Symbol()){
        if(OrderOpenTime()>count){count=OrderOpenTime();OpPrs=OrderOpenPrice();}
      }
    }    
  } 
if((MathAbs(OpPrs-Bid)/Point)<10){return(false);}
if(OpPrs!=0){distanse=(MathAbs(OpPrs-Bid)/Point)/20*(Bid*Point);}  
if((TimeCurrent()-count)>((MinTradePause*(distanse+1))*60)){return(true);}
return(false);
}
//-----------------------------------------------------------------------------+
// Ôóíêöèÿ êîíòðîëÿ íîâîãî áàðà                                                |
//-----------------------------------------------------------------------------+
bool NevBar(){
   static int PrevTime=0;
   if (PrevTime==Time[0]) return(false);
   PrevTime=Time[0];
   return(true);} 
//-----------------------------------------------------------------------------+
//Óäàëÿåò ðûíî÷íûé îðäåð ñ óêàçàííûì åé òèêåòîì                                |
//+----------------------------------------------------------------------------+
void del(int ticket){int err;
 for(int i=0;i<1;i++){
   GetLastError();//îáíóëÿåì îøèêó
   OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
   string symbol = OrderSymbol();
   if(OrderType()==OP_BUY){RefreshRates();
     double prise = MarketInfo(symbol,MODE_BID);
     if(!OrderClose(ticket,OrderLots(),prise,3,Green)){err = GetLastError();}}
   if(OrderType()==OP_SELL){RefreshRates();
     prise = MarketInfo(symbol,MODE_ASK);
     if(!OrderClose(ticket,OrderLots(),prise,3,Green)){err = GetLastError();}}
 if(err == 0){PlaySound("expert.wav");break;} 
 if(err != 0){PlaySound("timeout.wav");Print("Error for Close Funtion =",err);} 
 while(!IsTradeAllowed()){Sleep(5000);}// åñëè ðûíîê çàíÿò òî ïîäîæäåì 5 ñåê 
 if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
 } 
}
//-----------------------------------------------------------------------------+
//___________________ÊÈÌÓ_______ÐÅÑÏÅÊÒ________È_____ÓÂÀÆÓÕÀ___________________|
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                     |
//|  Îïèñàíèå : Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë                           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    m - òåêñò ñîîáùåíèÿ                                                     |
//+----------------------------------------------------------------------------+
void Message(string m) {
  //Comment(m);
  if (StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 28.11.2006                                                     |
//|  Îïèñàíèå : Ìîäèôèêàöèÿ îäíîãî ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà.           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    pp - öåíà óñòàíîâêè îðäåðà                                              |
//|    sl - öåíîâîé óðîâåíü ñòîïà                                              |
//|    tp - öåíîâîé óðîâåíü òåéêà                                              |
//|    ex - äàòà èñòå÷åíèÿ                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  bool   fm;
  color  cl=White;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
  //if(OrderType()==0||OrderType()==2||OrderType()==4){if(Ask-stoplevel<sl||Bid+stoplevel>tp){return;}}
  //if(OrderType()==1||OrderType()==3||OrderType()==5){if(Bid+stoplevel>sl||Ask-stoplevel<tp){return;}}
  //if(MathAbs(sl-Ask)<stoplevel||MathAbs(tp-Ask)<stoplevel){return;}
  if(pp==op&&sl==os&&tp==ot){return;}
  if ((sl==os&&(os!=0||sl!=0))&& (tp==ot&&(ot!=0||tp!=0))) {return;}
    for (it=1; it<=NumberOfTry; it++) {
      //if ((!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl);
      if (fm) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        if(print){Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
                  Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
                        "  op="+GetNameOP(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);}
        Sleep(1000*10);
        //if(er==130){del(OrderTicket());}
      }
    }
  //}
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 06.03.2008                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ ïîçèöèé                          |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//|    ot - âðåìÿ îòêðûòèÿ             ( 0   - ëþáîå âðåìÿ îòêðûòèÿ)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè                      |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("BuyLimit");
    case OP_SELLLIMIT: return("SellLimit");
    case OP_BUYSTOP  : return("BuyStop");
    case OP_SELLSTOP : return("SellStop");
    default          : return("Unknown Operation");
  }
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 10.04.2008                                                     |
//|  Îïèñàíèå : Îòêðûâàåò ïîçèöèþ ïî ðûíî÷íîé öåíå.                            |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (NULL èëè "" - òåêóùèé ñèìâîë)          |
//|    op - îïåðàöèÿ                                                           |
//|    ll - ëîò                                                                |
//|    sl - óðîâåíü ñòîï                                                       |
//|    tp - óðîâåíü òåéê                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
void OpenPosition(string sy, int op, double ll, double Sl=0, double Tp=0, int mn=0) {
  color    clOpen;
  datetime ot;
  double   pp, pa, pb, tp ,sl;
  int      dg, err, it, ticket=0;
  string   lsComm="";
  
  
  if (sy=="" || sy=="0") sy=Symbol();
  int stoplevel=MarketInfo(sy,MODE_STOPLEVEL);
  int spread=MarketInfo(sy,MODE_SPREAD);
  if(Tp!=0&&Tp<stoplevel+spread){Tp=stoplevel;}  
  if (op<1){
   if (Sl>0) {sl=MarketInfo(Symbol(),MODE_ASK)-Sl*Point; }else {sl=0;}
   if (Tp>0) {tp=MarketInfo(Symbol(),MODE_ASK)+Tp*Point; }else{ tp=0;}
  }else{
   if (Sl>0) {sl=MarketInfo(Symbol(),MODE_BID)+Sl*Point; }else{ sl=0;}
   if (Tp>0) {tp=MarketInfo(Symbol(),MODE_BID)-Tp*Point;} else {tp=0;}}  
   
  if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
  for (it=1; it<=NumberOfTry; it++) {
    if (IsStopped()) {
      Print("OpenPosition(): Îñòàíîâêà ðàáîòû ôóíêöèè");
      break;}
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    dg=MarketInfo(sy, MODE_DIGITS);
    pa=MarketInfo(sy, MODE_ASK);
    pb=MarketInfo(sy, MODE_BID);
    if (op==OP_BUY) pp=pa; else pp=pb;
    pp=NormalizeDouble(pp, dg);
    ot=TimeCurrent();
    if (MarketWatch)
      ticket=OrderSend(sy, op, ll, pp, Slippage, 0, 0, lsComm, mn, 0, clOpen);
    else
      ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if (pa==0 && pb==0) Message("Ïðîâåðüòå â Îáçîðå ðûíêà íàëè÷èå ñèìâîëà "+sy);
      // Âûâîä ñîîáùåíèÿ îá îøèáêå
      if(print){
      Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
            " pp=",pp," sl=",sl," tp=",tp," mn=",mn);}
      // Áëîêèðîâêà ðàáîòû ñîâåòíèêà
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Äëèòåëüíàÿ ïàóçà
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
      }
      if (err==140 || err==148 || err==4110 || err==4111) break;
      if (err==141) Sleep(1000*100);
      if (err==145) Sleep(1000*17);
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      if (err!=135) Sleep(1000*7.7);
    }
  }
  if (MarketWatch && ticket>0 && (sl>0 || tp>0)) {
    if (OrderSelect(ticket, SELECT_BY_TICKET)) ModifyOrder(-1, sl, tp);
  }
}
//+----------------------------------------------------------------------------+
             
            
Comments