//+------------------------------------------------------------------+
//|                                                   ZZ_Scalper.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "#Copyright © 2008, XrustSolution.#"
#property link      "#http://www.xrust.ucoz.net#"
#include <stdlib.mqh>
//-------------------------------------------------------------------+
extern string a="ÎÑÍÎÂÍÛÅ ÏÀÐÀÌÅÒÐÛ ÑÎÂÅÒÍÈÊÀ";
extern string b="Ìàêñèìàëüíîå êîëè÷åñòâî îðäåðîâ=20";
extern int       MaxOrd_1=17;
extern string c="Ñòîïëîññ: äëÿ ðåæèìà ïèïñîâêè =0";
extern int       StopLoss=0;
extern string d="Òåéêïðîôèò: äëÿ ðåæèìà ïèïñîâêè=0";
extern int       TakeProfit=0;
extern string e="Ñòàðòîâûé Ëîò ñîâåòíèêà=0,01";
extern double    StartLots=0.01;
extern string g="Ðàçðåøåíèå íà àâòîîïðåäåëåíèå ëîòà";
extern bool      AutoLot=true;
extern string ha="Ïðîöåíò ðèñêà íà îäíó ñäåëêó";
extern double    Risk=1;
extern string ga="Ïðîôèò ïðè êîòîðîì çàêðîåòñÿ ïà÷êà îðäåðîâ=0";
extern double    MInProfit=3;
extern string í="Ïàóçà ìåæäó îòêðûòèåì îðäåðîâ â ìèíóòàõ=10";
extern int       MinTradePause=15;
extern string j="Øàã òðàëà îäèíî÷íîãî îðäåðà â ïóíêòàõ=5";
extern int       TralStep=5;
extern string k="Øàã òðàëà ïî Ýêâèòè ñ÷åòà â âàëþòå äåïîçèòà=5";
extern int       EqvTralStep=5;
extern string l="ÐÀÇÐÅØÅÍÈß È ÔËÀÃÈ";
extern string m="Ðàçðåøåíèå íà îãðàíè÷åíèå òîðãîâëè ïî âðåìåíè";
extern bool      TradeOfTime=false;
extern string n="×àñ íà÷àëà òîðãîâëè";
extern int       StartTradeHour=22;
extern string o="×àñ êîíöà òîðãîâëè";
extern int       EndTradeHour=8;
extern string p="Ðàçðåøåíèå íà âûâîä èíôîðìàöèè â îñíîâíîå îêíî";
extern bool      ShowComment=true;
extern string r="Ðàçðåøåíèå íà ðàáîòó ñ íåäîñòàòî÷íîé ìàðæîé";
extern bool      MargineVarning=true;
//----Variables for KimIV funcions ---------------------------------+
bool NumberOfTry=3,UseSound=false,print=false;
string NameFileSound = "expert.wav";   // Íàèìåíîâàíèå çâóêîâîãî ôàéëà
color  clOpenBuy     = Blue;           // Öâåò çíà÷êà îòêðûòèÿ Buy
color  clOpenSell    = Red;            // Öâåò çíà÷êà îòêðûòèÿ Sell
bool   MarketWatch=false;
bool   gbDisabled    = False;          // Áëîêèðîâêà
int BuyMagic1=2891,BuyMagic2=2892,BuyMagic3=2893;
int SellMagic1=73351,SellMagic2=73352,SellMagic3=73353;
static int PrevTime=0;double Lot;
double MinLot, MaxLot, MarginMinLot;   
int    MinLotDgts,period,GrossPeriod,GrossTrand=0;
int       Slippage=3;
//------------------------------------------------------------------+
static double StartDepo, gEqviti;
static double gPriseAp,gPriseDn,gMidPrise;
int gFrChSize,tP;
static bool asd=false;
int BuySell_1=0,BuySell_2=0,BuySell_3=0;
int gCountBuy_1=1,gCountSell_1=1;
double lot;
static string gTime;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
void init()
  {
  StartDepo = AccountBalance();
  if(StartLots<MarketInfo(Symbol(),MODE_MINLOT)){
    StartLots=MarketInfo(Symbol(),MODE_MINLOT);
  }  
  lot=StartLots;
   return;
  }
//+------------------------------------------------------------------+
  void deinit(){Comment("  ");return(0);} //deinit                   |
//+------------------------------------------------------------------+
int start()
  {
   if(AutoLot){
     if(MaxOrd_1>StartDepo/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto()*2)){
       MaxOrd_1=(StartDepo/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto()*2));
     }
   }
   if(MargineVarning){if(Varning()){Sleep(10000);return(0);}}
   if(!IsDemo()&&!IsOptimization()&&!IsTesting()){
     if(AccountNumber()!=38325){Comment("Bad Account!!!");Sleep(500);Comment("  ");return(0);}
   }  
   Info();
   if(EcvitiTral3(Risk)){return(0);}
   BuySell_1=0;BuySell_2=0;BuySell_3=0;
//----
  OneOrdTral(BuyMagic1,TralStep);
  OneOrdTral(SellMagic1,TralStep);
  if(NevBar()){
  
  CloseBy();
  DelOppositeOrder();
  DelVs();
  lot=StartLots;
  if(GrPorfit()>MInProfit){CloseAll();}
    if(TradeTime()){
      IfZZ();
      if(BuySell_1<0){
        if(CountOpOrd("0")<MaxOrd_1&&TimeOfTrade(BuyMagic1)&&OneOrdTral(BuyMagic1,TralStep)){
          lot=StartLots*gCountBuy_1;
          if(lot<StartLots){lot=StartLots;}
          if(AutoLot){lot=CalcLotsAuto();}
          if(PorfitBuySell(1)>=PorfitBuySell(0)){OpenPosition("",0,lot,StopLoss,TakeProfit,BuyMagic1);}
          if(PorfitBuySell(1)<PorfitBuySell(0)){OpenPosition("",1,lot,StopLoss,TakeProfit,BuyMagic1);}
        }
      }
      if(BuySell_1>0){
        if(CountOpOrd("0")<MaxOrd_1&&TimeOfTrade(SellMagic1)&&OneOrdTral(SellMagic1,TralStep)){
          lot=StartLots*gCountSell_1;
          if(lot<StartLots){lot=StartLots;}
          if(AutoLot){lot=CalcLotsAuto();}
          if(PorfitBuySell(0)>=PorfitBuySell(1)){OpenPosition("",1,lot,StopLoss,TakeProfit,SellMagic1);}
          if(PorfitBuySell(0)<PorfitBuySell(1)){OpenPosition("",0,lot,StopLoss,TakeProfit,BuyMagic1);}
        }
      }
    }
  }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Ðàñ÷åò ëîòà ñîîòâ ðèñêó è áàëàíñó                                |
//+------------------------------------------------------------------+
double CalcLotsAuto()
{static double Sredstva;
if(OrdersTotal()<1){Sredstva=AccountBalance();}
double LotOpt,LotNeOpt,Zalog;
   RefreshRates();
   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(Risk<0)Risk=0;
   if(Risk>100)Risk=100; 
   if(StepLot==0.01){int step=2;}else{step=1;}  
//---------------------------     
   Zalog=(Balans*(Risk/100));
   LotOpt=NormalizeDouble((Zalog/1000),step);
   if(LotOpt>LotMax)LotOpt=LotMax;
   if(LotOpt<LotMin)LotOpt=LotMin;
   //if(Marga<Sredstva/2){return(0);}
   return(LotOpt);
}  
//-----------------------------------------------------------------------------+
// Âûâîäèò èíôîðìàöèþ íà ýêðàí                                                 |
//-----------------------------------------------------------------------------+
void Info(){
Comment("Âñåãî Ñðåäñòâ íà ñ÷åòó       ="+(DoubleToStr(AccountBalance()+PorfitBuySell(0)+PorfitBuySell(1),1))+"$\n"+
        "Ñâîáîäíûõ ñðåäñòâ              ="+(DoubleToStr(AccountFreeMargin(),1))+"$\n"+
        "Òåêóùàÿ ïðèáûëü                 ="+(DoubleToStr(PorfitBuySell(0)+PorfitBuySell(1),1))+"$\n"+
        "Ïðèáûëü ñ íà÷àëà òîðãîâëè  ="+(DoubleToStr(AccountBalance()-StartDepo,1))+"$\n"+
        "Ðàçðåøåíî îðäåðîâ ê îòêðûòèþ ="+MaxOrd_1+"øò\n"+
        "Îòêðûòî îðäåðîâ              ="+CountOpOrd("0")+"øò\n"+
        gTime
        );
return;
}
//-----------------------------------------------------------------------------+
// Âûâîäèò ïðåäóïðåæäàþùåå ñîîáùåíèå                                           |
//-----------------------------------------------------------------------------+
bool Varning(){int ord;double depo;
if(AutoLot){
  if((MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto()*MaxOrd_1*2)>StartDepo){
      depo=MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto()*MaxOrd_1*2;
      ord=StartDepo/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*CalcLotsAuto()*2);
        Alert("ÍÅÄÎÑÒÀÒÎ×ÍÎ ÑÐÅÄÑÒ ÍÀ Ñ×ÅÒÅ"+"\n"+
        "Äëÿ òàêîãî êîëè÷åñòâà îðäåðîâ íåîáõîäèìî"+"\n"+
        "Ñòàðòîâûé Äåïîçèò ="+depo+" $\n"+
        "íà Âàøè ñðåäñòâà ìîæíî îòêðûòü "+ord+" Îðäåðîâ"+"\n"+
        "Ïîïîëíèòå Âàø ñ÷åò ïîæàëóéñòà"+"\n"+
        "èëè óìåíüøèòå êîëè÷åñòâî îðäåðîâ"+"\n"+
        "èëè óìåíüøèòå òîðãóåìûé ëîò"+"\n"+
        "èëè îòêëþ÷èòå ñèãíàëèçàöèþ");
    return(true);
  }
} 
if(!AutoLot){
  if((MarketInfo(Symbol(),MODE_MARGINREQUIRED)*StartLots*MaxOrd_1*2)>StartDepo){
      depo=MarketInfo(Symbol(),MODE_MARGINREQUIRED)*StartLots*MaxOrd_1*2;
      ord=StartDepo/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*StartLots*2);
        Alert("ÍÅÄÎÑÒÀÒÎ×ÍÎ ÑÐÅÄÑÒ ÍÀ Ñ×ÅÒÅ"+"\n"+
        "Äëÿ òàêîãî êîëè÷åñòâà îðäåðîâ íåîáõîäèìî"+"\n"+
        "Ñòàðòîâûé Äåïîçèò ="+depo+" $\n"+
        "íà Âàøè ñðåäñòâà ìîæíî îòêðûòü "+ord+" Îðäåðîâ"+"\n"+
        "Ïîïîëíèòå Âàø ñ÷åò ïîæàëóéñòà"+"\n"+
        "èëè óìåíüøèòå êîëè÷åñòâî îðäåðîâ"+"\n"+
        "èëè óìåíüøèòå òîðãóåìûé ëîò"+"\n"+
        "èëè îòêëþ÷èòå ñèãíàëèçàöèþ");
    return(true);
  }
}
return(false);
}
//-----------------------------------------------------------------------------+
// Ôóíêöèÿ êîíòðîëÿ âðåìåíè òîðãîâëè                                           |
//-----------------------------------------------------------------------------+
bool TradeTime(){
if(!TradeOfTime){
gTime="ÐÀÁÎÒÀÅÌ ÁÅÇ ÏÅÐÅÐÛÂÎÂ";
return(true);}
if(TimeDayOfWeek(TimeCurrent())==5){StartTradeHour=0;}
if(TimeDayOfWeek(TimeCurrent())==1){StartTradeHour=1;}
if(StartTradeHour<EndTradeHour){
  if(TimeHour(TimeCurrent())>=StartTradeHour&&TimeHour(TimeCurrent())<EndTradeHour
    ||(CountOpOrd("0")+CountOpOrd("1"))){
    gTime=StringConcatenate("Äîêîíöà òîðãîâîé ñåññèè :",DoubleToStr((EndTradeHour-TimeHour(TimeCurrent())),0)," ×àñîâ");
    return(true);}}
if(StartTradeHour>EndTradeHour){
  if(TimeHour(TimeCurrent())>=StartTradeHour||TimeHour(TimeCurrent())<EndTradeHour
    ||(CountOpOrd("0")+CountOpOrd("1"))){
    gTime=StringConcatenate("Äîêîíöà òîðãîâîé ñåññèè :",DoubleToStr((EndTradeHour-TimeHour(TimeCurrent())),0)," ×àñîâ");
    return(true);}}    
gTime=StringConcatenate("ÎÒÄÛÕÀÅÌ ÄÎ : ",StartTradeHour,": 00");    
return(false);
}
//-----------------------------------------------------------------------------+
// Óñëîâèÿ âõîäà â ðûíîê                                                       |
//-----------------------------------------------------------------------------+
int IfZZ(){
if(iClose(Symbol(),15,1)>iOpen(Symbol(),15,0)){
   BuySell_1=-1;
   gCountBuy_1++;
   gCountSell_1=1;
return(1);}
if(iClose(Symbol(),15,1)<iOpen(Symbol(),15,0)){
   BuySell_1=1;
   gCountBuy_1=1;
   gCountSell_1++; 
return(-1);}
BuySell_1=0;
return(0);
}
//+----------------------------------------------------------------------------+
// Óñðåäíåíèå óäàëåíèåì                                                        +
//-----------------------------------------------------------------------------+
void DelVs(){int tick1=0,tick2=0,typ;double pr1=0,pr2=0;
if(OrdersTotal()<2){return;}
   for(int n=0;n<OrdersTotal();n++){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       if(IfOrder(0)){
         tick1=OrderTicket();
         pr1=OrderProfit();
         if(OrderType()==0){typ=1;}
         if(OrderType()==1){typ=0;}
           if(pr1>0){
              for(int x=OrdersTotal()+1;x>=0;x--){
                if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)){  
                  if(IfOrder(0,typ)){
                    tick2=OrderTicket();
                    pr2=OrderProfit();
                      if(pr1-pr2==0){
                        Comment("DelVs");
                        if(tick2!=0){del(tick2);}
                        if(tick1!=0){del(tick1);}
                        return;
                      }
                  }
                }
              }               
           }
       } 
     }
   }
