//-----------------------------------------------------------------------------+
//|                                                   Lock&&PipsingXR_2009.mq4 |
#include <stdlib.mqh>
//-----------------------------------------------------------------------------+
extern string    a                    = "Part One = Skalper";
extern int       XmaPeriod            = 10;
extern int       XmaPorog             = 11;
extern int       FlatPeriod           = 3;
extern int       FlatPorog            = 35;
extern int       Stoploss             = 0;
extern int       Takeprofit           = 0;
extern double    Risk                 = 1;
extern int       TimeFrame            = 0;
extern int       ProfitLevel          = 2;
extern bool      OnBar                = true;
extern int       WlMinute             = 0;
extern string    b                    = "Part Two = Locker";
extern bool      FullAuto             = true;
extern int       LockMode             = 1;
extern int       TotalOrders          = 50;
extern bool      CloseLock            = false;
extern bool      Martingale           = true;
extern double    SafetyLevel          = 0;
extern bool      RealSl_Tp            = true;
extern string    c                    = "Part Three Time and Date ";
extern bool      TradeOfTime          = false;
extern string    d                    = "Hour start of trading";
extern int       StartTrade           = 19;
extern string    e                    = "Hour end of trading";
extern int       EndTrade             = 5;
extern string    f                    = "Date end of trading";
extern string    EndTradeData         = "Enterting Date of End trading in eeee.mm.dd";
extern string    h                    = "Language: if true=engleesh,if false=russia";
extern bool      EnglLang             = false;
extern bool      SetInfotoDispl       = true;
extern int       TextSize             = 12;
extern string    m                    = "Text position to displ";
extern int       TextPos              = 2;
extern string    n                    = "text color to displ";
extern color     TextColor            = White;
extern bool      UseSound             = false;
extern bool      TestInfo             = true;
extern int       MagicFirstOrder      = 4642;
extern int       Magik                = 6559;
//-----------------------------------------------------------------------------+
double lot;int gCountLotBuy,gCountLotSell;
//----Variables for KimIV funcions --------------------------------------------+
bool   print=true;
string NameFileSound = "expert.wav";   // Íàèìåíîâàíèå çâóêîâîãî ôàéëà
color  clOpenBuy     = Blue;           // Öâåò çíà÷êà îòêðûòèÿ Buy
color  clOpenSell    = Red;            // Öâåò çíà÷êà îòêðûòèÿ Sell
bool   MarketWatch=false;
bool   gbDisabled    = False;          // Áëîêèðîâêà
int       Slippage=3;
int NumberOfTry=3;
int spread;
double point;
double StartDepo;
string gInf1rus,gInf1engl;
string gInfBalansRus,ginfMargineRus,gInfProfitRus,gInfCurrProfitRus,gInfMaxOrdRus,gInfOpenOrdRus,gInfRiscRus;
string gInfBalansEngl,ginfMargineEngl,gInfProfitEngl,gInfCurrProfitEngl,gInfMaxOrdEngl,gInfOpenOrdEngl,gInfRiscEngl;
color  gColor1=LimeGreen;
int    OpenOrdermax;
string gTimeRus,gTimeEngl;
bool      SetArrow=true;
bool   Nastroika=true;
static int Tpp=10,Sll=10;int Tf;int stoploss,takeprofit;static int PrewTime=0;int Trade=0;
double asd1,asd2,asd3;bool arrow;int mno=1;string LM2;double gPorog,gRes1,gRes2,gRes3;
//-----------------------------------------------------------------------------+
void init(){
StartDepo=AccountBalance();
OpenOrdermax=TotalOrders;
spread=MarketInfo(Symbol(),MODE_SPREAD);
if(EndTradeData=="Enterting Date of End trading in eeee.mm.dd"){EndTradeData="";}
  if (TimeFrame==0) Tf=Period();
  if (TimeFrame==1) Tf=30;
  if (TimeFrame==2) Tf=60;
  if (TimeFrame==3) Tf=240;
  if (TimeFrame==4) Tf=1440;
  if (TimeFrame>=5  && TimeFrame<15  ) Tf=5;
  if (TimeFrame>=15 && TimeFrame<30  ) Tf=15;
  if (TimeFrame>=30 && TimeFrame<60  ) Tf=30;
  if (TimeFrame>=60 && TimeFrame<240 ) Tf=60;
  if (TimeFrame>=240&& TimeFrame<1440) Tf=240;
  if (TimeFrame>=1440)Tf=1440;
//----------------------------------------------------------------------------+
  if(SetInfotoDispl)if(TextPos==0)TestInfo=false;
  if(Stoploss==0)stoploss=Sll;else stoploss=Stoploss;
  if(Takeprofit==0)takeprofit=Tpp;else takeprofit=Takeprofit;   
  if(Digits==3||Digits==5){mno=10;point=Point*10;}else{mno=1;point=Point;}
  //F_T_treshold=F_T_treshold*mno;
  Slippage=Slippage*mno;
  Stoploss=Stoploss*mno;
  Takeprofit=Takeprofit*mno;
//-----------------------------------------------------------------------------+  
  Average(ProfitLevel);
  FirstTrade();
//-----------------------------------------------------------------------------+    
return;}
//-----------------------------------------------------------------------------+
void deinit(){ObjectsDeleteAll(0,OBJ_LABEL);return;}
//-----------------------------------------------------------------------------+
void start(){
   //HideTestIndicators(true);
//ñèñòåìà áåçîïàñíîñòè è îãðàíè÷åíèÿ ïî ñ÷åòó    
//   if(!IsDemo()&&!IsOptimization()&&!IsTesting()){
//     if(AccountNumber()!=86564 ){
//       Comment("Bad Account!!!");
//       Sleep(500);
//       Comment("  ");
//       return(0);
//     }
//   }
//-----------------------------------------------------------------------------+
      //if(CountOpOrd("",-1,0)>0)SetArrow(StringConcatenate(gCountLotBuy,"= NullDotBuy  "),4,1,0,NullDotBuy(),Blue);
      //if(CountOpOrd("",-1,1)>0)SetArrow(StringConcatenate(gCountLotSell,"= NullDotSell  "),4,1,0,NullDotSell(),Red); 
  Average(ProfitLevel);     
  if(RealSl_Tp){Modify();}
  static int max,Trade=0,prewbar;
  if(OnBar){if(prewbar==iTime(Symbol(),Tf,0)){return;}}
               prewbar= iTime(Symbol(),Tf,0);
                           
  if(CloseLock){
  CloseBy();
  DelBigestLoss();
  }  
  Info();
  WL(WlMinute);
  if(FullAuto&&OutOfPrise()){if(NevBar()){FirstTrade();}}
  //if(FullAuto&&!CloseLock){if(AccountBalance()+GrossProfit()<AccountBalance()*0.75){CloseLock=true;}else{CloseLock=false;}}
  if(Stoploss==0){Average(ProfitLevel);stoploss=Sll/NullCount(0);}else{stoploss=Stoploss/NullCount(0);}
  if(Takeprofit==0){Average(ProfitLevel);takeprofit=Tpp/NullCount(0);}else{takeprofit=Takeprofit/NullCount(0);} 
  if(LockMode==0)LM2=" FullAuto";
  if(LockMode==1)LM2=" FlatMode";
  if(LockMode==2)LM2=" TrandMode";
  if(LockMode==3)LM2=" ContrTrand";   
  string Comm=StringConcatenate("Sl=",stoploss," Tp=",takeprofit,"  X",PriseChanelWide(),"   ",LM2,"  ",gRes1," ",gRes2," ",gRes3); 
  if(SetInfotoDispl){
    if(!EnglLang){
      SetInfoRus(TextSize,TextPos,TextColor);
    }else{
      SetInfoEngl(TextSize,TextPos,TextColor);
    }
  }
  if(max<OrdersTotal())max=OrdersTotal();
  lot=CalcLotsAuto();
  if(SafetyLevel>0){
    if(GrossProfit()<0){
      if((MathAbs(GrossProfit())/AccountBalance())>(SafetyLevel/100)){
        CloseBy();
        DelBigestLoss();
        if(SetArrow)SetArrow("MK",76,5,0,Close[0],Red);
        del(LossTicket());
      }  
    }
  }
  if(CountOpOrd("0")>0){if(GrossProfit()>=(takeprofit*FirstOrderLots()*MarketInfo(Symbol(),MODE_LOTSIZE)/10000)/CountOpOrd("0")/mno){CloseAll();}}
  //if(CountOpOrd("0")>1)if(GrossProfit()>=0)CloseAll();
  OpenOrdermax=TotalOrders;
  if(OpenOrdermax>AccountBalance()/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto())){
  OpenOrdermax=(AccountBalance()/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto()));}
  //if(RealSl_Tp){if(CountOpOrd("0")>0){SetOrder();return;}} 
