//+-----------------------------------------------------------------+
//|                                                   FletCanal.mq4 |
//+-----------------------------------------------------------------+
//| HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH |
//| H\    \               http://wsforex.ru/               /    / H |
//| H )----)----------------------------------------------(----(  H |
//| H/    /   Ïèøó òîðãîâûå ñèñòåìû íà çàêàç: wsforex.ru   \    \ H |
//| HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH |
//+-----------------------------------------------------------------+
#property copyright "wsforex@list.ru"
#property link      "http://wsforex.ru/"
//+-----------------------------------------------------------------+
//| Ðàçðàáîòêà : Ñåðãåé.Æ  - ìîé ñàéò -  "http://wsforex.ru/"       |
//+-----------------------------------------------------------------+
extern bool    PosBuy           = True; // Ôóíêöèÿ îòêëþ÷åíèÿ ïîçèöèè BUY
extern bool    PosSell          = True; // Ôóíêöèÿ îòêëþ÷åíèÿ ïîçèöèè SELL
extern bool    ExpertTime       = True; // Èñïîëüçîâàòü ôóíêöèþ ðàáîòû ïî âðåìåíè True-âêë False-âûêë
extern string  TradeDay         = "1,2,3,4,5"; 
extern int     HourStart        = 0;    // Ñòàðò â ïîíåäåëüíèê 
extern int     HourStops        = 19;   // Ñòîï â ïÿòíèöó
extern int     Ea.Start         = 0;    // Åæåäíåâíûé ñòàðò ñîâåòíèêà
extern int     Ea.Stop          = 23;   // Åæåäíåâíûé ñòîï cîâåòíèêà
// -----
extern bool    MM               = True; // Âêëþ÷åíèå ôóíêöèè ìàíè-ìåíåäæìåíòà 
extern double  MaxRisk          = 1.0;  // Ðèñê áåð¸òñÿ ïðîöåíò îò ñâîáîäíûõ ñðåäñòâ
extern int     Kloss            = 0;    // Êîëè÷åñòâî óáûòî÷íûõ îðäåðîâ
extern int     LossMax          = 4;    // Ìàêñèìàëüíîå êîëè÷åñòâî óáûòî÷íûõ îðäåðîâ
extern double  MultiLoss        = 4.0;  // Ìíîæèòåëü ïîñëå óáûòî÷íîé ñäåëêè
extern int     KProfit          = 0;    // Êîëè÷åñòâî îðäåðîâ â èñòîðèè çàêðûòûõ ïî ÒÐ
extern int     ProfitMax        = 4;    // Ìàêñèìàëüíîå êîëè÷åñòâî îðäåðîâ â èñòîðèè çàêðûòûõ ïî ÒÐ
extern double  MultiProfit      = 2.0;  // Ìíîæèòåëü ïîñëå ïðèáûëüíîé ñäåëêè
// -----
extern int     StopLoss         = 0;    // Ñòîï ïðîñòîé åñëè StopLoss = 0 òî ðàáîòàåò äèíàìè÷åñêèé StopLoss
extern int     TakeProfit       = 0;    // Òåéêïðîôèò ïðîñòîé åñëè TakeProfit = 0 òî ðàáîòàåò äèíàìè÷åñêèé Òåéêïðîôèò
extern double  Lots             = 0.01; // Îáú¸ì ïîçèöèè
extern double  Dynamic.SL       = 1.0;  // StopLoss çàâèñèò îò øèðèíû êàíàëà
extern double  Dynamic.TP       = 1.0;  // Òåéêïðîôèò çàâèñèò îò øèðèíû êàíàëà
extern int     MaxOrder         = 5;    // Ìàêñèìàëüíîå îòêðûòèå ðûíî÷íûõ îðäåðîâ îäíîâðåìåííî 
//ìåíÿÿ ýòîò ïàðàìåòð ìû îãðàíè÷èâàåì êîëè÷åñòâî êàíàëîâ íàéäåííûõ ýêñïåðòîì 
extern int     Slippage         = 10;   // Ïðîñêàëüçûâàíèå öåíû
extern int     NumberOfTry      = 2;    // Êîëè÷åñòâî òîðãîâûõ ïîïûòîê
extern int     Otstup           = 0;    // Îòñòóï îò ãðàíèö êàíàëà
extern int     MagicNumber      = 777;  // Äëÿ êîíòðîëÿ ñâîèõ îðäåðîâ
// -----
extern string  Áëîê   ="  Íàñòðîéêè ôëýòà  ";
extern int     StdDevPer        = 46;   // Íàñòðîéêè èíäèêàòîðà
extern int     period           = 1;    // Ñãëàæèâàíèå èíäèêàòîðà
extern int     FletBars         = 2;    // Ìèíèìàëüíîå êîëè÷åñòâî áàðîâ
extern int     CanalMin         = 620;  // Ìèíèìàëüíàÿ øèðèíà êàíàëà
extern int     CanalMax         = 1050; // Ìàêñèìàëüíàÿ øèðèíà êàíàëà
// -----
extern bool    UseSound         = True;          // Èñïîëüçîâàòü çâóêîâûå ñèãíàëû
extern string  NameFileSound    = "expert.wav";  // Çâóê Îòêðûòèÿ ïîçèöèè 
extern string  SoundSuccess     = "ok.wav";      // Çâóê çàêðûòèÿ ïîçèöèè 
extern string  SoundError       = "timeout.wav"; // Çâóê Îøèáêè  
//+-----------------------------------------------------------------+
//| Ðàçðàáîòêà : Ñåðãåé.Æ  - ìîé ñàéò -  "http://wsforex.ru/"       |
//+-----------------------------------------------------------------+
extern bool    Trailing   = True;  // Áåç-óáûòîê
extern double  FiboTral   = 0.386; // Ñòàðîå çíà÷åíèå 0.873
//+-----------------------------------------------------------------+
//| Ðàçðàáîòêà : Ñåðãåé.Æ  - ìîé ñàéò -  "http://wsforex.ru/"       |
//+-----------------------------------------------------------------+
bool FlagPos;
int dg, lv, sp;
double Lot, pa, pb, po;
string Times,  symbol;
string ExpertName;
double MinBalance, MaxBalance;
bool flagup, flagdw, EaDisabled = False;
//+-----------------------------------------------------------------+
//| Ðàçðàáîòêà : Ñåðãåé.Æ  - ìîé ñàéò -  "http://wsforex.ru/"       |
//+-----------------------------------------------------------------+
int init()
  {
//----
   symbol = Symbol();
   ExpertName = WindowExpertName();
//----
   if (!IsTesting()) {
   if (IsExpertEnabled()) Message("\nÑîâåòíèê óñòàíîâëåí è áóäåò çàïóùåí ñëåäóþùèì òèêîì");
   else Message("\nÂíèìàíèå! îòæàòà êíîïêà íà âêëàäêå ñîâåòíèêè");
   }
//----
  return(0);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
void start(){
// -----
  RefreshRates(); 
  Times = "Âðåìÿ GMT - "+ TimeToStr(TimeCurrent()-3600, TIME_MINUTES|TIME_SECONDS);
  pb = MarketInfo(symbol,MODE_BID);
  pa = MarketInfo(symbol,MODE_ASK); 
  dg = MarketInfo(symbol,MODE_DIGITS);
  po = MarketInfo(symbol,MODE_POINT);
  lv = MarketInfo(symbol,MODE_STOPLEVEL)+MarketInfo(symbol,MODE_SPREAD);
// -----           
  Comment("\nÑîâåòíèê "+ExpertName+" âåñü â ðàáîòå:  ",IIcm(Tradetime(ExpertTime, Ea.Start, Ea.Stop)==1 && EaDisabled==False),
          "\nÄåíü:  ",Dayof(),
          "\nÒîðãîâûé ñ÷¸ò:  ",shet(),
          "\nCompany:  ",AccountCompany(),
          "\nEquity:  ",AccountEquity(),
          "\nÂðåìÿ ïî GMT:  " +Times,
          "\nSpread:  ",MarketInfo(symbol,MODE_SPREAD),
          "\nStopLevel:  ",lv,
          "\n쑌֔:  ",AccountLeverage()
          ); 
// -----
  if(OrdersCount(OP_SELL,MagicNumber)==1)
  {
    DeleteOrders(OP_BUYSTOP, MagicNumber);
    ObjectDelete("Max");
    ObjectDelete("Min");
  }
  if(OrdersCount(OP_BUY,MagicNumber)==1)
  {
    DeleteOrders(OP_SELLSTOP, MagicNumber);
    ObjectDelete("Max");
    ObjectDelete("Min");
  }                         
// -----
  static datetime BARflag = 0;
  datetime now = Time[0];
  if(BARflag < now){
  BARflag = now;
// -----
  ChecBarsTrend();
  int ordrbuystop = OrdersCount(OP_BUYSTOP, MagicNumber);
  int ordrsellstop = OrdersCount(OP_SELLSTOP,MagicNumber);
  int ordrs = OrdersCount(OP_BUY,MagicNumber)+OrdersCount(OP_SELL,MagicNumber);
// -----
  int ress = ChecBarsFlet();
  double Pricemax = PriceMaxBars(ress);
  double Pricemin = PriceMinBars(ress);
  double ChCan=Pricemax-Pricemin;
  
  double TPBuy=Pricemax+ChCan*Dynamic.TP;
  double TPSell=Pricemin-ChCan*Dynamic.TP;
  double SLBuy=Pricemax-ChCan*Dynamic.SL;
  double SLSell=Pricemin+ChCan*Dynamic.SL;
// -----
   int tik;
   double op, sl, tp;
// ----
   if(Trailing) ModificacionsOrders(MagicNumber); 
// ---- Ó Ñ Ò À Í Î Â Ê À - Î Ð Ä Å Ð À -----------------------------------------+
 if(ChCan>CanalMin*po && ChCan<CanalMax*po && Tradetime(ExpertTime, Ea.Start, Ea.Stop)==1 && 
    EaDisabled==False && Bid>Pricemin+lv*po && Ask<Pricemax-lv*po){
//---
   if(OrdersCount(-1,MagicNumber)==0)
   {
     TrendLine("Max", Pricemax, 1, LimeGreen);
     TrendLine("Min", Pricemin, 1, LimeGreen);
   }
//--- 
   Lot=GetLots();
   if(flagup==true && ordrbuystop==0 && ordrs<MaxOrder && FlagPos==true) {
   op=Pricemax+Otstup*po;
   if(StopLoss>0)sl=op-StopLoss*Point; else sl=SLBuy;
   if(TakeProfit>0)tp=op+TakeProfit*Point; else tp=TPBuy;
   if(PosBuy==true && (op-pa)/po>lv && (op-sl)/po>lv && (tp-op)/po>lv) { 
   tik=SetOrder(symbol, OP_BUYSTOP, Lot, op, sl, tp, MagicNumber, ExpertName, 0);
   if(tik>0)flagup=false;
    }
  }
//---
   tik=0;
   if(flagdw==true && ordrsellstop==0 && ordrs<MaxOrder && FlagPos==true) {
   op=Pricemin-Otstup*po;
   if(StopLoss>0)sl=op+StopLoss*Point; else sl=SLSell;
   if(TakeProfit>0)tp=op-TakeProfit*Point; else tp=TPSell;
   if(PosSell==true && (pb-op)/po>lv && (sl-op)/po>lv && (op-tp)/po>lv) {
   tik=SetOrder(symbol, OP_SELLSTOP, Lot, op, sl, tp, MagicNumber, ExpertName, 0);
   if(tik>0)flagdw=false;   
       }
     }
   }
 }
//----
 return(0);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
int ChecBarsFlet(){
// -----
   int i,ress=0;
   for (i=0; i<Bars; i++){ 
   if(stddev(i)>stddev(i+1)) break;
   if(stddev(i)<stddev(i+1)){
      ress++;
      if(ress>FletBars){
        flagup=true;
        flagdw=true; 
        }
     }
  }
// -----
  return(ress);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
int ChecBarsTrend(){
// -----
   int i,ress=0;
   for (i=0; i<Bars; i++){ 
   if(stddev(i)<stddev(i+1)) break;
   if(stddev(i)>stddev(i+1))
    {
      ress++;
      if(ress>3)FlagPos=true;
    }
  }
// -----
  return(ress);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
double stddev(int i=0){
  return(iCustom(Symbol(),0,"_StdDev",StdDevPer,period,0,i));
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
double PriceMaxBars(int bar=0){
// -----
 double new_extremum;
  for(int i=1;i<=bar;i++)
    {
    if (i==1) new_extremum = iHigh(Symbol(),0,i); else 
    if (new_extremum<iHigh(Symbol(),0,i)) new_extremum = iHigh(Symbol(),0,i);
    } 
// -----
  return(new_extremum);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
double PriceMinBars(int bar=0){
// -----
 double new_extremum;
  for(int i=1;i<=bar;i++)
    {
    if (i==1) new_extremum = iLow(Symbol(),0,i); else 
    if (new_extremum>iLow(Symbol(),0,i)) new_extremum = iLow(Symbol(),0,i);
    } 
// -----
  return(new_extremum);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
void TrendLine(string name, double y1, int ly, color col)
  {
   if(ObjectFind(name) < 0){
   ObjectCreate(name, OBJ_HLINE, 0, TimeCurrent(), NormalizeDouble(y1, Digits));
   ObjectSet(name, OBJPROP_WIDTH, ly);
   ObjectSet(name, OBJPROP_COLOR, col);
   ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
   }
  }
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
double GetLots(int Stop=1000){
// -----
 int Loss; 
 int Profit;
 double Free = AccountFreeMargin();
 double LotVal = MarketInfo(Symbol(),MODE_TICKVALUE);
 double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT);
 double Max_Lot = MarketInfo(Symbol(),MODE_MAXLOT);
 double Step = MarketInfo(Symbol(),MODE_LOTSTEP);
 double Lot = MathFloor((Free*MaxRisk/100)/(Stop*LotVal)/Step)*Step;
// -----
  int orders=OrdersHistoryTotal();
  if(!MM)Lot=Lots;
  if(Kloss>0){
      for (int i = orders - 1; i >= 0; i--) {
         if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == FALSE) {
            Print("Îøèáêà â èñòîðèè!");
            break;
         }
         if (OrderSymbol()!= Symbol() || OrderType() > OP_SELL) continue;
         if (OrderMagicNumber()!=MagicNumber) continue;
         if (OrderProfit() > 0.0) break;
         if (OrderProfit() < 0.0) Loss++;
         }
       if(Loss<LossMax && Loss>=Kloss)Lot=Lot*MultiLoss;
      }      
//--- 
    if(KProfit>0){
      for (int j = orders - 1; j >= 0; j--) {
         if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY) == FALSE) {
            Print("Îøèáêà â èñòîðèè!");
            break;
         }
         if (OrderSymbol()!= Symbol() || OrderType() > OP_SELL) continue;
         if (OrderMagicNumber()!=MagicNumber) continue;
         if (OrderProfit() < 0.0) break;
         if (OrderProfit() > 0.0) Profit++;
         }
       if(Profit<ProfitMax && Profit>=KProfit)Lot=Lot*MultiProfit;
      }      
//--- 
  if(Lot<Min_Lot) Lot = Min_Lot;
  if(Lot>Max_Lot) Lot = Max_Lot;
// -----
 return(Lot);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
void ModificacionsOrders(int mn=0){
//+----
  double sl,ur;
  int cnt=OrdersTotal();
  for (int i=0; i<cnt; i++) {
  if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue; 
  if (OrderSymbol() != symbol) continue;
  if (OrderMagicNumber() != mn) continue;
//+----
  if(OrderType()==OP_BUY){
   ur=OrderOpenPrice()+ND((OrderTakeProfit()-OrderOpenPrice())*FiboTral);
    if(OrderOpenPrice()>OrderStopLoss() && ND(ur)<ND(Bid)){
      ModifyOrder(OrderOpenPrice(),ND(OrderOpenPrice()+1*po),OrderTakeProfit(),OrderExpiration());
     }
   } 
//+----
  if(OrderType()==OP_SELL){
   ur=OrderOpenPrice()-ND((OrderOpenPrice()-OrderTakeProfit())*FiboTral);
     if(OrderOpenPrice()<OrderStopLoss() && ND(ur)>ND(Ask)){ 
       ModifyOrder(OrderOpenPrice(),ND(OrderOpenPrice()-1*po),OrderTakeProfit(),OrderExpiration());
       }
     } 
   }
//+----
  return(0);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
string Dayof(){
string dd;
  switch(DayOfWeek()){
    case 1: dd="Ïîíåäåëüíèê"; break;
    case 2: dd="Âòîðíèê";     break;
    case 3: dd="Ñðåäà";       break;
    case 4: dd="×åòâåðã";     break;
    case 5: dd="Ïÿòíèöà";     break;
    case 6: dd="Ñóááîòà";     break;
    case 7: dd="Âîñêðåñåíüå"; break;
  }
  return(dd);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
int OrdersCount(int type, int mn)
{
//+----
  int orders=0;
  int cnt=OrdersTotal();
  for (int i=0; i<cnt; i++) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    if (OrderSymbol()!=Symbol()) continue;
    if (OrderMagicNumber()!=mn) continue;
    if (OrderType()==type||type<0) orders++;
  }
//+----
  return (orders);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
void DeleteOrders(int op=-1, int mn=-1) {
  bool fd;
  int  i, it, k=OrdersTotal();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderSymbol()==Symbol() && OrderType()==op) {
          if (OrderMagicNumber()==mn) {
            for (it=1; it<=5; it++) {
              if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
              while (!IsTradeAllowed()) Sleep(5000);
              fd=OrderDelete(OrderTicket(), 0);
              if (fd) { PlaySound("ok.wav"); break;
              Sleep(1000*5);
            }
          }
        }
      }
    }
  }
  return(0);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
string IIcm(int com){
 if(com==1)return("äà:"); else return("íåò:");
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
string shet(){
  string s;
  if (IsDemo())s="Äåìî"; else s="Ðåàë";
  return(s);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;
// ----
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
void Message(string m) {
  if (StringLen(m)>0) 
  Print(m);
  WriteLineInFile(ExpertName+" Îøèáêè",m);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
color IIFc(bool condition, color ifTrue, color ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
string GetNameTF(int TimeFrame=0) {
  if (TimeFrame==0) TimeFrame=Period();
  switch (TimeFrame) {
    case PERIOD_M1:  return("M1");
    case PERIOD_M5:  return("M5");
    case PERIOD_M15: return("M15");
    case PERIOD_M30: return("M30");
    case PERIOD_H1:  return("H1");
    case PERIOD_H4:  return("H4");
    case PERIOD_D1:  return("Daily");
    case PERIOD_W1:  return("Weekly");
    case PERIOD_MN1: return("Monthly");
    default:         return("Unknown Period");
  }
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("Buy Limit");
    case OP_SELLLIMIT: return("Sell Limit");
    case OP_BUYSTOP  : return("Buy Stop");
    case OP_SELLSTOP : return("Sell Stop");
    default          : return("Unknown Operation");
  }
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+      
int SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, string co="", datetime ex=0) {
  color    cl=IIFc(op==OP_BUYLIMIT || op==OP_BUYSTOP, LightBlue, LightCoral);
  datetime ot;
  double   pa, pb, mp;
  int      err, it, ticket, msl, sp;
// ----
  if (sy=="" || sy=="0") sy=Symbol();
  msl=MarketInfo(sy, MODE_STOPLEVEL);
  if (co=="") co=WindowExpertName()+" "+GetNameTF(Period());
  if (ex>0 && ex<TimeCurrent()) ex=0;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("SetOrder(): Îñòàíîâêà ðàáîòû ôóíêöèè");
      Message("SetOrder(): Îñòàíîâêà ðàáîòû ôóíêöèè");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    ot=TimeCurrent();
    sp=MarketInfo(sy, MODE_SPREAD);
    pp=NormalizeDouble(pp, Digits);
    sl=NormalizeDouble(sl, Digits);
    tp=NormalizeDouble(tp, Digits);
    ticket=OrderSend(sy, op, ll, pp, sp, sl, tp, co, mn, ex, cl);
    if (ticket>0) { PlaySound("ok.wav"); break;
    } else {
      err=GetLastError();
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66);
        if (ExistOrders(sy, op, mn, ot)) { PlaySound("ok.wav"); break;
        }
        Print("Error(",err,") set order: ",error(err),", try ",it);
        Message("Error("+err+") set order: "+error(err)+", try "+it);
        continue;
      }
      PlaySound("timeout.wav");
      mp=MarketInfo(sy, MODE_POINT);
      pa=MarketInfo(sy, MODE_ASK);
      pb=MarketInfo(sy, MODE_BID);
      if (pa==0 && pb==0) Message("SetOrder(): Ïðîâåðüòå â îáçîðå ðûíêà íàëè÷èå ñèìâîëà "+sy);
      Print("Error(",err,") set order: ",error(err),", try ",it);
      Message("Error("+err+") set order: "+error(err)+", try "+it);
      Print("Ask=",pa,"  Bid=",pb,"  sy=",sy,"  ll=",ll,"  op=",GetNameOP(op),
            "  pp=",pp,"  sl=",sl,"  tp=",tp,"  mn=",mn);
      Message("Ask="+DT(pa)+"  Bid="+DT(pb)+"  sy="+sy+"  ll="+ll+"  op="+GetNameOP(op)+
              "  pp="+DT(pp)+"  sl="+DT(sl)+"  tp="+DT(tp)+"  mn="+mn);      
      // Áëîêèðîâêà ðàáîòû ñîâåòíèêà
      if (err==2 || err==64 || err==65 || err==133) {
        EaDisabled=True; break;
      }
      // Äëèòåëüíàÿ ïàóçà
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      // Ñëèøêîì ÷àñòûå çàïðîñû (8) èëè ñëèøêîì ìíîãî çàïðîñîâ (141)
      if (err==8 || err==141) Sleep(1000*100);
      if (err==139 || err==140 || err==148) break;
      // Îæèäàíèå îñâîáîæäåíèÿ ïîäñèñòåìû òîðãîâëè
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      // Îáíóëåíèå äàòû èñòå÷åíèÿ
      if (err==147) {
        ex=0; continue;
      }
      if (err!=135 && err!=138) Sleep(1000*7.7);
    }
  }
  return(ticket);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
int Tradetime(bool exptime, int OpenHour, int  CloseHour){
// ---
  int day[]; 
  int i=0, np;
  int Trading=0;
  string st, tmp=TradeDay;
  ArrayResize(day, 0);
  while (StringLen(tmp)>0) {
    np=StringFind(tmp, ",");
    if (np<0) {
      st=tmp;
      tmp="";
    } else {
      st=StringSubstr(tmp, 0, np);
      tmp=StringSubstr(tmp, np+1);
    }
    i++;
    ArrayResize(day, i);
    day[i-1]=StrToInteger(st);
  }
// ---
  int TradingTime=0;
  for (int f=0; f<7; f++) {
  if (DayOfWeek()==day[f])Trading=1;
  }
  if (OpenHour>CloseHour){
  if (Hour()<=CloseHour || Hour()>=OpenHour)TradingTime=1;
  }
  if (OpenHour<CloseHour){
  if (Hour()>=OpenHour && Hour()<=CloseHour)TradingTime=1;
  }
  if (OpenHour==CloseHour){
  if (Hour()==OpenHour)TradingTime=1;
  }
  if (DayOfWeek()==1 && Hour() < HourStart)TradingTime=0;
  if (DayOfWeek()==5 && Hour() >= HourStops)TradingTime=0; 
  if (Trading!=1)TradingTime=0;
  if (exptime!=true)TradingTime=1;
// ---
  return(TradingTime); 
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
bool ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  bool   fm;
  color  cl=IIFc(OrderType()==OP_BUY
              || OrderType()==OP_BUYLIMIT
              || OrderType()==OP_BUYSTOP, Blue, Red);
  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) {
    for (it=1; it<=5; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl);
      if (fm) { PlaySound("Stops.wav"); break;
      } else {
        er=GetLastError();
        PlaySound("timeout.wav");
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(",er,") modifying order: ",error(er),", try ",it);
        Message("Error("+er+") modifying order: "+error(er)+", try "+it);
        Print("Ask=",DT(pa),"  Bid=",DT(pb),"  sy=",OrderSymbol(),
              "  op="+GetNameOP(OrderType()),"  pp=",DT(pp),"  sl=",DT(sl),"  tp=",DT(tp));
        Message("Ask="+DT(pa)+"  Bid="+DT(pb)+"  sy="+OrderSymbol()+
                "  op="+GetNameOP(OrderType())+"  pp="+DT(pp)+"  sl="+DT(sl)+"  tp="+DT(tp));      
        Sleep(1000*10);
      }
    }
  }
  return(fm);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
double ND(double np) {
  double pp, ts=MarketInfo(Symbol(), MODE_TICKSIZE);
  int di=MarketInfo(Symbol(), MODE_DIGITS);
  if (ts>0) pp=NormalizeDouble(np/ts, 0)*ts;
  else {if (di>0) pp=NormalizeDouble(np*di, 0)/di; else pp=np;
  }
  return(pp);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
void WriteLineInFile(string FileName,string Line)
  {
   int er;
   int HFile=FileOpen(FileName,FILE_READ|FILE_WRITE," ");
   if(HFile>0)
     {
      FileSeek(HFile,0,SEEK_END);
      FileWrite(HFile,Line);
      FileFlush(HFile);
      FileClose(HFile);
     }else{ er=GetLastError();
      Print("Error: "+er+"  "+error(er));
    }
   return;
  }  
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
string error(int eer)
{
   string er;
   switch(eer)
     {
      //---- 
      case 0:
      case 1:   er="Íåò îøèáêè, íî ðåçóëüòàò íåèçâåñòåí";                         break;
      case 2:   er="Îáùàÿ îøèáêà";                                                break;
      case 3:   er="Íåïðàâèëüíûå ïàðàìåòðû";                                      break;
      case 4:   er="Òîðãîâûé ñåðâåð çàíÿò";                                       break;
      case 5:   er="Ñòàðàÿ âåðñèÿ êëèåíòñêîãî òåðìèíàëà";                         break;
      case 6:   er="Íåò ñâÿçè ñ òîðãîâûì ñåðâåðîì";                               break;
      case 7:   er="Íåäîñòàòî÷íî ïðàâ";                                           break;
      case 8:   er="Ñëèøêîì ÷àñòûå çàïðîñû";                                      break;
      case 9:   er="Íåäîïóñòèìàÿ îïåðàöèÿ íàðóøàþùàÿ ôóíêöèîíèðîâàíèå ñåðâåðà";   break;
      case 64:  er="Ñ÷åò çàáëîêèðîâàí";                                           break;
      case 65:  er="Íåïðàâèëüíûé íîìåð ñ÷åòà";                                    break;
      case 128: er="Èñòåê ñðîê îæèäàíèÿ ñîâåðøåíèÿ ñäåëêè";                       break;
      case 129: er="Íåïðàâèëüíàÿ öåíà";                                           break;
      case 130: er="Íåïðàâèëüíûå ñòîïû";                                          break;
      case 131: er="Íåïðàâèëüíûé îáúåì";                                          break;
      case 132: er="Ðûíîê çàêðûò";                                                break;
      case 133: er="Òîðãîâëÿ çàïðåùåíà";                                          break;
      case 134: er="Íåäîñòàòî÷íî äåíåã äëÿ ñîâåðøåíèÿ îïåðàöèè";                  break;
      case 135: er="Öåíà èçìåíèëàñü";                                             break;
      case 136: er="Íåò öåí";                                                     break;
      case 137: er="Áðîêåð çàíÿò";                                                break;
      case 138: er="Íîâûå öåíû - Ðåêâîò";                                         break;
      case 139: er="Îðäåð çàáëîêèðîâàí è óæå îáðàáàòûâàåòñÿ";                     break;
      case 140: er="Ðàçðåøåíà òîëüêî ïîêóïêà";                                    break;
      case 141: er="Ñëèøêîì ìíîãî çàïðîñîâ";                                      break;
      case 145: er="Ìîäèôèêàöèÿ çàïðåùåíà, òàê êàê îðäåð ñëèøêîì áëèçîê ê ðûíêó"; break;
      case 146: er="Ïîäñèñòåìà òîðãîâëè çàíÿòà";                                  break;
      case 147: er="Èñïîëüçîâàíèå äàòû èñòå÷åíèÿ îðäåðà çàïðåùåíî áðîêåðîì";      break;
      case 148: er="Êîëè÷åñòâî îòêðûòûõ è îòëîæåííûõ îðäåðîâ äîñòèãëî ïðåäåëà ";  break;
      //---- 
      case 4000: er="Íåò îøèáêè";                                                 break;
      case 4001: er="Íåïðàâèëüíûé óêàçàòåëü ôóíêöèè";                             break;
      case 4002: er="Èíäåêñ ìàññèâà - âíå äèàïàçîíà";                             break;
      case 4003: er="Íåò ïàìÿòè äëÿ ñòåêà ôóíêöèé";                               break;
      case 4004: er="Ïåðåïîëíåíèå ñòåêà ïîñëå ðåêóðñèâíîãî âûçîâà";               break;
      case 4005: er="Íà ñòåêå íåò ïàìÿòè äëÿ ïåðåäà÷è ïàðàìåòðîâ";                break;
      case 4006: er="Íåò ïàìÿòè äëÿ ñòðîêîâîãî ïàðàìåòðà";                        break;
      case 4007: er="Íåò ïàìÿòè äëÿ âðåìåííîé ñòðîêè";                            break;
      case 4008: er="Íåèíèöèàëèçèðîâàííàÿ ñòðîêà";                                break;
      case 4009: er="Íåèíèöèàëèçèðîâàííàÿ ñòðîêà â ìàññèâå";                      break;
      case 4010: er="Íåò ïàìÿòè äëÿ ñòðîêîâîãî ìàññèâà";                          break;
      case 4011: er="Ñëèøêîì äëèííàÿ ñòðîêà";                                     break;
      case 4012: er="Îñòàòîê îò äåëåíèÿ íà íîëü";                                 break;
      case 4013: er="Äåëåíèå íà íîëü";                                            break;
      case 4014: er="Íåèçâåñòíàÿ êîìàíäà";                                        break;
      case 4015: er="Íåïðàâèëüíûé ïåðåõîä";                                       break;
      case 4016: er="Íåèíèöèàëèçèðîâàííûé ìàññèâ";                                break;
      case 4017: er="Âûçîâû DLL íå ðàçðåøåíû";                                    break;
      case 4018: er="Íåâîçìîæíî çàãðóçèòü áèáëèîòåêó";                            break;
      case 4019: er="Íåâîçìîæíî âûçâàòü ôóíêöèþ";                                 break;
      case 4020: er="Âûçîâû âíåøíèõ áèáëèîòå÷íûõ ôóíêöèé íå ðàçðåøåíû";           break;
      case 4021: er="Íåäîñòàòî÷íî ïàìÿòè äëÿ ñòðîêè, âîçâðàùàåìîé èç ôóíêöèè";    break;
      case 4022: er="Ñèñòåìà çàíÿòà";                                             break;
      case 4050: er="Íåïðàâèëüíîå êîëè÷åñòâî ïàðàìåòðîâ ôóíêöèè";                 break;
      case 4051: er="Íåäîïóñòèìîå çíà÷åíèå ïàðàìåòðà ôóíêöèè";                    break;
      case 4052: er="Âíóòðåííÿÿ îøèáêà ñòðîêîâîé ôóíêöèè";                        break;
      case 4053: er="Îøèáêà ìàññèâà";                                             break;
      case 4054: er="Íåïðàâèëüíîå èñïîëüçîâàíèå ìàññèâà-òàéìñåðèè";               break;
      case 4055: er="Îøèáêà ïîëüçîâàòåëüñêîãî èíäèêàòîðà";                        break;
      case 4056: er="Ìàññèâû íåñîâìåñòèìû";                                       break;
      case 4057: er="Îøèáêà îáðàáîòêè ãëîáàëüíûåõ ïåðåìåííûõ";                    break;
      case 4058: er="Ãëîáàëüíàÿ ïåðåìåííàÿ íå îáíàðóæåíà";                        break;
      case 4059: er="Ôóíêöèÿ íå ðàçðåøåíà â òåñòîâîì ðåæèìå";                     break;
      case 4060: er="Ôóíêöèÿ íå ïîäòâåðæäåíà";                                    break;
      case 4061: er="Îøèáêà îòïðàâêè ïî÷òû";                                      break;
      case 4062: er="Îæèäàåòñÿ ïàðàìåòð òèïà string";                             break;
      case 4063: er="Îæèäàåòñÿ ïàðàìåòð òèïà integer";                            break;
      case 4064: er="Îæèäàåòñÿ ïàðàìåòð òèïà double";                             break;
      case 4065: er=" êà÷åñòâå ïàðàìåòðà îæèäàåòñÿ ìàññèâ";                      break;
      case 4066: er="Çàïðîøåííûå èñòîðè÷åñêèå äàííûå â ñîñòîÿíèè îáíîâëåíèÿ";     break;
      case 4067: er="Îøèáêà ïðè âûïîëíåíèè òîðãîâîé îïåðàöèè";                    break;
      case 4099: er="Êîíåö ôàéëà";                                                break;
      case 4100: er="Îøèáêà ïðè ðàáîòå ñ ôàéëîì";                                 break;
      case 4101: er="Íåïðàâèëüíîå èìÿ ôàéëà";                                     break;
      case 4102: er="Ñëèøêîì ìíîãî îòêðûòûõ ôàéëîâ";                              break;
      case 4103: er="Íåâîçìîæíî îòêðûòü ôàéë";                                    break;
      case 4104: er="Íåñîâìåñòèìûé ðåæèì äîñòóïà ê ôàéëó";                        break;
      case 4105: er="Íè îäèí îðäåð íå âûáðàí";                                    break;
      case 4106: er="Íåèçâåñòíûé ñèìâîë";                                         break;
      case 4107: er="Íåïðàâèëüíûé ïàðàìåòð öåíû äëÿ òîðãîâîé ôóíêöèè";            break;
      case 4108: er="Íåâåðíûé íîìåð òèêåòà";                                      break;
      case 4109: er="Òîðãîâëÿ íå ðàçðåøåíà";                                      break;
      case 4110: er="Äëèííûå ïîçèöèè íå ðàçðåøåíû";                               break;
      case 4111: er="Êîðîòêèå ïîçèöèè íå ðàçðåøåíû";                              break;
      case 4200: er="Îáúåêò óæå ñóùåñòâóåò";                                      break;
      case 4201: er="Çàïðîøåíî íåèçâåñòíîå ñâîéñòâî îáúåêòà";                     break;
      case 4202: er="Îáúåêò íå ñóùåñòâóåò";                                       break;
      case 4203: er="Íåèçâåñòíûé òèï îáúåêòà";                                    break;
      case 4204: er="Íåò èìåíè îáúåêòà";                                          break;
      case 4205: er="Îøèáêà êîîðäèíàò îáúåêòà";                                   break;
      case 4206: er="Íå íàéäåíî óêàçàííîå ïîäîêíî";                               break;
      case 4207: er="Îøèáêà ïðè ðàáîòå ñ îáúåêòîì";                               break;
      default:   er="unknown error";
     }
  return(er);
}
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
string DT(double s) { return(DoubleToStr(s,Digits)); }
//+------------------------------------------------------------------------------+
//|       Àâòîð : Ñåðãåé   - ìîé ñàéò -  "http://wsforex.ru/"                    |
//+------------------------------------------------------------------------------+
             
            
            
Comments