return;
}
//+----------------------------------------------------------------------------+
// Âñòðå÷íîå çàêðûòèå                                                          +
//-----------------------------------------------------------------------------+
void CloseBy(){
double profit1=0, profit2=0;
int i, n, tip, tip2 ,ticket1=0, ticket2=0;
if(OrdersTotal()<2){return;}
  for(n=0;n<OrdersTotal();n++){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
      if(IfOrder("0")){
        if(OrderProfit()<0){
          tip=OrderType();
          profit1=OrderProfit();
          ticket1=OrderTicket();
          if(tip==1){tip2=0;}
          if(tip==0){tip2=1;}
          for(n=0;n<OrdersTotal();n++){
            if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
              if(IfOrder("0",tip2)){
                if((OrderProfit()+profit1)>=0){
                  if(ticket1!=0&&OrderTicket()!=0){OrderCloseBy(ticket1,OrderTicket(),White);}
                }
              }
            }
          }    
        }
      }
    }
  }      
}
//+----------------------------------------------------------------------------+
// Âîçâðàùàåò ñàìûé äàëüíèé îðäåð                                              +
//-----------------------------------------------------------------------------+
double OrderDistanse(double prise=0){double gprise=0;int n;
if(OrdersTotal()<2){return;}
 if(prise==0){
   for(n=0;n<OrdersTotal();n++){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       if(IfOrder("0")){
         if(OrderProfit()<0){
           if(MathAbs(Bid-OrderOpenPrice())>prise){
             prise=OrderOpenPrice();
           }
         }
       }
     }
   }
 return(prise);
 } 
 if(prise!=0){
   for(n=0;n<OrdersTotal();n++){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       if(IfOrder("0")){
         if(OrderProfit()<0){
           if(MathAbs(Bid-OrderOpenPrice())>gprise&&(OrderOpenPrice()!=prise)){
             gprise=OrderOpenPrice();
           }
         }
       }
     }
   }
 return(gprise);
 } 
 return(0);
}
//+----------------------------------------------------------------------------+
// Åùå îäíî óñðåäíåíèå 2                                                       +
//-----------------------------------------------------------------------------+
void DelOppositeOrder(){
double prise=0,profit=0,Grprofit=0;
int n, tick=0,tip=-1,tip2=-1,countord=0;
int ticket[100];
//for(n=0;n<CountOpOrd(0);n++){
   Grprofit=0;
   for(n=0;n<OrdersTotal();n++){
   if(OrderDistanse(prise)!=0){
     prise=OrderDistanse(prise);
     tick=OrderTicket();
     profit=OrderProfit();
     tip=OrderType();
   }
if(tip==1){tip2=0;}
if(tip==0){tip2=1;}     
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       if(IfOrder("0",tip2)){
         if(OrderProfit()>0){
           Grprofit=Grprofit+OrderProfit();
           ticket[countord]=OrderTicket();
           countord++;
         }
       }
     }
   }        
           if(profit+Grprofit>MInProfit){
             ArrayResize(ticket,countord+1);
             double profit2=0;
             if(OrderSelect(tick,SELECT_BY_TICKET,MODE_TRADES)){
               if(OrderCloseTime()==0){
                 for(int i=0;i<CountOpOrd("0")+1;i++){
                   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
                     if(OrderProfit()>profit2){
                       if(OrderType()==tip2){
                         if(OrderCloseTime()==0){
                           profit2=OrderProfit();
                           int ticket2=OrderTicket();
                         }
                       }
                     }
                   }   
                 }
                 if(ticket2!=0&&tick>0){OrderCloseBy(tick,ticket2,White);}
                 for(i=0;i<countord+1;i++){
                   if(OrderSelect(ticket[i],SELECT_BY_TICKET,MODE_TRADES)){
                     if(OrderCloseTime()==0){del(OrderTicket());}
                   }
                 }
                 return;               
               }
             }
           }
}
//+------------------------------------------------------------------+
//|Òðàë ïî ýêâèòè                                                    |
//+------------------------------------------------------------------+
void EcvitiTral(){int i, n ,x;double Gpr=0;
if(OrdersTotal()<1){gEqviti=AccountBalance();return;}
  for(i=0;i<OrdersTotal();i++){
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
      Gpr=Gpr+OrderProfit()+OrderSwap()+OrderCommission();
    }
  }
  if((AccountBalance()+Gpr)-EqvTralStep>gEqviti){gEqviti=gEqviti+EqvTralStep;}
  else{if(gEqviti>AccountBalance()&&gEqviti>StartDepo){
    CloseAll();if(OrdersTotal()<1){gEqviti=AccountBalance();return;}}}
return;
}
//+------------------------------------------------------------------+
//|Òðàë ïî ýêâèòè                                                    |
//+------------------------------------------------------------------+
bool EcvitiTral3(double EqvTralStep){
if(OrdersTotal()<1){gEqviti=AccountBalance();return(false);}
if(AccountEquity()>AccountBalance()){
  if(AccountEquity()>(gEqviti+(gEqviti/100*EqvTralStep))){
    gEqviti=gEqviti+(gEqviti/100*EqvTralStep);
  }
  if(AccountEquity()<gEqviti){CloseAll();return(false);}
}
return(false);
} 
//+------------------------------------------------------------------+
//| ïðîâåðÿåò ðûíî÷íûé îðäåð íà ïðèíàäëåæíîñòü ñîãëàñíî óñëîâèÿì     |
//+------------------------------------------------------------------+
bool IfOrder(string Sy="",int Typ=-1,int Magik=-1){
if(Sy=="0"){Sy=Symbol();}
  if(OrderSymbol()==Sy||Sy==""){
    if(OrderType()==Typ||Typ==(-1)){
      if(OrderMagicNumber()==Magik||Magik==(-1)){
        return(true);
      }
    }
  }
 return(false); 
}
//+------------------------------------------------------------------+
//| Ïîäñ÷èòûâàåò êîëè÷åñòâî îòêðûòûõ îðäåðîâ ñîãëàñíî óñëîâèÿì       |
//+------------------------------------------------------------------+
int CountOpOrd(string Sy="",int Typ=-1,int Magik=-1){int count=0;
if(Sy=="0"){Sy=Symbol();}
  for(int i=0;i<OrdersTotal();i++){
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
      if(OrderSymbol()==Sy||Sy==""){
        if(OrderType()==Typ||Typ==(-1)){
          if(OrderMagicNumber()==Magik||Magik==(-1)){
            count++;
          }
        }
      }
    }
  }
 return(count);  
}
//+----------------------------------------------------------------------------+
// Ïîäñ÷èòûâàåò Îáùóþ íå ðåàëèçîâàííóþ ïðèáûëü íà äàííîì èíñòðóìåíòå           +
//-----------------------------------------------------------------------------+
double GrPorfit(){double grpr=0;
if(OrdersTotal()<2){return(0);}
   for(int n=0;n<OrdersTotal();n++){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       if(OrderSymbol()==Symbol()){grpr=grpr+OrderProfit();}
     }    
   } 