//=============================================================================+
  if(LockMode==1){//  Ìîäåëü ïîâåäåíèÿ - ôëåò                                  +
//-----------------------------------------------------------------------------+  
  if(CloseLock){
  CloseBy();
  DelBigestLoss();
  }
  if(CountOpOrd("0")>1&&CountOpOrd("0")<OpenOrdermax){
    if(Martingale)lot=MartinLot();
    if(OutOfPrise()){
      if(PriseDist(stoploss*PriseChanelWide())){if(NearOrdDistanse(stoploss*PriseChanelWide())>0){OpenPosition("",0,martin(),0,0,Magik,Comm);}}
      if(PriseDist(stoploss*PriseChanelWide())){if(NearOrdDistanse(stoploss*PriseChanelWide())<0){OpenPosition("",1,martin(),0,0,Magik,Comm);}}  
    }else{
     if(PriseDist(stoploss/3))if(MidleOrders(stoploss/3)==0){OpenPosition("",0,lot,0,0,Magik,Comm);}
     if(PriseDist(stoploss/3))if(MidleOrders(stoploss/3)==1){OpenPosition("",1,lot,0,0,Magik,Comm);}     
    }
  }
//-----Óñòàíîâêà âòîðîãî îðäåðà------------------------------------------------+
  if(CountOpOrd("0",MagicFirstOrder)==1&&CountOpOrd("0",Magik)<1){
    if(IfOrdstoploss()<0)if(PriseDist(stoploss))OpenPosition("",0,FirstOrderLots(),0,0,Magik,Comm);
    if(IfOrdstoploss()>0)if(PriseDist(stoploss))OpenPosition("",1,FirstOrderLots(),0,0,Magik,Comm);
  }
//-----------------------------------------------------------------------------+
  }
//=============================================================================+
  if(LockMode==2){//  Ìîäåëü ïîâåäåíèÿ - òðåíä                                 +
//-----------------------------------------------------------------------------+  
  if(CountOpOrd("0")>1&&CountOpOrd("0")<OpenOrdermax){
    if(CloseLock){
    CloseBy();
    DelBigestLoss();
    }    
    if(NevBar())if(SetArrow)SetArrow("NullProfitDot",4,1,0,NullDot(),White);
    if(Martingale)lot=MartinLot();
    if(OutOfPrise()){
      if(OutOfPrise()){if(NearOrdDistanse(stoploss/PriseChanelWide())<0){if(PriseDist(stoploss/PriseChanelWide())){OpenPosition("",0,martin(),0,0,Magik,Comm);}}}
      if(OutOfPrise()){if(NearOrdDistanse(stoploss/PriseChanelWide())>0){if(PriseDist(stoploss/PriseChanelWide())){OpenPosition("",1,martin(),0,0,Magik,Comm);}}}  
    }else{
     //if(PriseDist(stoploss/PriseChanelWide()/2))if(MidleOrders(stoploss/PriseChanelWide()/2)==0){OpenPosition("",0,lot,0,0,Magik,Comm);}
     //if(PriseDist(stoploss/PriseChanelWide()/2))if(MidleOrders(stoploss/PriseChanelWide()/2)==1){OpenPosition("",1,lot,0,0,Magik,Comm);}     
    } 
  }
//-----Óñòàíîâêà âòîðîãî îðäåðà------------------------------------------------+
  if(CountOpOrd("0",MagicFirstOrder)==1&&CountOpOrd("0",Magik)<1){
    if(IfOrdstoploss()>0)if(PriseDist(stoploss))OpenPosition("",0,FirstOrderLots(),0,0,Magik,Comm);
    if(IfOrdstoploss()<0)if(PriseDist(stoploss))OpenPosition("",1,FirstOrderLots(),0,0,Magik,Comm);
  } 
//-----------------------------------------------------------------------------+
  }  
//=============================================================================+
  if(LockMode==3){//  Ìîäåëü ïîâåäåíèÿ -  Êîíòð òðåíä                          +
//-----------------------------------------------------------------------------+  
  if(CountOpOrd("0")>1&&CountOpOrd("0")<OpenOrdermax){
    if(CloseLock){
    CloseBy();
    DelBigestLoss();
    }    
    if(NevBar())if(SetArrow)SetArrow("NullProfitDot",4,1,0,NullDot(),White);
    if(Martingale)lot=MartinLot();
    if(OutOfPrise()){
      if(OutOfPrise()){if(NearOrdDistanse(stoploss*PriseChanelWide())>0){if(PriseDist(stoploss*PriseChanelWide())){OpenPosition("",0,martin(),0,0,Magik,Comm);}}}
      if(OutOfPrise()){if(NearOrdDistanse(stoploss*PriseChanelWide())<0){if(PriseDist(stoploss*PriseChanelWide())){OpenPosition("",1,martin(),0,0,Magik,Comm);}}}  
    }else{
     if(PriseDist(stoploss/PriseChanelWide()/4))if(MidleOrders(stoploss/PriseChanelWide()/4)==0){OpenPosition("",0,lot,0,0,Magik,Comm);}
     if(PriseDist(stoploss/PriseChanelWide()/4))if(MidleOrders(stoploss/PriseChanelWide()/4)==1){OpenPosition("",1,lot,0,0,Magik,Comm);}     
    } 
  }
//-----Óñòàíîâêà âòîðîãî îðäåðà------------------------------------------------+
  if(CountOpOrd("0",MagicFirstOrder)==1&&CountOpOrd("0",Magik)<1){
    if(IfOrdstoploss()<0)if(PriseDist(stoploss))OpenPosition("",0,FirstOrderLots(),0,0,Magik,Comm);
    if(IfOrdstoploss()>0)if(PriseDist(stoploss))OpenPosition("",1,FirstOrderLots(),0,0,Magik,Comm);
  } 
//-----------------------------------------------------------------------------+  
  }  
//=============================================================================+
//-----Óñòàíîâêà ïåðâîãî îðäåðà------------------------------------------------+
//=============================================================================+
  if(TradeTime()){
  if(EndTradeForDateTime())return;
    if(CountOpOrd("0",MagicFirstOrder)<1){
      if(Sar()<0){
        OpenPosition("",1,lot,0,0,MagicFirstOrder,Comm);
        return;
      }
      if(Sar()>0){
        OpenPosition("",0,lot,0,0,MagicFirstOrder,Comm);
        return;
      } 
    }  
  }  
//=============================================================================+
if(TestInfo){Testinfo();}  
//-----------------------------------------------------------------------------+
if(OnBar)PrewTime=iTime(NULL,Tf,0);
//-----------------------------------------------------------------------------+
return;}//Êîíåö ôóíêöèè Ñòàðò
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$+
//+------------------------------------------------------------------+
//|  Îïðåäåëÿåì êîëè÷åñòâî ïåðåõîäîâ ÷åðåç íîëü                      |
//+------------------------------------------------------------------+
int NullCount(double por = 5){static int co=0; static bool neg,pos;
  if(CountOpOrd("",-1,-1)<1){pos=false;co=0;}
  if(CountOpOrd("",-1,-1)!=1){return(1);}
  for(int i=0;i<OrdersTotal();i++){
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Symbol()){
        if(OrderProfit()>0){
          if(MathAbs(OrderOpenPrice()-OrderClosePrice())>=por*Point*mno){
            pos=true;
          }  
        }
        if(OrderProfit()<0){
          if(MathAbs(OrderOpenPrice()-OrderClosePrice())>=por*Point*mno){
            if(pos){
              co++;
              pos=false;
            }
          }  
        }        
      }
    }
  }
return(co+1);
}
//-----------------------------------------------------------------------------+
// ßâíàÿ ìîäèôèêàöèÿ îðäåðîâ                                                   |
//-----------------------------------------------------------------------------+
void Modify(){double tp;int i;static double prewbuytp,prewselltp,prewbuysl,prewsellsl;
double stop=MarketInfo(Symbol(),MODE_STOPLEVEL)*point;
double newbuytp=NormalizeDouble(NullDotBuy()+takeprofit*point,Digits);
double newselltp=NormalizeDouble(NullDotSell()-takeprofit*point,Digits);
double newbuysl=NormalizeDouble(NullDotBuy()-stoploss*point*2,Digits);
double newsellsl=NormalizeDouble(NullDotSell()+stoploss*point*2,Digits);
//if(CountOpOrd("0")<1){return;}
if(CountOpOrd("0",-1,0)>0&&CountOpOrd("0",-1,1)>0){
  for(i=0;i<OrdersTotal();i++){
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Symbol()){  
        if(OrderType()<2){
          if(OrderStopLoss()!=0){OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),0,White);}
          if(OrderTakeProfit()!=0){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,0,White);}
        }  
      }
    }
  }     
return; 
}
if((CountOpOrd("0",-1,0)>0&&CountOpOrd("0",-1,1)<1)||
   (CountOpOrd("0",-1,1)>0&&CountOpOrd("0",-1,0)<1)){
  if(CountOpOrd("0",-1,1)<1){
    for(i=0;i<OrdersTotal();i++){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
        if(OrderSymbol()==Symbol()){
          if(OrderType()==0){ 
            if(NormalizeDouble(OrderTakeProfit(),Digits)!=newbuytp){
              if(MathAbs(newbuytp-Bid)>stop){
              if(newbuytp!=prewbuytp){
                if(OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),newbuytp,0,Red)){
                  prewbuytp=newbuytp;
                }  
              } 
              } 
            }
            if(NormalizeDouble(OrderStopLoss(),Digits)!=newbuysl){
              if(MathAbs(Ask-newbuysl)>stop){
              if(newbuysl!=prewbuysl){
                if(OrderModify(OrderTicket(),OrderOpenPrice(),newbuysl,OrderTakeProfit(),0,Red)){
                  prewbuysl=newbuysl;
                }
              }  
              }
            }
          }
        }
      }
    }
  }          
  if(CountOpOrd("0",-1,0)<1){
    for(i=0;i<OrdersTotal();i++){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
        if(OrderSymbol()==Symbol()){
          if(OrderType()==1){
            if(NormalizeDouble(OrderTakeProfit(),Digits)!=newselltp){
              if(MathAbs(newselltp-Ask)>stop){
              if(newselltp!=prewselltp){
                if(OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),newselltp,0,Red)){
                  prewselltp=newselltp;
                }
              }  
              }  
            }
            if(NormalizeDouble(OrderStopLoss(),Digits)!=newsellsl){
              if(MathAbs(newsellsl-Bid)>stop){
              if(newsellsl!=prewsellsl){
                if(OrderModify(OrderTicket(),OrderOpenPrice(),newsellsl,OrderTakeProfit(),0,Red)){
                  prewsellsl=newsellsl;
                }
              }
              }    
            }          
          }
        }
      }
    }
  }
}  
return;
}
//-----------------------------------------------------------------------------+
// Óñòàíîâêà îòëîæåííèêà â ðåæèìå ðåàëüíîãî ÑË                                 |
//-----------------------------------------------------------------------------+
void SetOrder(){int i;double prise;
if(CountOpOrd("0",-1,0)==CountOpOrd("0",-1,1)){if(GrossProfit()>=0){CloseAll();}}
//if(stoploss<MarketInfo(Symbol(),MODE_STOPLEVEL)){return;}
if(CountOpOrd("0")==1){
  for(i=0;i<OrdersTotal();i++){
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Symbol()){
        if(OrderType()>3){OrderDelete(OrderTicket());}
        if(OrderType()==0){
              prise=NormalizeDouble(OrderOpenPrice()-stoploss*Point,Digits);
              OrderSend(Symbol(),5,lot,prise,Slippage*mno,0,0,"",Magik,0,Red);
              Print("SET");
              return;
        } 
        if(OrderType()==1){
              prise=NormalizeDouble(OrderOpenPrice()+stoploss*Point,Digits);
              OrderSend(Symbol(),4,lot,prise,Slippage*mno,0,0,"",Magik,0,Blue);
              Print("SET");
              return;
        }  
      }
    }
  }
}                       
return;
}
//-----------------------------------------------------------------------------+
// Óñëîâèÿ äëÿ óñòàíîâêè ïåðâè÷íîãî îðäåðà                                     |
//-----------------------------------------------------------------------------+
void FirstTrade(){int period=(stoploss+takeprofit)/2;double Ma;static int napr=0;
//------------------------------------------------+
if(OnBar)if(PrewTime==iTime(NULL,Tf,0)) return(0);
if(OnBar)PrewTime=iTime(NULL,Tf,0);
//------------------------------------------------+
gRes1=NormalizeDouble(iCustom(Symbol(),Tf,"Xma",XmaPeriod,XmaPorog,1,1,0,1),Digits/mno);
gRes2=NormalizeDouble(iCustom(Symbol(),Tf,"Xma",XmaPeriod,XmaPorog,1,1,0,2),Digits/mno);
gRes3=NormalizeDouble(iCustom(Symbol(),Tf,"Xma",XmaPeriod,XmaPorog,1,1,0,3),Digits/mno);  
//-----------------------------------------+
//  Îïðåäåëèòåëüìîäåëè ïîâåäåíèÿ           |
//-----------------------------------------+ 
if(FullAuto){
  //if(CountOpOrd("0")>1){if(LockMode==2){return;}}
  if(gRes1!=gRes2&&gRes2!=gRes3){LockMode=2;}
  if(gRes1==gRes2&&gRes2==gRes3){LockMode=1;}  
}     
return;
}
//+----------------------------------------------------------------------------+
// Âõîä ïî Ñàð                                                                 |
//-----------------------------------------------------------------------------+
int Sar(double sar1=0.02,double sar2=0.2){
double ma1,ma2,res1,res2,res3;
ma1=iMA(Symbol(),0,FlatPeriod,0,3,0,1)/Point;
ma2=iMA(Symbol(),0,FlatPeriod,2,3,0,1)/Point; 
res1=NormalizeDouble(iCustom(Symbol(),Tf,"Xma",XmaPeriod,XmaPorog,1,1,0,1),Digits/mno);
res2=NormalizeDouble(iCustom(Symbol(),Tf,"Xma",XmaPeriod,XmaPorog,1,1,0,2),Digits/mno);
res3=NormalizeDouble(iCustom(Symbol(),Tf,"Xma",XmaPeriod,XmaPorog,1,1,0,3),Digits/mno);
if(res1==res2&&res2==res3){
  if(MathAbs(ma1-ma2)>=FlatPorog*mno){
    if(ma1-ma2>=FlatPorog*mno){return( 1);}
    if(ma2-ma1>=FlatPorog*mno){return(-1);}
  }else{
    if(ma1-ma2>=mno){return( 1);}
    if(ma2-ma1>=mno){return(-1);}  
  }  
}else{
  if((res1>res2&&res2>res3)||
     (res1>res2&&res2<res3)){return( 1);}
  if((res1<res2&&res2<res3)||
     (res1<res2&&res2>res3)){return(-1);}
}  
return(0); 
}
//+----------------------------------------------------------------------------+
// Âîçâðàùàåò òèêåò ñàìîãî ëîñåâîãî îðäåðà                                     |
//-----------------------------------------------------------------------------+
int LossTicket(){int loss=0,ticket;
for(int i=0;i<OrdersTotal();i++){
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
    if(OrderSymbol()==Symbol()){
      if(OrderMagicNumber()==MagicFirstOrder||OrderMagicNumber()==Magik){
        if(OrderProfit()<loss){
          loss=OrderProfit();
          ticket=OrderTicket();
        }
      }
    }
  }
}
return(ticket);
}
//+----------------------------------------------------------------------------+
// Ðàñ÷åò ëîòà ïåðåä óñòàíîâêîé  ëîêèðóþùåãî  îðäåðà                           |
//-----------------------------------------------------------------------------+
static double gMinPrise,gMaxPrise;
double martin(){double nextprise,nextlotkoff=1,nextlot;bool ApDn;int lotDigits;
if(!Martingale)return(CalcLotsAuto());
if(!OutOfPrise())return(MartinLot());
if(LockMode>1)return(MartinLot());
PriseChanelWide();
nextlot = CalcLotsAuto();
if(MarketInfo(Symbol(),MODE_LOTSTEP)>0.01){lotDigits=1;}else{lotDigits=2;}
if(Bid>gMaxPrise){nextprise=Bid-(((Bid-gMinPrise)/100)*23);ApDn=true;} 
if(Bid<gMinPrise){nextprise=Bid+(((gMaxPrise-Bid)/100)*23);ApDn=false;}  
for(int i=1;i<100;i++){
  if(ApDn){
    nextlot = NormalizeDouble(CalcLotsAuto()*nextlotkoff, lotDigits);
    if(NullDotCh(Bid,nextlot)<nextprise){nextlotkoff=nextlotkoff+(10*i/100);}else{break;}
  }else{
    nextlot = NormalizeDouble(CalcLotsAuto()*nextlotkoff, lotDigits);
    if(NullDotCh(Bid,nextlot)>nextprise){nextlotkoff=nextlotkoff+(10*i/100);}else{break;}
  }
}
if(NullDotCh(Bid,nextlot)==gMinPrise||NullDotCh(Bid,nextlot)==gMaxPrise){return(MartinLot());}
if(nextprise==0){return(MartinLot());}
return(nextlot);
}
//+----------------------------------------------------------------------------+
// Ðàñ÷åò òî÷êè íóëü ïðîôèòà ïåðåä óñòàíîâêîé  âûáðàííîãî îðäåðà               |
//-----------------------------------------------------------------------------+ 
double NullDotCh(double _prise,double _lot){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);
    }
  }
}
//--------------------------
countlot=(_lot/MinLot);
count=count+countlot;
prise=prise+_prise*countlot;
//--------------------------
prise=prise/count;
return(prise);
}  
//+----------------------------------------------------------------------------+
// Äåòåêòîð Ëîòà ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà                              |
//-----------------------------------------------------------------------------+ 
double MartinLot(){int i,fTime,time=TimeCurrent()+100;double fPrise,prise,fLot;
if(CountOpOrd("0")<2)return(CalcLotsAuto());
//--íàõîäèì äàííûå ïåðâè÷íîãî îðäåðà
for(i=0;i<OrdersTotal();i++){
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
    if(OrderSymbol()==Symbol()){
      if(OrderMagicNumber()==MagicFirstOrder){
        fLot=OrderLots();
        fPrise=OrderOpenPrice();
      }
      if(OrderMagicNumber()==Magik){
        if(OrderOpenTime()<time){
          time=OrderOpenTime();
          prise=OrderOpenPrice();
        }
      }      
    }
  }
}
double ch=MathAbs(fPrise-prise)/Point/mno;// øèðèíà ïåðâè÷íîãî êàíàëà
double minprise=100000,maxprise=0;
  for(int n=0;n<OrdersTotal();n++){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Symbol()){
        if(OrderMagicNumber()==MagicFirstOrder||OrderMagicNumber()==Magik){
          if(minprise>OrderOpenPrice()){minprise=OrderOpenPrice();}
          if(maxprise<OrderOpenPrice()){maxprise=OrderOpenPrice();}
        }  
      }  
    }
  }
