Lock&&PipsingXR_2009





//-----------------------------------------------------------------------------+
//|                                                   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 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 =0;
extern string n="text color to displ";
extern color     TextColor=White;
extern bool      UseSound=false;
extern bool      TestInfo=false;
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;string LM2="";
//-----------------------------------------------------------------------------+
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;
  Average();
  if(Stoploss==0)stoploss=Sll;else stoploss=Stoploss;
  if(Takeprofit==0)takeprofit=Tpp;else takeprofit=Takeprofit;   
  if(Digits==3||Digits==5){mno=10;F_T_treshold=F_T_treshold*10;}else{mno=1;}
return;}
//-----------------------------------------------------------------------------+
void deinit(){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();stoploss=Sll;}else{stoploss=Stoploss;}
  if(Takeprofit==0){Average();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); 
  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*CalcLotsAuto()*MarketInfo(Symbol(),MODE_LOTSIZE)/10000)/CountOpOrd("0"))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=CalcLotsAuto()*PriseChanelWide();
    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,OrdLot(),0,0,Magik,Comm);
    if(IfOrdstoploss()>0)if(PriseDist(stoploss))OpenPosition("",1,OrdLot(),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=CalcLotsAuto()*PriseChanelWide();
    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,OrdLot(),0,0,Magik,Comm);
    if(IfOrdstoploss()<0)if(PriseDist(stoploss))OpenPosition("",1,OrdLot(),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=CalcLotsAuto()*PriseChanelWide();
    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,OrdLot(),0,0,Magik,Comm);
    if(IfOrdstoploss()>0)if(PriseDist(stoploss))OpenPosition("",1,OrdLot(),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()){   
    if(arrow){
      SetArrow("Ama1_",4,1,1,AMA(IndSet1,30,9,25,150,Tf,1),White);
      SetArrow("Ama2_",4,1,1,AMA(IndSet1+IndSet2,30,9,25,150,Tf,1),Red);
    }  
  }  
}  
return;}
double gPorog,gRes1,gRes2,gRes3;
//+----------------------------------------------------------------------------+
// Òåñòîâàÿ èíôîðìàöèÿ                                                         |
//-----------------------------------------------------------------------------+ 
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="";
if(LockMode==0)LM=" FullAuto";
if(LockMode==1)LM=" FlatMode";
if(LockMode==2)LM=" TrandMode";
if(LockMode==3)LM=" ContrTrand";
string Stl;
if(CloseLock){Stl="TRUE";}else{ Stl="FALSE";}
Comment(
        "Balanse              =",DoubleToStr(AccountBalance()+GrossProfit(),1),"\n",
        "CurrDrdn            =",GrossProfit(-1),"\n",
        "MaxDrdn             =",maxdrdn,"\n",
        "CurrProfit            =",GrossProfit(1),"\n",
        "MaxProfit            =",maxprofit,"\n",
        "OpenOrders        =",OrdersTotal(),"\n",
        "MaxOpenOrd      =",maxord,"\n",
        "TotalOrders        =",OrdersTotal()+OrdersHistoryTotal(),"\n",
        "TakeProfit          =",takeprofit,"\n",
        "stoplos               =",stoploss,"\n",
        "LockMode           =",LockMode,LM,"\n",
        "CloseLock =",Stl,"\n",
        "PriseChanelWide  =",PriseChanelWide(),"\n",
        "RelProfit =",histcount(),"\n",
        "Setporog =",F_T_treshold,"\n",
        "Porog =",gPorog,"\n",
        "Res1 =",gRes1,"\n",
        "Res2 =",gRes2,"\n",
        "Res3 =",gRes3
        );