return(grpr);
}
//+----------------------------------------------------------------------------+
// Ïîäñ÷èòûâàåò Îáùóþ íå ðåàëèçîâàííóþ ïðèáûëü íà äàííîì èíñòðóìåíòå           +
//-----------------------------------------------------------------------------+
double PorfitBuySell(int tip){double grpr=0;
if(OrdersTotal()<1){return(-1);}
   for(int n=OrdersTotal()+1;n>=0;n--){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       if(IfOrder("0",tip)){grpr=grpr+OrderProfit();}
     }    
   } 
return(grpr);
}
//+----------------------------------------------------------------------------+
// Çàêðûâàåò âñå îðäåðà íà äàííîì èíñòðóìåíòå                                  +
//-----------------------------------------------------------------------------+
void CloseAll(){
 //if(IfOrder(0)==true){
   for(int n=OrdersTotal()+1;n>=0;n--){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
       if(IfOrder("0")){del(OrderTicket());}
     }    
   } 
 //}
return;    
}
//+----------------------------------------------------------------------------+
// Çàäàåò ïàóçó ìåæäó óñòàíîâêàìè îðäåðîâ                                      +  
//-----------------------------------------------------------------------------+
bool TimeOfTrade2(int mag){int count=0;
if(OrdersTotal()<1){return(true);}
  for(int n=0;n<OrdersTotal();n++){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
      if(OrderSymbol()==Symbol()){
        if(OrderOpenTime()>count){count=OrderOpenTime();}
      }
    }    
  } 
if((TimeCurrent()-count)>((MinTradePause)*60)){return(true);}
return(false);
}
//+----------------------------------------------------------------------------+
// Çàäàåò ïàóçó ìåæäó óñòàíîâêàìè îðäåðîâ                                      +  
//-----------------------------------------------------------------------------+
bool TimeOfTrade(int mag){int count=0,distanse=0;double OpPrs=0;
if(OrdersTotal()<1){return(true);}
  for(int n=0;n<OrdersTotal();n++){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
      if(OrderSymbol()==Symbol()){
        if(OrderOpenTime()>count){count=OrderOpenTime();OpPrs=OrderOpenPrice();}
      }
    }    
  } 