double CH=MathAbs(maxprise-minprise)/Point/mno;// øèðèíà ïåðâè÷íîãî êàíàëà
double res=(CH/ch);
int Chprise;
if(OutOfPrise()){
  if(MathAbs(Bid-minprise)>MathAbs(Bid-maxprise)){Chprise=MathAbs(Bid-minprise)/Point/mno;}
  if(MathAbs(Bid-minprise)<MathAbs(Bid-maxprise)){Chprise=MathAbs(Bid-maxprise)/Point/mno;}
  res=(Chprise/ch);
}
int lotDigits;
if(MarketInfo(Symbol(),MODE_LOTSTEP)>0.01){lotDigits=1;}else{lotDigits=2;}
return(NormalizeDouble(CalcLotsAuto()*res,lotDigits));
}
//+----------------------------------------------------------------------------+
// Âîçâðíàùàåò ëîò ïîñëåäíåãî ïåðâè÷íîãî îðäåðà                                |
//-----------------------------------------------------------------------------+ 
double FirstOrderLots(){double lot;
for(int i=0;i<OrdersTotal();i++){
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
    if(OrderSymbol()==Symbol()){
      if(OrderMagicNumber()==MagicFirstOrder){
        lot=OrderLots();
      }
    }
  }
}
if(lot==0)lot=CalcLotsAuto();
return(lot);
}
//+----------------------------------------------------------------------------+
// Òåñòîâàÿ èíôîðìàöèÿ                                                         |
//-----------------------------------------------------------------------------+  
void Testinfo(){
static double maxdrdn,maxprofit;
static int maxord;
int totalord,openord;
if(GrossProfit()<maxdrdn){maxdrdn=GrossProfit();}
if(GrossProfit()>maxprofit){maxprofit=GrossProfit();}
if(OrdersTotal()>maxord){maxord=OrdersTotal();}
string LM="";
string Fa;
if(FullAuto){Fa="TRUE";}else{Fa="FALSE";}
if(LockMode==1)LM="FlatMode";
if(LockMode==2)LM="TrandMode";
if(LockMode==3)LM="ContrTrand";
string Stl;
string Ob;
if(OnBar){Ob="TRUE";}else{Ob="FALSE";}
if(CloseLock){Stl="TRUE";}else{ Stl="FALSE";}
Comment(Secondnull("EXPERT SETTING",18),                        Secondnull("EXPERT DATA",33)," \n",
        Secondnull("XmaPeriod ="),leadnull(XmaPeriod),             Secondnull("Balanse =",29),leadnull(AccountBalance()),"\n",
        Secondnull("XmaPorog ="),leadnull(XmaPorog),             Secondnull("Equty =",29),leadnull(AccountBalance()+GrossProfit()),"\n",
        Secondnull("FullAuto =",14),Secondnull(Fa,7),           Secondnull("CurrDrdn =",29),leadnull(GrossProfit(-1)),"\n",
        Secondnull("TakeProfit =",14),leadnull(takeprofit/mno), Secondnull("MaxDrdn =",28),leadnull(maxdrdn),"\n",
        Secondnull("StopLos ="),leadnull(stoploss/mno),         Secondnull("CurrProfit =",29),leadnull(GrossProfit(1)),"\n",
        Secondnull("Risc =",17),leadnull(Risk),                 Secondnull("MaxProfit =",29),leadnull(maxprofit),"\n",
        Secondnull("TimeFrame =",12),leadnull(Tf),              Secondnull("OpenOrders =",26),leadnull(OrdersTotal(),6),"\n",
        Secondnull("TotalOrders =",14),leadnull(OpenOrdermax),  Secondnull("MaxOpenOrd =",23),leadnull(maxord,6),"\n",
        Secondnull("OnBar ="),Secondnull(Ob,7),                 Secondnull("TotalOrders =",25),leadnull(OrdersTotal()+OrdersHistoryTotal(),6),"\n",
        Secondnull("LockMode =",13),Secondnull(LM,10),          Secondnull("PriseChanelWide =X",20),leadnull(PriseChanelWide(),4),"\n",
        Secondnull("CloseLock =",14),Secondnull(Stl,7),         Secondnull("RelProfit =",28),leadnull(histcount(),5),"\n",
        Secondnull("FlatPorog =",14),Secondnull(FlatPorog,7),Secondnull("Porog =",32),leadnull(gPorog,5)
        );
return;        
}
//-----------------------------------------------------------------------------+
//  Äîáàâëÿåò ëèäèðóþùèå ïðîáåëû                                               |
//-----------------------------------------------------------------------------+
string leadnull(double set,int razr=8){int prom;string res,probel,input;
input=DoubleToStr(set,1);
prom=StringLen(input);
if(prom<razr){
  for(int i=0;i<=razr-prom;i++){
    probel=StringConcatenate(probel," ");
  }
}
return(StringConcatenate(probel,input));
}
//-----------------------------------------------------------------------------+
//  Äîáàâëÿåò ïîñëåäóþùèå ïðîáåëû                                              |
//-----------------------------------------------------------------------------+
string Secondnull(string input,int razr=15){int prom;string res,probel;
prom=StringLen(input);
if(prom<razr){
  for(int i=0;i<=razr-prom;i++){
    probel=StringConcatenate(probel," ");
  }
}
return(StringConcatenate(probel,input));
}
//-----------------------------------------------------------------------------+
double histcount(){double count=0,counttotal=0;
for(int i=0;i<OrdersHistoryTotal();i++){
  if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
    if(OrderSymbol()==Symbol()){
      counttotal++;
      if(OrderMagicNumber()==MagicFirstOrder){
        count++;
        counttotal--;
      }
    }
  }
}
if(count==0){count=1;}
if(counttotal==0){counttotal=1;}
double res=count/counttotal;
return(res);      
}
//-----------------------------------------------------------------------------+
// Îïðåäåëÿåò Ñë è Òð ñîîòâåòñòâåííî ðàçìåðàì öåëè                             |
//-----------------------------------------------------------------------------+ 
void Average(int targ=0){int i, Av=5, mn, tf;static double sll, tpp;
if(targ<=0){mn=48;tf=30;}
if(targ==1){mn=24;tf=60;}
if(targ==2){mn=6;tf=240;}
if(targ>=3){mn=5;tf=1440;}
  for(i=1;i<Av;i++){
    sll=sll+(MathAbs(iHigh(Symbol(),tf,i*mn )-iLow(Symbol(),tf,i*mn))/Point/mno);
    tpp=tpp+(MathAbs(iOpen(Symbol(),tf,i*mn )-iClose(Symbol(),tf,i*mn))/Point/mno/2);
  }
    sll=sll/Av;
    tpp=tpp/Av;  
  //if(LockMode==2){sll=sll*0.62;}
  Sll=sll;
  Tpp=tpp;
  return;
}
//-----------------------------------------------------------------------------+
// Áåçóáûòîê                                                                   |
//-----------------------------------------------------------------------------+
void WL(int min=0){
if(min==0)return;
if(CountOpOrd()!=1)return;
double stop=MarketInfo(Symbol(),MODE_STOPLEVEL)+MarketInfo(Symbol(),MODE_SPREAD);
for(int i=0;i<OrdersTotal();i++){
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
    if(OrderSymbol()==Symbol()){
      if(OrderMagicNumber()==MagicFirstOrder){
        if(TimeCurrent()-OrderOpenTime()>min*60){
          if(OrderProfit()>0){
          if(OrderStopLoss()!=OrderOpenPrice()){
            if(MathAbs(OrderOpenPrice()-Bid)/Point>stop){
              OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,White);
              //return;
            }
          }
          }
          if(TimeCurrent()-OrderOpenTime()>min*120)if(OrderProfit()==0){del(OrderTicket());}
        }
      }
    }
  }
}              
return;          
}
//-----------------------------------------------------------------------------+
// Âûâîäèò èíôîðìàöèþ íà ýêðàí íà ðóññêîì                                      |
//-----------------------------------------------------------------------------+
void SetInfoRus(int size=9,int pos=0,color col=Green){
int pos0=0,pos1,pos2,pos3,pos4,pos5,pos6,pos7,pos8,pos9;
int sz=size/2;
pos1=pos0+sz+size;
pos2=pos1+sz+size;
pos3=pos2+sz+size;
pos4=pos3+sz+size;
pos5=pos4+sz+size;
pos6=pos5+sz+size;
pos7=pos6+sz+size;
pos8=pos7+sz+size;
pos9=pos8+sz+size;
SetLabel("LabRu0","Lock&&ScalpingXR_v_2009_Rus \xA9", Yellow, 5,pos0 , pos, size);
SetLabel("LabRu1",gInfBalansRus, col, 5,pos1 , pos, size);
SetLabel("LabRu2",ginfMargineRus, col, 5, pos2, pos, size);
SetLabel("LabRu3",gInfProfitRus, col, 5, pos3, pos, size);
SetLabel("LabRu4",gInfCurrProfitRus, col, 5, pos4, pos, size);
SetLabel("LabRu5",gInfMaxOrdRus, col, 5, pos5, pos, size);
SetLabel("LabRu6",gInfOpenOrdRus, col, 5, pos6, pos, size);
SetLabel("LabRu7",gInfRiscRus, col, 5, pos7, pos, size);
SetLabel("LabRu8",gInf1rus, gColor1, 5, pos8, pos, size);
SetLabel("LabRu9",gTimeRus, gColor1, 5, pos9, pos, size);
return;
}
//-----------------------------------------------------------------------------+
// Âûâîäèò èíôîðìàöèþ íà ýêðàí íà àíãëèéñêîì                                   |
//-----------------------------------------------------------------------------+
void SetInfoEngl(int size=9,int pos=0,color col=Green){
int pos0=0,pos1,pos2,pos3,pos4,pos5,pos6,pos7,pos8,pos9;
int sz=size/2;
pos1=pos0+sz+size;
pos2=pos1+sz+size;
pos3=pos2+sz+size;
pos4=pos3+sz+size;
pos5=pos4+sz+size;
pos6=pos5+sz+size;
pos7=pos6+sz+size;
pos8=pos7+sz+size;
pos9=pos8+sz+size;
SetLabel("LabRu0","Lock&&ScalpingXR_v_2009_Rus \xA9", Yellow, 5,pos0 , pos, size);
SetLabel("LabRu1",gInfBalansEngl, col, 5,pos1 , pos, size);
SetLabel("LabRu2",ginfMargineEngl, col, 5, pos2, pos, size);
SetLabel("LabRu3",gInfProfitEngl, col, 5, pos3, pos, size);
SetLabel("LabRu4",gInfCurrProfitEngl, col, 5, pos4, pos, size);
SetLabel("LabRu5",gInfMaxOrdEngl, col, 5, pos5, pos, size);
SetLabel("LabRu6",gInfOpenOrdEngl, col, 5, pos6, pos, size);
SetLabel("LabRu7",gInfRiscEngl, col, 5, pos7, pos, size);
SetLabel("LabRu8",gInf1engl, gColor1, 5, pos8, pos, size);
SetLabel("LabRu9",gTimeEngl, gColor1, 5, pos9, pos, size);
return;
}
//-----------------------------------------------------------------------------+
// Âûâîäèò èíôîðìàöèþ íà ýêðàí                                                 |
//-----------------------------------------------------------------------------+
void Info(){
gInfBalansRus="Âñåãî ñðåäñòâ                          ="+(DoubleToStr(AccountBalance()+GrossProfit(),1));
ginfMargineRus="Ñâîáîäíûõ ñðåäñâ                  ="+(DoubleToStr(AccountFreeMargin(),1));
gInfProfitRus="Òåêóùàÿ ïðèáûëü                     ="+(DoubleToStr(GrossProfit(),1));
gInfCurrProfitRus="Ïðèáûëü ñ íà÷àëà òîðãîâëè   ="+(DoubleToStr(AccountBalance()-StartDepo,1));
gInfMaxOrdRus="Ìàêñèìàëüíî îðäåðîâ            ="+DoubleToStr(OpenOrdermax,0)+" Øò";
gInfOpenOrdRus="Îòêðûòûõ îðäåðîâ                  ="+CountOpOrd("0")+"Øò.";
gInfRiscRus="Ðèñê                                            ="+DoubleToStr(Risk,1)+" %";
//-----------------------------------------------------------------------------+
gInfBalansEngl="Account balanse                               ="+(DoubleToStr(AccountBalance()+GrossProfit(),1));
ginfMargineEngl="Account free margine                       ="+(DoubleToStr(AccountFreeMargin(),1));
gInfProfitEngl="current profit                                       ="+(DoubleToStr(GrossProfit(),1));
gInfCurrProfitEngl="profit from the start of trading           ="+(DoubleToStr(AccountBalance()-StartDepo,1));
gInfMaxOrdEngl="Orders for open maximum               ="+DoubleToStr(OpenOrdermax,0)+" Ps";
gInfOpenOrdEngl="Count open orders                            ="+CountOpOrd("0")+"Ps.";
gInfRiscEngl="Risk                                                     = "+DoubleToStr(Risk,1)+" %";
}
//-----------------------------------------------------------------------------+
// Îïðåäåëÿåò äàòó êîíöà òîðãîâëè                                              |
//-----------------------------------------------------------------------------+
bool EndTradeForDateTime(){
if(EndTradeData==""){
gInf1rus="Äàòà êîíöà òîðãîâëè íå îïðåäåëåíà ";
gInf1engl="Date of the end of trading is not defined ";
gColor1=LimeGreen;
return(false);
}
int EndData=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
int DataEnd=StrToTime(EndTradeData);
if(EndData>=DataEnd){
gInf1rus="Òîðãîâëÿ îñòàíîâëåííà "+EndTradeData;
gInf1engl="Trading stopped "+EndTradeData;
gColor1=Red;
return(true);
}
gInf1rus="Òîðãîâëÿ áóäåò îñòàíîâëåííà "+EndTradeData;
gInf1engl="Trading will be stopped "+EndTradeData;
gColor1=LimeGreen;
return(false);
}
//-----------------------------------------------------------------------------+
// Òî÷êà ðàâíîâåñèÿ                                                            |
//-----------------------------------------------------------------------------+
double NullDotBuy(){double prise=0;int count=0,countlot=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(OrderType()==0){
      countlot=(OrderLots()/MinLot);
      count=count+countlot;
      prise=prise+(OrderOpenPrice()*countlot);
      //LotBuy=LotBuy+OrderLots();
      //profitbuy=profitbuy+OrderProfit();
      }
    }
  }
}
gCountLotBuy=count;
if(count==0){count=1;}
prise=prise/count;
return(prise);
}
//-----------------------------------------------------------------------------+
// Òî÷êà ðàâíîâåñèÿ                                                            |
//-----------------------------------------------------------------------------+
double NullDotSell(){double prise=0;int count=0,countlot=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(OrderType()==1){
      countlot=(OrderLots()/MinLot);
      count=count+countlot;
      prise=prise+(OrderOpenPrice()*countlot);
      //LotSell=LotSell+OrderLots();
      //profitsell=profitsell+OrderProfit();
      }
    }
  }
}
gCountLotSell=count;
if(count==0){count=1;}
prise=prise/count;
return(prise);
}
//-----------------------------------------------------------------------------+
// Òî÷êà ðàâíîâåñèÿ                                                            |
//-----------------------------------------------------------------------------+
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 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;}
//-----------------------------------------------------------------------------+
// Ôóíêöèÿ êîíòðîëÿ âðåìåíè òîðãîâëè                                           |
//-----------------------------------------------------------------------------+
bool TradeTime(){
int StartTradeHour=StartTrade;
int EndTradeHour=EndTrade;
if(!TradeOfTime){
if(DayOfWeek()==6||DayOfWeek()==0){
gTimeEngl="Start trade in  01:00 am";
gTimeRus="Íà÷àëî òîðãîâëè â ïîíåäåëüíèê â 01:00";
return(false);}
return(true);}
if(DayOfWeek()==6||DayOfWeek()==0){
gTimeEngl="Start trade in  01:00 am";
gTimeRus="Íà÷àëî òîðãîâëè â ïîíåäåëüíèê â 01:00";
return(false);}
if(StartTradeHour<EndTradeHour){
  if(TimeHour(TimeCurrent())>=StartTradeHour&&TimeHour(TimeCurrent())<EndTradeHour
    ||(CountOpOrd("0")>0)){
    gTimeEngl=StringConcatenate("By the end of trading session :",DoubleToStr((EndTradeHour-TimeHour(TimeCurrent())),0)," hours");
    gTimeRus=StringConcatenate("Äî êîíöà òîðãîâîé ñåññèè :",DoubleToStr((EndTradeHour-TimeHour(TimeCurrent())),0)," ÷àñîâ");
    return(true);}}
if(StartTradeHour>EndTradeHour){
  if(TimeHour(TimeCurrent())>=StartTradeHour||TimeHour(TimeCurrent())<EndTradeHour
    ||(CountOpOrd("0")>0)){
    gTimeEngl=StringConcatenate("By the end of trading session :",DoubleToStr((EndTradeHour-TimeHour(TimeCurrent())),0)," hours");
    gTimeRus=StringConcatenate("Äî êîíöà òîðãîâîé ñåññèè :",DoubleToStr((EndTradeHour-TimeHour(TimeCurrent())),0)," ÷àñîâ");
    return(true);}}    
gTimeEngl=StringConcatenate("resting to : ",StartTradeHour,": 00");   
gTimeRus=StringConcatenate("îòäûõàåì äî : ",StartTradeHour,": 00");  
return(false);
}
//+----------------------------------------------------------------------------+
// Äàò÷èê Øèðèíû êîðèäîðà óñòàíîâëåííûõ îðäåðîâ                                +
//-----------------------------------------------------------------------------+
int PriseChanelWide(){double minprise=100000,maxprise=0;double first=Close[0],second=Close[0];int time=TimeCurrent();
  if(CountOpOrd("")<2){return(1);}
  for(int n=0;n<OrdersTotal();n++){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Symbol()){
        if(OrderMagicNumber()==MagicFirstOrder||OrderMagicNumber()==Magik){
          if(minprise>OrderOpenPrice()){minprise=OrderOpenPrice();}
          if(maxprise<OrderOpenPrice()){maxprise=OrderOpenPrice();}
        }  
      }  
    }
  } 
  gMinPrise=minprise;
  gMaxPrise=maxprise;
  for(n=0;n<OrdersTotal();n++){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Symbol()){
        if(OrderMagicNumber()==MagicFirstOrder){first=OrderOpenPrice();}
        if(OrderMagicNumber()==Magik){
          if(OrderOpenTime()<time){
            time=OrderOpenTime();
            second=OrderOpenPrice();
          } 
        }
      }
    }
  }      
  
  int ch=MathRound(MathAbs(first-second)/Point/mno);     
  int x=MathRound(((maxprise-minprise)/Point/mno)/ch);
  //Print(first,"   ",second,"  CH= ",ch,"  max=",(maxprise-minprise)/Point,"  X=",x); 
  if(x<1)x=1;
