//-----------------------------------------------------------------------------+
//|                                                   Lock&&PipsingXR_2009.mq4 |
//|                                           Copyright © 2009, XrustSolution. |
//|                                                  http://www.xrust.ucoz.net |
//-----------------------------------------------------------------------------+
#property copyright "#Copyright © 2008, XrustSolution.#"
#property link      "#http://www.xrust.ucoz.net#"
#include <stdlib.mqh>
//-----------------------------------------------------------------------------+
extern string a="Part One = Skalper";
extern int       IndSet1=3;
extern int       IndSet2=1;
extern int       F_T_treshold=8;
extern int       Stoploss=0;
extern int       Takeprofit=0;
extern double    Risk     =1;
extern int       TimeFrame=0;
extern int       Targetprofit=0;
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 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;
//----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 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=false;
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;}else{mno=1;}
  //F_T_treshold=F_T_treshold*mno;
  Slippage=Slippage*mno;
  Stoploss=Stoploss*mno;
  Takeprofit=Takeprofit*mno;
//-----------------------------------------------------------------------------+  
  Average(Targetprofit);
  FirstTrade();
//-----------------------------------------------------------------------------+    
return;}
//-----------------------------------------------------------------------------+
void deinit(){ObjectsDeleteAll(0,OBJ_LABEL);return;}
//-----------------------------------------------------------------------------+
void start(){static int max;Trade=0;
  Info();
  WL(WlMinute);
  if(FullAuto){if(AccountBalance()+GrossProfit()<AccountBalance()*0.75){CloseLock=true;}else{CloseLock=false;}}
  if(Stoploss==0){Average(Targetprofit);stoploss=Sll;}else{stoploss=Stoploss;}
  if(Takeprofit==0){Average(Targetprofit);takeprofit=Tpp;}else{takeprofit=Takeprofit;} 
  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(CountOpOrd("0")>0)if(GrossProfit()>=(takeprofit*FirstOrderLots()*MarketInfo(Symbol(),MODE_LOTSIZE)/10000)/CountOpOrd("0")/mno)CloseAll();
  //if(CountOpOrd("0")>1)if(GrossProfit()>=0)CloseAll();
  if(CountOpOrd("0")<1){OpenOrdermax=TotalOrders;}
  if(OpenOrdermax>AccountBalance()/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto())){
  OpenOrdermax=(AccountBalance()/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto()));}
//=============================================================================+
  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,lot,0,0,Magik);
      if(PriseDist(stoploss*PriseChanelWide()))if(NearOrdDistanse(stoploss*PriseChanelWide())<0)OpenPosition("",1,lot,0,0,Magik);  
    }else{
     if(PriseDist(stoploss/3))if(MidleOrders(stoploss/3)==0){OpenPosition("",0,lot,0,0,Magik);}
     if(PriseDist(stoploss/3))if(MidleOrders(stoploss/3)==1){OpenPosition("",1,lot,0,0,Magik);}     
    }
  }
//-----Óñòàíîâêà âòîðîãî îðäåðà------------------------------------------------+
  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("",MagicFirstOrder,-1)<1){
      FirstTrade();
      if(Trade<0){OpenPosition("",1,lot,0,0,MagicFirstOrder,Comm);return;} 
      if(Trade>0){OpenPosition("",0,lot,0,0,MagicFirstOrder,Comm);return;}
    } 
  }
//-----------------------------------------------------------------------------+
  }
//=============================================================================+
  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,lot,0,0,Magik);
      if(OutOfPrise())if(NearOrdDistanse(stoploss/PriseChanelWide())>0)if(PriseDist(stoploss/PriseChanelWide()))OpenPosition("",1,lot,0,0,Magik);  
    }else{
     if(PriseDist(stoploss/PriseChanelWide()/2))if(MidleOrders(stoploss/PriseChanelWide()/2)==0){OpenPosition("",0,lot,0,0,Magik);}
     if(PriseDist(stoploss/PriseChanelWide()/2))if(MidleOrders(stoploss/PriseChanelWide()/2)==1){OpenPosition("",1,lot,0,0,Magik);}     
    } 
  }
//-----Óñòàíîâêà âòîðîãî îðäåðà------------------------------------------------+
  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){
      FirstTrade();
      if(Trade<0){OpenPosition("",1,lot,0,0,MagicFirstOrder,Comm);return;} 
      if(Trade>0){OpenPosition("",0,lot,0,0,MagicFirstOrder,Comm);return;} 
    }  
  }  
//-----------------------------------------------------------------------------+
  }  
//=============================================================================+
  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,lot,0,0,Magik);
      if(OutOfPrise())if(NearOrdDistanse(stoploss*PriseChanelWide())<0)if(PriseDist(stoploss*PriseChanelWide()))OpenPosition("",1,lot,0,0,Magik);  
    }else{
     if(PriseDist(stoploss/PriseChanelWide()/4))if(MidleOrders(stoploss/PriseChanelWide()/4)==0){OpenPosition("",0,lot,0,0,Magik);}
     if(PriseDist(stoploss/PriseChanelWide()/4))if(MidleOrders(stoploss/PriseChanelWide()/4)==1){OpenPosition("",1,lot,0,0,Magik);}     
    } 
  }
//-----Óñòàíîâêà âòîðîãî îðäåðà------------------------------------------------+
  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){
      FirstTrade();
      if(Trade<0){OpenPosition("",1,lot,0,0,MagicFirstOrder,Comm);return;} 
      if(Trade>0){OpenPosition("",0,lot,0,0,MagicFirstOrder,Comm);return;} 
    }  
  } 
//-----------------------------------------------------------------------------+  
  }  
//=============================================================================+
if(TestInfo){
    Testinfo();
  if(IsTesting()){   
    SetArrow("Ama1_",4,1,0,AMA(IndSet1,30,9,25,150,Tf,1),White);
    SetArrow("Ama2_",4,1,0,AMA(IndSet1+IndSet2,30,9,25,150,Tf,1),Red);  
  }  
}  
//-----------------------------------------------------------------------------+
if(OnBar)PrewTime=iTime(NULL,Tf,0);
//-----------------------------------------------------------------------------+
return;}
//+----------------------------------------------------------------------------+
// Äåòåêòîð Ëîòà ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà                              |
//-----------------------------------------------------------------------------+
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("IndSet 1 ="),leadnull(IndSet1),             Secondnull("Balanse =",29),leadnull(AccountBalance()),"\n",
        Secondnull("IndSet 2 ="),leadnull(IndSet2),             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("FTtreshold =",14),Secondnull(F_T_treshold,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=10, mn, tf, 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/2);
    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 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);