if(OpPrs!=0){distanse=(MathAbs(OpPrs-Bid)/Point)/20;}  
if((TimeCurrent()-count)>((MinTradePause*(distanse+1))*60)){return(true);}
return(false);
}
//+----------------------------------------------------------------------------+
// Òðàë îäíîãî îðäåðà                                                          +  
//-----------------------------------------------------------------------------+
bool OneOrdTral(int mag,double step){int n,count=0,StPr=0;static int PrewStPr=0;
if(OrdersTotal()<1){return(true);}
  for(n=OrdersTotal()+1;n>=0;n--){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
      if(IfOrder("0",-1,mag)){count++;}
    }    
  }  
if(count>1){return(true);}  
if(count==1){
  for(n=OrdersTotal()+1;n>=0;n--){
    if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){  
      if(IfOrder("0",-1,mag)){
        //Comment(OrderProfit());
        if((OrderProfit()*OrderLots()*1000*Bid)>step){
          StPr=(OrderProfit()*OrderLots()*1000*Bid)/step;
          if(StPr>=PrewStPr){PrewStPr=StPr;}
          else{del(OrderTicket());PrewStPr=0;return(true);}
        }
      }
    }    
  }    
}
if(OrderProfit()<0){return(true);}
return(false);   
}
//-----------------------------------------------------------------------------+
// Ôóíêöèÿ êîíòðîëÿ íîâîãî áàðà                                                |
//-----------------------------------------------------------------------------+
bool NevBar(){
   static int PrevTime=0;
   if (PrevTime==Time[0]) return(false);
   PrevTime=Time[0];
   return(true);} 