return(x);      
}
//+----------------------------------------------------------------------------+
// Ôóíêöèÿ âîçâðàùàåò ñðåäíþþ öåíó ìåæäó áëèçæàéøèìè îðäåðàìè                  +
//-----------------------------------------------------------------------------+
int MidleOrders(int OrdDist=10){
if(OrdersTotal()<2){return(-1);}
double dist1=100000,dist2=1000000;int typ1,typ2,magik1,magik2;
  for(int n=0;n<OrdersTotal();n++){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Symbol()){  
        if(OrderOpenPrice()-Bid>0){
          if(OrderOpenPrice()-Bid<dist1){
            dist1=OrderOpenPrice()-Bid;
            typ1=OrderType();
            magik1=OrderMagicNumber();
          }  
        }
      }
    }
  }    
  for(n=0;n<OrdersTotal();n++){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Symbol()){ 
        if(Bid-OrderOpenPrice()>0){
          if(Bid-OrderOpenPrice()<dist2){
            dist2=Bid-OrderOpenPrice();
            typ2=OrderType();
            magik2=OrderMagicNumber();
          }  
        }
      }
    }
  }        
  dist1=NormalizeDouble(dist1/Point,Digits);
  dist2=NormalizeDouble(dist2/Point,Digits);
  if(MathAbs(dist1+dist2)<OrdDist)return(-1);
  if(typ1==typ2){
    if(MathAbs(dist1-dist2)<3){
      if(magik1==MagicFirstOrder&&magik2==MagicFirstOrder)return(-1);
      if(typ1==0){return(0);}
      if(typ1==1){return(1);}
    }
  }else{
    if(LockMode==1){
      //if(typ1==0){return(0);}
      //if(typ1==1){return(1);}
    }  
  }
  return(-1);
}
//+----------------------------------------------------------------------------+
// Ïîäñ÷èòûâàåò Îáùóþ íå ðåàëèçîâàííóþ ïðèáûëü íà äàííîì èíñòðóìåíòå           +
//-----------------------------------------------------------------------------+
double GrossProfit(int prls=0){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(IsOrder("",MagicFirstOrder)||IsOrder("",Magik)){
         if(prls==0)grpr=grpr+OrderProfit()+OrderSwap()+OrderCommission();
         if(prls>0)if(OrderProfit()>0)grpr=grpr+OrderProfit()+OrderSwap()+OrderCommission();
         if(prls<0)if(OrderProfit()<0)grpr=grpr+OrderProfit()+OrderSwap()+OrderCommission();
       }
     }    
   } 