return;        
}
//-----------------------------------------------------------------------------+
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(){
Sll=(MathAbs(iHigh(Symbol(),60,1 )-iLow(Symbol(),60,1) )/Point
    +MathAbs(iHigh(Symbol(),60,24)-iLow(Symbol(),60,24))/Point
    +MathAbs(iHigh(Symbol(),60,48)-iLow(Symbol(),60,48))/Point
    +MathAbs(iHigh(Symbol(),60,72)-iLow(Symbol(),60,72))/Point
    +MathAbs(iHigh(Symbol(),60,96)-iLow(Symbol(),60,96))/Point)/5;  
//if(LockMode==2){Sll=Sll*2;}         
Tpp=(MathAbs(iOpen(Symbol(),60,1 )-iClose(Symbol(),60,1) )/Point
    +MathAbs(iOpen(Symbol(),60,24)-iClose(Symbol(),60,24))/Point
    +MathAbs(iOpen(Symbol(),60,48)-iClose(Symbol(),60,48))/Point
    +MathAbs(iOpen(Symbol(),60,72)-iClose(Symbol(),60,72))/Point
    +MathAbs(iOpen(Symbol(),60,96)-iClose(Symbol(),60,96))/Point)/5/2; 
//if(LockMode==2){Tpp=Tpp*2;}    
return;
}
//-----------------------------------------------------------------------------+
// Áåçóáûòîê                                                                   |
//-----------------------------------------------------------------------------+
void WL(int min=0){
if(min==0)return;
if(OrdersTotal()<1)return;
if(OrdersTotal()>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;
            }
          }
          }
        }
      }
    }
  }
}              
return;          
}
//-----------------------------------------------------------------------------+
void FirstTrade(){int period=(stoploss+takeprofit)/2;double Ma;static int napr=0;
if(OnBar)if(PrewTime==iTime(NULL,Tf,0)) return(0);
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;
res[1]=(Ama1[1]-Ama2[1])/Point;
res[2]=(Ama1[2]-Ama2[2])/Point;
gPorog=res[0]-res[1];
gRes1=res[0];
gRes2=res[1];
gRes3=res[2];
if(IsTesting()){
  if(TestInfo){
    arrow=false;
    SetArrow("Ama1_",4,1,1,AMA(IndSet1,30,9,25,150,Tf,1),White);
    SetArrow("Ama2_",4,1,1,AMA(IndSet1+IndSet2,30,9,25,150,Tf,1),Red);
    arrow=true;
  }  
}  
//-----------------------------------------+
//  Îïðåäåëèòåëüìîäåëè ïîâåäåíèÿ           |
//-----------------------------------------+ 
if(FullAuto){
  if(Ama1[0]==Ama1[1]&&Ama1[1]==Ama1[2]){
    if(res[0]==res[1]&&res[1]==res[2]){LockMode=1;}
  }else{
    if(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]){
        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]){
        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")+"Pc.";
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")+"Pc.";
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=3){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()>Time[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);      
}
//+----------------------------------------------------------------------------+
// Äåòåêòîð Ëîòà ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà                              |
//-----------------------------------------------------------------------------+
double OrdLot(){return(OrderLots());}
//+----------------------------------------------------------------------------+
// Äåòåêòîð äîñòèæåíèÿ óðîâíÿ âèðò ñòîïà äëÿ ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà  |
//-----------------------------------------------------------------------------+
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);
  }
}
//+----------------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains open prices of each bar
Series array that contains close prices for each bar
Series array that contains open time of each bar


Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders
Checks for the total of closed orders
It can change open orders parameters, due to possible stepping strategy
It Closes Orders by itself
It automatically opens orders when conditions are reached

Other Features:


It plays sound alerts

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:1.34 Total Net Profit:454.35

BackTest : USDCHF on H1

From 2009-12-01 to 2010-01-01 Profit Factor:1.49 Total Net Profit:766.58

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:1.24 Total Net Profit:460.40

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:2.61 Total Net Profit:1557.80

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:2.06 Total Net Profit:2873.98

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:1.45 Total Net Profit:3346.87

BackTest : USDCAD on H1

From 2009-01-01 to 2010-01-01 Profit Factor:1.38 Total Net Profit:61264.87

BackTest : EURUSD on H1

From 2010-03-01 to 2010-03-27 Profit Factor:1.44 Total Net Profit:714.11

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-04-16 Profit Factor:0.53 Total Net Profit:-10956.53

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:1.52 Total Net Profit:1134.42

Request Backtest for Lock&&PipsingXR_2009


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: