Flet-Canal_2_4

Author: wsforex@list.ru
Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest prices of each bar
Orders Execution
Checks for the total of closed ordersChecks for the total of open ordersIt automatically opens orders when conditions are reachedIt can change open orders parameters, due to possible stepping strategy
Miscellaneous
It plays sound alertsUses files from the file systemIt writes information to file
0 Views
0 Downloads
0 Favorites
Flet-Canal_2_4
//+-----------------------------------------------------------------+
//|                                                   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

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---