return(grpr);
}
//+----------------------------------------------------------------------------+
// Çàäàåò äèñòàíöèþ äëÿ ëîêà                                                   +
//-----------------------------------------------------------------------------+
int NearOrdDistanse(int dist =20){double prise=1000000;int mindist=10;
  //if(dist<mindist){dist=mindist;}
  if(CountOpOrd("0")<2){return(0);}
    for(int n=0;n<OrdersTotal();n++){
      if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){
        if(OrderSymbol()==Symbol()){
          if(OrderMagicNumber()==MagicFirstOrder||OrderMagicNumber()==Magik){
            if(MathAbs(Bid-OrderOpenPrice())<prise){prise=OrderOpenPrice();}
          }
        }
      }
    }
    if(MathAbs(Bid-prise)>dist*Point/mno){
      if(Bid-prise>0){return(-1);}
      if(Bid-prise<0){return(1);}
    }
  return(0);            
}
//+----------------------------------------------------------------------------+
// Çàïðåùàåò óñòàíîâêó äâàæäû íà îäíó öåíó                                     +
//-----------------------------------------------------------------------------+
bool PriseDist(int dist=20,int older=2){double prise;int time;
//if(CountOpOrd("0")<2){return(false);}
  for(int n=0;n<OrdersTotal();n++){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Symbol()){
        if(OrderMagicNumber()==MagicFirstOrder||OrderMagicNumber()==Magik){
          if(OrderOpenTime()>time){
            time=OrderOpenTime();
            prise=OrderOpenPrice();
          }
        }
      }
    }
  }