//------------------------------------------------+
Trade=0; 
int x,p;
double Ama1[3],Ama2[3];int res[3];
for(x=1;x<=3;x++){
  Ama1[x-1]=AMA(IndSet1,30,9,25,150,Tf,x);//iCustom(Symbol(),Tf,"AMA STL",zxc,30,9,25,300,0,x);//
  Ama2[x-1]=AMA(IndSet1+IndSet2,30,9,25,150,Tf,x);//iCustom(Symbol(),Tf,"AMA STL",zxc+zxc2,30,9,25,300,0,x);//
}
res[0]=((Ama1[0]-Ama2[0])/Point)/mno;
res[1]=((Ama1[1]-Ama2[1])/Point)/mno;
res[2]=((Ama1[2]-Ama2[2])/Point)/mno;
gPorog=res[0];//-res[1];
gRes1=res[0];
gRes2=res[1];
gRes3=res[2];  
//-----------------------------------------+
//  Îïðåäåëèòåëüìîäåëè ïîâåäåíèÿ           |
//-----------------------------------------+ 
if(FullAuto){
  if(Ama1[0]==Ama1[1]&&Ama1[1]==Ama1[2]){
    if(res[0]==res[1]&&res[1]==res[2]){LockMode=1;}
  }else{LockMode=2;}
//    if((res[0]!=res[1]&&res[1]!=res[2])||
//      (res[0]!=res[1]&&res[1]==res[2])||
//      (res[0]==res[1]&&res[1]!=res[2])){LockMode=3;}
//      
//    if(res[0]==res[1]&&res[1]==res[2]){LockMode=2;}
//  }
}
//-----------------------------------------+
//  Ìîäåëü Êîíòð Òðåíä                     |
//-----------------------------------------+ 
if(LockMode==3){
if(Ama1[0]>Ama1[1]&&Ama1[1]>Ama1[2]){
  if(res[0]>0&&res[1]>0&&res[2]>0){
    if(res[0]>=res[1]&&res[1]>=res[2]){
      if(iLow(Symbol(),Tf,1)>Ama1[0]){
        Trade=1;
        return; 
      }  
    }
  }
}
if(Ama1[0]<Ama1[1]&&Ama1[1]<Ama1[2]){
  if(res[0]<0&&res[1]<0&&res[2]<0){
    if(res[0]<=res[1]&&res[1]<=res[2]){
      if(iHigh(Symbol(),Tf,1)<Ama1[0]){
        Trade=-1;
        return; 
      }   
    }
  }
}
Trade=0;
return;
}
//-----------------------------------------+
//  Ìîäåëü Òðåíä                           |
//-----------------------------------------+
if(LockMode==2){
if(Ama1[0]>Ama1[1]&&Ama1[1]>Ama1[2]){
  if(res[0]>0&&res[1]>0&&res[2]>0){
    if(res[0]>=res[1]&&res[1]>=res[2]){
      if(iLow(Symbol(),Tf,1)>Ama1[0]){
        Trade=1;
        return; 
      }  
    }
  }
}
if(Ama1[0]<Ama1[1]&&Ama1[1]<Ama1[2]){
  if(res[0]<0&&res[1]<0&&res[2]<0){
    if(res[0]<=res[1]&&res[1]<=res[2]){
      if(iHigh(Symbol(),Tf,1)<Ama1[0]){
        Trade=(-1);
        return; 
      }   
    }
  }
}
Trade=0;
return;
}
//-----------------------------------------+
//  Ìîäåëü Ôëåò                            |
//-----------------------------------------+
if(LockMode==1){
if(Ama1[0]==Ama1[1]&&Ama1[1]==Ama1[2]){
if(res[0]==res[1]&&res[1]==res[2]){
  if(res[0]>=0&&res[1]>=0&&res[2]>=0){
    if(res[0]<=F_T_treshold){
      if(iClose(Symbol(),Tf,1)<Ama2[0]){//&&
         //(iClose(Symbol(),Tf,1)>Ama1[0])){
        Trade=1;
        return;
      }  
    }  
  }
}
if(res[0]==res[1]&&res[1]==res[2]){
  if(res[0]<=0&&res[1]<=0&&res[2]<=0){
    if(res[0]>=(-1*F_T_treshold)){
      if(iClose(Symbol(),Tf,1)>Ama1[0]){//&&
         //(iClose(Symbol(),Tf,1)<Ama2[0])){
        Trade=(-1);
        return;
      }  
    }  
  }
}
}
}
Trade=0;
return;
}
//-----------------------------------------------------------------------------------------------------------+
double AMA(int FastMA = 2,int SlowMA = 30,int Range = 9,int filter = 25,int NBars = 300,int Tf = 0,int Chift=1){
double fAMA[];
double mAMA[];
int cb, i;
double  k1, k2, Noise, ER, SSC, AMA, sdAMA, dAMA;
//-----------------------------------------------------
ArrayResize(fAMA,NBars+1);
ArrayResize(mAMA,NBars+1);
ArrayInitialize(fAMA,0);
ArrayInitialize(mAMA,0);
ArrayIsSeries(fAMA);
ArrayIsSeries(mAMA);
k1 = 2.0 / (SlowMA + 1);
k2 = 2.0 / (FastMA + 1) - k1;
AMA = iClose(Symbol(),Tf,NBars-Range);
mAMA[NBars-Range] = iClose(Symbol(),Tf,NBars-Range+1);
//-----------------------------------------------------
  for(cb = NBars; cb >= 0; cb--){
  Noise = 0;
    for(i=cb;i<=cb+Range-1;i++){Noise=Noise+MathAbs(iClose(Symbol(),Tf,i)-iClose(Symbol(),Tf,i+1));}
      if(Noise!=0){ER = MathAbs(iClose(Symbol(),Tf,cb) - iClose(Symbol(),Tf,cb+Range)) / Noise;}else{ER = 0;}
      SSC=(ER*k2 + k1);
      AMA=AMA+NormalizeDouble(SSC*SSC*(iClose(Symbol(),Tf,cb) - AMA), 4);
      mAMA[cb] = AMA;
      if(filter < 1){
        fAMA[cb] = mAMA[cb];
        if(cb==Chift)return(fAMA[cb]);
      }else{
        for(i=cb;i<=cb+SlowMA-1;i++){sdAMA = sdAMA + MathAbs(mAMA[i] - mAMA[i+1]);}
        dAMA=mAMA[cb]-mAMA[cb+1];
        if(dAMA>=0){
          if(dAMA < NormalizeDouble(filter*sdAMA / (100*SlowMA), 4) && 
            iHigh(Symbol(),Tf,cb) <= iHigh(Symbol(),Tf,iHighest(NULL, 0, MODE_HIGH, 4, cb)) + 10*Point){
            fAMA[cb] = fAMA[cb+1];
            if(cb==Chift)return(fAMA[cb]);
          }else{
            fAMA[cb] = mAMA[cb];
            if(cb==Chift)return(fAMA[cb]);
          }//if(dAMA < Normaliz
        }else{
          if(MathAbs(dAMA) < NormalizeDouble(filter*sdAMA / (100*SlowMA), 4) && 
             iLow(Symbol(),Tf,cb) > iLow(Symbol(),Tf,iLowest(NULL, 0, MODE_LOW, 4, cb)) - 10*Point){
             fAMA[cb] = fAMA[cb+1];
             if(cb==Chift)return(fAMA[cb]);
          }else{
             fAMA[cb] = mAMA[cb];
             if(cb==Chift)return(fAMA[cb]);
          }
        }
        sdAMA=0.0;
     }//for(i=cb;i<=cb+Range-1;i++)
  }//for(cb = NBars; cb >= 0; cb--){
return(fAMA[Chift]);
}
//-----------------------------------------------------------------------------+
// Âûâîäèò èíôîðìàöèþ íà ýêðàí íà ðóññêîì                                      |
//-----------------------------------------------------------------------------+
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 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;
  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();}
        }  
      }  
    }
  } 
  int x=MathRound(((maxprise-minprise)/Point)/stoploss);
  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;
  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){
      if(Bid-prise>0){return(-1);}
      if(Bid-prise<0){return(1);}
    }
  return(0);            
}
//+----------------------------------------------------------------------------+
// Çàïðåùàåò óñòàíîâêó äâàæäû íà îäíó öåíó                                     +
//-----------------------------------------------------------------------------+
bool PriseDist(int dist=20,int older=10){double prise=100000;
//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(MathAbs(Bid-OrderOpenPrice())<dist*Point){
            if(OrderOpenTime()>iTime(Symbol(),Tf,older)*OrdersTotal()){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){return(-1);}}
  if(OrderType()==1){if(Ask-OrderOpenPrice()>=stoploss*Point){return(1);}}
  return(0);
}
//-----------------------------------------------------------------------------+
//| Ïîäñ÷èòûâàåò êîëè÷åñòâî îòêðûòûõ îðäåðîâ ñîãëàñíî óñëîâèÿì                 |
//-----------------------------------------------------------------------------+
int CountOpOrd(string Sy="",int Magik=-1,int Typ=-1){int count=0;
  for(int i=0;i<OrdersTotal();i++){
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
      if(IsOrder(Sy,Magik,Typ))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){
  if(profit1-profit2==0){
    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==Time[0]) return(false);
   PrevTime=Time[0];
   return(true);} 
//+----------------------------------------------------------------------------+
// Çàêðûâàåò âñå îðäåðà íà äàííîì èíñòðóìåíòå                                  +
//-----------------------------------------------------------------------------+
void CloseAll(){
 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();
   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                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 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