//-----------------------------------------------------------------------------+
//Óäàëÿåò ðûíî÷íûé îðäåð ñ óêàçàííûì åé òèêåòîì                                |
//+----------------------------------------------------------------------------+
void del(int ticket){int err;
 for(int i=0;i<1;i++){
   GetLastError();//îáíóëÿåì îøèêó
   OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
   string symbol = OrderSymbol();
   if(OrderType()==OP_BUY){RefreshRates();
     double prise = MarketInfo(symbol,MODE_BID);
     if(!OrderClose(ticket,OrderLots(),prise,3,Green)){err = GetLastError();}}
   if(OrderType()==OP_SELL){RefreshRates();
     prise = MarketInfo(symbol,MODE_ASK);
     if(!OrderClose(ticket,OrderLots(),prise,3,Green)){err = GetLastError();}}
 if(err == 0){PlaySound("expert.wav");break;} 
 if(err != 0){PlaySound("timeout.wav");Print("Error for Close Funtion =",err);} 
 while(!IsTradeAllowed()){Sleep(5000);}// åñëè ðûíîê çàíÿò òî ïîäîæäåì 5 ñåê 
 if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
 } 
}
//-----------------------------------------------------------------------------+
//___________________ÊÈÌÓ_______ÐÅÑÏÅÊÒ________È_____ÓÂÀÆÓÕÀ___________________|
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                     |
//|  Îïèñàíèå : Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë                           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    m - òåêñò ñîîáùåíèÿ                                                     |
//+----------------------------------------------------------------------------+
void Message(string m) {
  //Comment(m);
  if (StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 28.11.2006                                                     |
//|  Îïèñàíèå : Ìîäèôèêàöèÿ îäíîãî ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà.           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    pp - öåíà óñòàíîâêè îðäåðà                                              |
//|    sl - öåíîâîé óðîâåíü ñòîïà                                              |
//|    tp - öåíîâîé óðîâåíü òåéêà                                              |
//|    ex - äàòà èñòå÷åíèÿ                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  bool   fm;
  color  cl=White;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
  //if(OrderType()==0||OrderType()==2||OrderType()==4){if(Ask-stoplevel<sl||Bid+stoplevel>tp){return;}}
  //if(OrderType()==1||OrderType()==3||OrderType()==5){if(Bid+stoplevel>sl||Ask-stoplevel<tp){return;}}
  //if(MathAbs(sl-Ask)<stoplevel||MathAbs(tp-Ask)<stoplevel){return;}
  if(pp==op&&sl==os&&tp==ot){return;}
  if ((sl==os&&(os!=0||sl!=0))&& (tp==ot&&(ot!=0||tp!=0))) {return;}
    for (it=1; it<=NumberOfTry; it++) {
      //if ((!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl);
      if (fm) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        if(print){Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
                  Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
                        "  op="+GetNameOP(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);}
        Sleep(1000*10);
        //if(er==130){del(OrderTicket());}
      }
    }
  //}
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 06.03.2008                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ ïîçèöèé                          |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//|    ot - âðåìÿ îòêðûòèÿ             ( 0   - ëþáîå âðåìÿ îòêðûòèÿ)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè                      |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("BuyLimit");
    case OP_SELLLIMIT: return("SellLimit");
    case OP_BUYSTOP  : return("BuyStop");
    case OP_SELLSTOP : return("SellStop");
    default          : return("Unknown Operation");
  }
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 10.04.2008                                                     |
//|  Îïèñàíèå : Îòêðûâàåò ïîçèöèþ ïî ðûíî÷íîé öåíå.                            |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (NULL èëè "" - òåêóùèé ñèìâîë)          |
//|    op - îïåðàöèÿ                                                           |
//|    ll - ëîò                                                                |
//|    sl - óðîâåíü ñòîï                                                       |
//|    tp - óðîâåíü òåéê                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
void OpenPosition(string sy, int op, double ll, double Sl=0, double Tp=0, int mn=0) {
  color    clOpen;
  datetime ot;
  double   pp, pa, pb, tp ,sl;
  int      dg, err, it, ticket=0;
  string   lsComm="";
  
  
  if (sy=="" || sy=="0") sy=Symbol();
  int stoplevel=MarketInfo(sy,MODE_STOPLEVEL);
  int spread=MarketInfo(sy,MODE_SPREAD);
  if(Tp!=0&&Tp<stoplevel+spread){Tp=stoplevel;}  
  if (op<1){
   if (Sl>0) {sl=MarketInfo(Symbol(),MODE_ASK)-Sl*Point; }else {sl=0;}
   if (Tp>0) {tp=MarketInfo(Symbol(),MODE_ASK)+Tp*Point; }else{ tp=0;}
  }else{
   if (Sl>0) {sl=MarketInfo(Symbol(),MODE_BID)+Sl*Point; }else{ sl=0;}
   if (Tp>0) {tp=MarketInfo(Symbol(),MODE_BID)-Tp*Point;} else {tp=0;}}  
   
  if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
  for (it=1; it<=NumberOfTry; it++) {
    if (IsStopped()) {
      Print("OpenPosition(): Îñòàíîâêà ðàáîòû ôóíêöèè");
      break;}
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    dg=MarketInfo(sy, MODE_DIGITS);
    pa=MarketInfo(sy, MODE_ASK);
    pb=MarketInfo(sy, MODE_BID);
    if (op==OP_BUY) pp=pa; else pp=pb;
    pp=NormalizeDouble(pp, dg);
    ot=TimeCurrent();
    if (MarketWatch)
      ticket=OrderSend(sy, op, ll, pp, Slippage, 0, 0, lsComm, mn, 0, clOpen);
    else
      ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if (pa==0 && pb==0) Message("Ïðîâåðüòå â Îáçîðå ðûíêà íàëè÷èå ñèìâîëà "+sy);
      // Âûâîä ñîîáùåíèÿ îá îøèáêå
      if(print){
      Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
            " pp=",pp," sl=",sl," tp=",tp," mn=",mn);}
      // Áëîêèðîâêà ðàáîòû ñîâåòíèêà
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Äëèòåëüíàÿ ïàóçà
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
      }
      if (err==140 || err==148 || err==4110 || err==4111) break;
      if (err==141) Sleep(1000*100);
      if (err==145) Sleep(1000*17);
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      if (err!=135) Sleep(1000*7.7);
    }
  }
  if (MarketWatch && ticket>0 && (sl>0 || tp>0)) {
    if (OrderSelect(ticket, SELECT_BY_TICKET)) ModifyOrder(-1, sl, tp);
  }
}
//+----------------------------------------------------------------------------+
             
            
            
            
Comments