if(MathAbs(Bid-prise)<dist*Point/mno){return(false);}  
if(time>iTime(Symbol(),Tf,older)){return(false);}  
return(true);}
//+----------------------------------------------------------------------------+
// Äàò÷èê ïîëîæåíèÿ öåíû âíå êîðèäîðà óñòàíîâëåííûõ îðäåðîâ                    +
//-----------------------------------------------------------------------------+
bool OutOfPrise(){double minprise=100000,maxprise=0;
if(OrdersTotal()<2){return(true);}
  for(int n=0;n<OrdersTotal();n++){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Symbol()){
        if(OrderMagicNumber()==MagicFirstOrder||OrderMagicNumber()==Magik){
          if(minprise>OrderOpenPrice()){minprise=OrderOpenPrice();}
          if(maxprise<OrderOpenPrice()){maxprise=OrderOpenPrice();}
        }  
      }  
    }
  }
  if(Bid>minprise&&Bid<maxprise){return(false);}  
return(true);      
}
//+----------------------------------------------------------------------------+
// Äåòåêòîð äîñòèæåíèÿ óðîâíÿ âèðò ñòîïà äëÿ ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà  |
//-----------------------------------------------------------------------------+
int IfOrdstoploss(){
  if(OrderType()==0){if(OrderOpenPrice()-Bid>=stoploss*Point/mno){return(-1);}}
  if(OrderType()==1){if(Ask-OrderOpenPrice()>=stoploss*Point/mno){return(1);}}
  return(0);
}
//-----------------------------------------------------------------------------+
//| Ïîäñ÷èòûâàåò êîëè÷åñòâî îòêðûòûõ îðäåðîâ ñîãëàñíî óñëîâèÿì                 |
//-----------------------------------------------------------------------------+
int CountOpOrd(string Sy="",int Magik=-1,int Typ=-1){int count=0;
if(Sy=="0"||Sy==""){Sy=Symbol();}
  for(int i=0;i<OrdersTotal();i++){
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Sy){
        if(Magik==(-1)||OrderMagicNumber()==Magik){
          if(Typ==(-1)||OrderType()==Typ){
            if(OrderCloseTime()==0){
              count++;
            }  
          }
        }
      }
    }
  }
 return(count);  
}
//-----------------------------------------------------------------------------+
//| ïðîâåðÿåò ðûíî÷íûé îðäåð íà ïðèíàäëåæíîñòü ñîãëàñíî óñëîâèÿì               |
//-----------------------------------------------------------------------------+
bool IsOrder(string Sy="",int Magik=-1,int Typ=-1){
if(Sy=="0"||Sy==""){Sy=Symbol();}
  if(OrderSymbol()==Sy){
    if(Magik==(-1)||OrderMagicNumber()==Magik){
      if(Typ==(-1)||OrderType()==Typ){
        if(OrderCloseTime()==0){
          return(true);
        }  
      }
    }
  }
 return(false); 
}
//-----------------------------------------------------------------------------+
//| Ðàñ÷åò ëîòà ñîîòâ ðèñêó è áàëàíñó                                          |
//-----------------------------------------------------------------------------+
double CalcLotsAuto(){double LotOpt,LotNeOpt,Zalog;
   if(IsTesting()||IsOptimization()){if(TestInfo){return(0.1);}}
   RefreshRates();
   //double bs=AccountBalance()+GrPorfit();
   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=Balans;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=(Balans*(Risk/100))/Set;
   LotOpt=NormalizeDouble((Zalog/1000),step);
   if(LotOpt>LotMax)LotOpt=LotMax;
   if(LotOpt<LotMin)LotOpt=LotMin;
   return(LotOpt);
}
//+----------------------------------------------------------------------------+
// îäèíî÷íîå Âñòðå÷íîå çàêðûòèå                                                +
//-----------------------------------------------------------------------------+
void CloseBy(){
if(CountOpOrd("0")<3)return;
if(OutOfPrise())return;
double dist1=100000,dist2=100000;
double minprise=1000000,maxprise=0;
double profit1,profit2,prise1,prise2;
int n,ticket1,ticket2,typ1,typ2;
//-----Íàõîäèì áëèçæàéøèå ê öåíå 2 îðäåðà--------------------------------------+
  for(n=0;n<OrdersTotal();n++){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
      if(IsOrder("",MagicFirstOrder)||IsOrder("",Magik)){
        if(OrderOpenPrice()-Bid>0&&OrderOpenPrice()-Bid<dist1){
          dist1=OrderOpenPrice()-Bid;
          ticket1=OrderTicket();
          typ1=OrderType();
          profit1=OrderProfit();
          prise1=OrderOpenPrice();
        }  
        if(Bid-OrderOpenPrice()>0&&Bid-OrderOpenPrice()<dist2){
          dist2=Bid-OrderOpenPrice();
          ticket2=OrderTicket();
          typ2=OrderType();
          profit2=OrderProfit();
          prise2=OrderOpenPrice();
        }        
      }
    }
  }
//-----Íàõîäèì êðàéíèå öåíû----------------------------------------------------+
  for(n=0;n<OrdersTotal();n++){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Symbol()){
        if(OrderMagicNumber()==MagicFirstOrder||OrderMagicNumber()==Magik){
          if(minprise>OrderOpenPrice()){minprise=OrderOpenPrice();}
          if(maxprise<OrderOpenPrice()){maxprise=OrderOpenPrice();}
        }  
      }  
    }
  }    
  prise1    =NormalizeDouble(prise1,Digits);
  prise2    =NormalizeDouble(prise2,Digits);
  minprise  =NormalizeDouble(minprise,Digits);
  maxprise  =NormalizeDouble(maxprise,Digits);
  profit1   =NormalizeDouble(profit1,2);
  profit2   =NormalizeDouble(profit2,2);
  if(typ1==typ2){
  SetArrow("prise1",4,1,0,prise1,Blue);
  SetArrow("prise2",4,1,0,prise2,White);
  SetArrow("minprise",4,1,0,minprise,Red);
  SetArrow("maxprise",4,1,0,maxprise,Red);  
  //Print(profit1,"  ",profit2,"    ",MathAbs(profit1+profit2));
  if(MathAbs(profit1+profit2)<=2){
    if(prise1==maxprise||prise2==minprise){
    //del(ticket1);
    //del(ticket2);
    }
    //OrderCloseBy(ticket1,ticket2,White);
  }
  }
return;          
}
//+----------------------------------------------------------------------------+
// Óäàëåíèå ñàìîãî áîëüøîãî ëîñÿ íà ëåòó                                       +
//-----------------------------------------------------------------------------+
void DelBigestLoss(){
if(OrdersTotal()<2)return;
double lossprofit;
int lossticket;
double profit[50][2],loss[50][2],prom[50][2];
double pr;int countprofit=0,countloss=0;
  for(int n=OrdersTotal()+1;n>=0;n--){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
      if(IsOrder("",MagicFirstOrder)||IsOrder("",Magik)){
        if(OrderProfit()<0){
          loss[countloss][0]=OrderProfit();
          loss[countloss][1]=OrderTicket();
          countloss++;
        }
        if(OrderProfit()>0){
          profit[countprofit][0]=OrderProfit();
          profit[countprofit][1]=OrderTicket();
          countprofit++;
        }
      }
    }
  }
  countprofit=countprofit-1;
  countloss=countloss-1;
  if(countprofit<1)return;
  if(countloss<1)return;
//--Ñîðòèðîâêà ìàññèâà ïðîôèòíûõ îðäåðîâ â ïîðÿäêå âîçðàñòàíèÿ  
  ArrayResize(profit,countprofit);
  ArrayResize(prom,countprofit);
  for(n=0;n<countloss;n++){
  prom[n][0]=0;
  prom[n][1]=0;  
  }
  for(n=0;n<countprofit;n++){
  int index=ArrayMaximum(profit);
  prom[n][0]=profit[index][0];
  prom[n][1]=profit[index][1];
  profit[index][0]=0;
  profit[index][1]=0;
  }
  for(n=0;n<countloss;n++){
  profit[n][0]=0;
  profit[n][1]=0;  
  }  
  for(n=0;n<countprofit;n++){
  profit[n][0]=prom[n][0];
  profit[n][1]=prom[n][1];  
  }  
//--Ñîðòèðîâêà ëîñåâûõ îðäåðîâ â ïîðÿäêå óáûâàíèÿ  
  index=0;
  ArrayResize(prom,countloss);
  ArrayResize(loss,countloss);
  for(n=0;n<countloss;n++){
  prom[n][0]=0;
  prom[n][1]=0;  
  }
  for(n=0;n<countloss;n++){
  index=ArrayMinimum(loss);
  prom[n][0]=loss[index][0];
  prom[n][1]=loss[index][1];
  loss[index][0]=0;
  loss[index][1]=0;
  }
  for(n=0;n<countloss;n++){
  loss[n][0]=0;
  loss[n][1]=0;  
  }  
  for(n=0;n<countloss;n++){
  loss[n][0]=prom[n][0];
  loss[n][1]=prom[n][1]; 
  }   
//-----Íàõîæäåíèå ïîäõîäÿùåé êîìáèíàöèè----------------------------------------+ 
  int count;double prpr;bool close=false; 
  for(int x=0;x<countloss/2;x++){
    if(loss[x][0]<0){
      lossprofit=loss[x][0];
      lossticket=loss[x][1];
    }  
    for(n=0;n<countprofit;n++){
      prpr=prpr+profit[n][0];
      count++;
      if(NormalizeDouble(prpr,2)+NormalizeDouble(lossprofit,2)>=0
       &&NormalizeDouble(prpr,2)+NormalizeDouble(lossprofit,2)<1.5)close=true;break;
    }
  }  
  if(close){
    del(lossticket);
    for(n=0;n<count;n++){int tick=profit[n][1];del(tick);}
    return;
  }
return;         
}
//-----------------------------------------------------------------------------+
// Ôóíêöèÿ êîíòðîëÿ íîâîãî áàðà                                                |
//-----------------------------------------------------------------------------+
bool NevBar(){
   static int PrevTime=0;
   if (PrevTime==iTime(NULL,Tf,0)) return(false);
   PrevTime=iTime(NULL,Tf,0);
   return(true);} 
//+----------------------------------------------------------------------------+
// Çàêðûâàåò âñå îðäåðà íà äàííîì èíñòðóìåíòå                                  +
//-----------------------------------------------------------------------------+
void CloseAll(){
//Print(GrossProfit());
 while(OrdersTotal()>0){
   for(int n=OrdersTotal()+1;n>=0;n--){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       del(OrderTicket());
     }    
   } 
 } 
return;    
}   
//-----------------------------------------------------------------------------+
//Óäàëÿåò ðûíî÷íûé îðäåð ñ óêàçàííûì åé òèêåòîì                                |
//+----------------------------------------------------------------------------+
void del(int ticket){int err;
 for(int i=0;i<1;i++){
   GetLastError();//îáíóëÿåì îøèêó
   OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
   string symbol = OrderSymbol();
   int dig=MarketInfo(symbol,MODE_DIGITS);
   if(OrderType()==OP_BUY){RefreshRates();
     double prise = NormalizeDouble(MarketInfo(symbol,MODE_BID),dig);
     if(!OrderClose(ticket,OrderLots(),prise,3,Green)){err = GetLastError();}}
   if(OrderType()==OP_SELL){RefreshRates();
     prise = NormalizeDouble(MarketInfo(symbol,MODE_ASK),dig);
     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                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 12.10.2007                                                     |
//|  Îïèñàíèå : Óñòàíîâêà òåêñòîâîé ìåòêè, îáúåêò OBJ_LABEL.                   |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    nm - íàèìåíîâàíèå îáúåêòà                                               |
//|    tx - òåêñò                                                              |
//|    cl - öâåò ìåòêè                                                         |
//|    xd - êîîðäèíàòà X â ïèêñåëàõ                                            |
//|    yd - êîîðäèíàòà Y â ïèêñåëàõ                                            |
//|    cr - íîìåð óãëà ïðèâÿçêè        (0 - ëåâûé âåðõíèé,                     |
//|                                     1 - ïðàâûé âåðõíèé,                    |
//|                                     2 - ëåâûé íèæíèé,                      |
//|                                     3 - ïðàâûé íèæíèé )                    |
//|    fs - ðàçìåð øðèôòà              (9 - ïî óìîë÷àíèþ  )                    |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. 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(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);
      }
   }
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. 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,string com="") {
  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, com, mn, 0, clOpen);
    else
      ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, com, mn, 0, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if(err==148){OpenOrdermax=OrdersTotal()-1;return;}
      if(err==134){OpenOrdermax=OrdersTotal()-1;return;}
      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