Helen v2.72





//+------------------------------------------------------------------------------+
//|                                                                    Helen.mq4 |
//|                                                    Copyright © 2009 gorby777 |
//|                                                      gorby_e-mail@rambler.ru |
//|Îñîáîå ÑÏÀÑÈÁÎ Êèìó Èãîðþ Â. (aka KimIV,  http://www.kimiv.ru) çà åãî ôóíêöèè |
//+------------------------------------------------------------------------------+
#property copyright "Copyright © 2009 gorby777"
#property link      "gorby_e-mail@rambler.ru"

extern int    Hour_           = 0;                // ×àñ íà÷àëà òîðãîâëè
extern int    Delta_          = 25;               // Óðîâåíü îò áàçîâîé öåíû äî öåíû îòêðûòèÿ îòëîæåííèêà
extern int    StopLoss_       = 70;               // Ñòîïëîññ
extern int    TakeProfit_     = 150;              // Òåéêïðîôèò
extern int    TrailingStop_   = 50;               // Ðàçìåð òðàëà
extern int    shift_          = 0;
//extern int Range=50;
extern string s1              = "==Íàñòðîéêà ÌÌ==";
extern double kLots           = 1.0;              // èíäèâèäóàëüíûé ìíîæèòåëü ê êîýôô-òó ðèñêà
extern bool   MM              = true;             // È òàê ïîíÿòíî
extern bool   UseTrailing     = True;             // Èñïîëüçîâàòü òðàë
extern bool   send_mail       = false;            // Îòïðàâêà ïî÷òû
double        ContinuousLot   = 0.1;              // Ðàçìåð ïîñòîÿííîãî ëîòà ïðè ÌÌ=false

extern string s3              = "==Ðåæèì òðåéäèíãà==";
extern bool   StopTrading     = false;            // Ïðèîñòàíîâêà òîðãîâëè âðó÷íóþ
static bool   TradeAllowed    = true;             // Îñòàíîâêà òîðãîâëè ñîâåòíèêîì

bool          TrailProfitOnly = true;             // Òðàëèòü òîëüêî ïðîôèò
int           TrailingStep    = 3;                // Øàã òðàëà â ïóíêòàõ
int           Range           = 100;              // Ñðåäíèé îáðàçöîâûé äèàïàçîí
int           TF              = 60;               // Òàéìôðåéì
int           slow            = 77;               // Ìåäëåííàÿ ÌÀ â ôóíêöèè òðåíäà
int           fast            = 21;               // Áûñòðàÿ ÌÀ â ôóíêöèè òðåíäà
bool          Check_5Digits   = false;            // Ðàáîòà ñ 5-þ çíàêàìè â êîòèðîâêàõ
int           modeSetOrders   = 0;                // 0 - ïî çàäàííîé öåíå
                                                  // 1 - ñêîððåêòèðîâàòü öåíû
                                                  // 2 - âõîä ïî òåêóùèì öåíàì
static int    LastHour;
static int    Magic,
              MagicOfName,
              MagicOfSymbol;
int           Slippage        = 0,
              Delta,
              StopLoss,
              TakeProfit,
              TrailingStop,
              spread;
double        Point_,kATR;
string        symbol,
              ExpertName,
              AccNumber;
color         clOpenBuy       = LightBlue;         // Öâåò çíà÷êà îòêðûòèÿ ïîêóïêè
color         clOpenSell      = LightCoral;        // Öâåò çíà÷êà îòêðûòèÿ ïðîäàæè
color         clCloseBuy      = Blue;              // Öâåò çíà÷êà çàêðûòèÿ ïîêóïêè
color         clCloseSell     = Red;               // Öâåò çíà÷êà çàêðûòèÿ ïðîäàæè
color         clModifyBuy     = Aqua;              // Öâåò çíà÷êà ìîäèôèêàöèè ïîêóïêè
color         clModifySell    = Tomato;            // Öâåò çíà÷êà ìîäèôèêàöèè ïðîäàæè
bool          MarketWatch     = True;              // Çàïðîñû ïîä èñïîëíåíèå "Market Watch".
static bool   SetFlag         = false;             // Ôëàã óñòàíîâêè ïîçèöèè
int           ticket11;                            // Òèêåò îðäåðà SELLLIMIT
int           ticket21;                            // Òèêåò îðäåðà BUYLIMIT 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int init(){
   symbol            =  Symbol();
   ExpertName        =  WindowExpertName();
   AccNumber         =  DoubleToStr(AccountNumber(),0);
   MagicOfName       =  0;

   for(int i=StringLen(ExpertName)-1;i>=0;i--)                                                                //Ñîñòàâíîé ìàãèê:
      MagicOfName=MagicOfName+StringGetChar(ExpertName,i)*(i+1);                                              //ó÷èòûâàåò èìÿ ýêñïåðòà è
   MagicOfSymbol=StringGetChar(symbol,0)*StringGetChar(symbol,5)+                                             //íàçâàíèå òîðãóåìîé ïàðû
      StringGetChar(symbol,1)*StringGetChar(symbol,4)+
      StringGetChar(symbol,2)*StringGetChar(symbol,3);
   Magic=MagicOfSymbol+MagicOfName;

   if (!GlobalVariableCheck(symbol+"_ticket11")) GlobalVariableSet(symbol+"_ticket11",-1);
   if (!GlobalVariableCheck(symbol+"_ticket21")) GlobalVariableSet(symbol+"_ticket21",-1);
///*   
   switch(MagicOfSymbol){
    case 17255: Range=71;break;
    case 19009: Range=118;break;
    case 15731: Range=77;break;    
    case 16195: Range=66;break;
    default:    Range=100;
   }    
//*/   
   Point_=Point;
   if(Check_5Digits == true && (Digits == 3 || Digits == 5)){                                                 //Äëÿ êîððåêòíîé ðàáîòû ñ 5-þ çíàêàìè
      Alert("Digits=", Digits, " Broker quotes given in 5-digit mode. \"Point\" will be multiplied by 10");   //â êîòèðîâêàõ
      Point_ = 10*Point;
   }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int deinit(){

}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int start(){   
  if(LastHour!=Hour() && send_mail){                                                                          //Åæå÷àñíî ðîáîò øëåò íàì äîêëàä
    if(AccountMargin()!=0) string Level=DoubleToStr(100*AccountEquity()/AccountMargin(),0);                   //î ñîñòîÿíèè ñ÷åòà
    else Level = "ÌÍÎÃÎ ";
    SendMail(DoubleToStr(AccountNumber(),0)+" "+TimeToStr(TimeCurrent(),TIME_MINUTES),
       DoubleToStr(AccountEquity(),0)+", Level "+Level+"%");
    LastHour=Hour();
  }        
  bool pass;
  int Minute5 = MathMod(Minute(),5);                                                                          //Íå ñóåòèìñÿ, çà ðûíêîì
  if(Minute5!=0)pass=false;
  if(Minute5==0 && pass==false){                                                                              //ïðèñìàòðèâàåì ðàç â 5 ìèíóò                         
    pass=true;
    kATR = iATR(symbol,240,200,1)/(Point_*Range);
    //kATR = 1;
    spread=MarketInfo(symbol,MODE_SPREAD);
    TrailingStop=NormalizeDouble(TrailingStop_*kATR,0);
    int orders=0;
    int positions=0;      
    for(int i=OrdersTotal()-1;i>=0;i--){                                                                      //Ïîäñ÷åò îðäåðîâ è ïîçèöèé
      OrderSelect(i,SELECT_BY_POS);
      if(OrderMagicNumber()!=Magic) continue;   
      if(OrderType()<2)positions++;
      orders++;
    }
    if(UseTrailing && positions>0)Trailing(symbol,-1,Magic);                                                  //Òðåéëèíã
    int t1=GlobalVariableGet(symbol+"_ticket11");
    int t2=GlobalVariableGet(symbol+"_ticket21");
    OrderSelect(t1,SELECT_BY_TICKET);
    datetime oct1=OrderCloseTime();
    OrderSelect(t2,SELECT_BY_TICKET);
    datetime oct2=OrderCloseTime();
    if(oct1 != 0 || oct2 !=0){ 
      OrderDelete_(-1,Magic,-1,-1);                                                                           //Åñëè çàêðûëàñü ïîçèöèÿ, óäàëÿåì îðäåð
      GlobalVariableSet(symbol+"_ticket11",-1);                                                               //Çàïîìèíàåì òèêåòû íà ñëó÷àé
      GlobalVariableSet(symbol+"_ticket21",-1);                                                               //ïåðåèíèöèàëèçàöèè      
    }
    if(Hour()!=Hour_)SetFlag=false;                                                                           //Ïîäãîòîâêà ôëàãà óñòàíîâêè îðäåðîâ
    switch(orders-positions){
    case 0: if(!SendOrders(positions))OrderDelete_(-1,Magic,-1,-1);                                           //Óñòàíîâêà îðäåðîâ
              break;
    case 1: if(Trend(symbol,TF,slow,fast)==1){
              OrderDelete_(OP_SELLLIMIT,Magic,-1,-1);
              break;
            }    
            if(Trend(symbol,TF,slow,fast)==-1){
              OrderDelete_(OP_BUYLIMIT,Magic,-1,-1);
              break;
            }
      
    }

  }         

  return(0);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
bool SendOrders(int pos=0){                                                                                   //Ô-öèÿ óñòàíîâêè îðäåðîâ

  if (DayOfWeek()==5 && Hour_>=20 || !TradeAllowed || StopTrading ) return(true);
  MathSrand(TimeCurrent());
//  if (Hour()==Hour_ && Minute()> NormalizeDouble(MathRand()/1000,0) && !SetFlag && pos<=4){                                                                             
  if (Hour()==Hour_  && !SetFlag && pos<=4){
    int shift=NormalizeDouble(Trend(symbol,TF,slow,fast)*shift_*kATR,0);
    double base=iOpen(symbol,60,0)+shift*Point_;                                                              //Áàçîâàÿ öåíà
    double StopLoss=StopLoss_*kATR;
    double TakeProfit=TakeProfit_*kATR;
    double BuyLimitOP=NormalizeDouble(base-Delta_*kATR*Point_,Digits);                                        //Öåíà îòêðûòèÿ áàéëèìèòà
    double SellLimitOP=NormalizeDouble(base+Delta_*kATR*Point_,Digits);                                       //Öåíà îòêðûòèÿ ñåëëëèìèòà
    double BuyLimitSL=NormalizeDouble(BuyLimitOP-StopLoss*Point_,Digits);                                     //Öåíà ñòîïà áàéëèìèòà
    double SellLimitSL=NormalizeDouble(SellLimitOP+StopLoss*Point_,Digits);                                   //Öåíâ ñòîïà ñåëëëèìèòà
    double BuyLimitTP=NormalizeDouble(BuyLimitOP+TakeProfit*Point_,Digits);                                   //Öåíà ÒÐ áàéëèìèòà
    double SellLimitTP=NormalizeDouble(SellLimitOP-TakeProfit*Point_,Digits);                                 //Öåíà ÒÐ ñåëëèìèòà
    datetime DateExp=TimeCurrent()+84400;                                                                     //Âðåìÿ îòìåíû îðäåðà
    int orders=0;
    int positions=0;
          
    ticket11 = OrderSend_(symbol, OP_SELLLIMIT, Lot(StopLoss), SellLimitOP, Slippage, SellLimitSL,            //Óñòàíîâêà îòëîæåííèêà
      SellLimitTP, ExpertName, Magic,DateExp,Red);
    ticket21 = OrderSend_(symbol, OP_BUYLIMIT, Lot(StopLoss), BuyLimitOP, Slippage, BuyLimitSL,               //Óñòàíîâêà îòëîæåííèêà
      BuyLimitTP, ExpertName, Magic,DateExp,Blue);

    Sleep(5000);
    OrderDelete_(-1,Magic,ticket11,ticket21);                                                                 //×èñòêà "ìóñîðà"

    for(int i=OrdersTotal()-1;i>=0;i--){                                                                      //Ïîäñ÷åò îðäåðîâ è ïîçèöèé
      OrderSelect(i,SELECT_BY_POS);
      if(OrderMagicNumber()!=Magic) continue;   
      if(OrderType()<2)positions++;
      orders++;
    }
    if(ticket11>0 && ticket21>0){                                                                             //Ïðîâåðêà "ïðàâèëüíîñòè" 
      GlobalVariableSet(symbol+"_ticket11",ticket11);
      GlobalVariableSet(symbol+"_ticket21",ticket21);
      SetFlag=true;
    }                                                                   
    if(orders-positions!=2){                                                                                  //Åùå îäíà
      GlobalVariableSet(symbol+"_ticket11",-1);
      GlobalVariableSet(symbol+"_ticket21",-1);    
      SetFlag=false;                                                                    
    }
  }
  return(SetFlag);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
double Lot(int StopLoss){
   if(!MM)return(ContinuousLot);
   double Risk=GlobalVariableGet("Risk");
   double tick=MarketInfo(symbol,MODE_TICKVALUE);                                                             //Ô-öèÿ ðàññ÷èòûâàåò ëîò òàêèì îáðàçîì, 
   double lot= NormalizeDouble(AccountEquity()*Risk*kLots/(StopLoss*100*tick),2);                             //÷òî ëîññ ðàâåí óñòàíîâëåííîìó
   if(lot<0.01){                                                                                              //ïðîöåíòó îò äåïîçèòà
      TradeAllowed=false; 
      Alert(symbol,". NO MONEY!"); 
      lot=0;
   }
   return(lot);
}

//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    op - îïåðàöèÿ                   (-1   - ëþáîé îðäåð)                    |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//|    tkt1,tkt2- ïðîïóñòèòü           (-1   - óäàëèòü âñå)                    |
//+----------------------------------------------------------------------------+
bool OrderDelete_(int op=-1, int mn=-1, int tkt1=-1, int tkt2=-1) {
  bool res=true;
  int  err, i, it, k=OrdersTotal(), ot;

  for (i=k-1; i>=0; i--){
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
      if(OrderTicket()==tkt1 || OrderTicket()==tkt2)continue;
      ot=OrderType();
      if (ot>1 && ot<6){
        if (op<0 || ot==op){
          if (mn<0 || OrderMagicNumber()==mn){
            for (it=1; it<=5; it++){
              if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
              while (!IsTradeAllowed()) Sleep(5000);
              res=OrderDelete(OrderTicket(), Yellow);
              if (res) break;
              else {
                err=GetLastError();
                Print("Error(",err,"), failed delete order",", try ",it);
                Sleep(5000);
              }
            }
          }
        }
      }
    }
  }
  return(res);
}
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (NULL èëè "" - òåêóùèé ñèìâîë)          |
//|    op - îïåðàöèÿ                                                           |
//|    ll - ëîò                                                                |
//|    pp - öåíà                                                               |
//|    slip-ñëèïïàäæ
//|    sl - óðîâåíü ñòîï                                                       |
//|    tp - óðîâåíü òåéê                                                       |
//|    co - êîììåíòàðèé
//|    mn - Magic Number                                                       |
//|    ex - Ñðîê èñòå÷åíèÿ                                                     |
//|                                                         |
//+----------------------------------------------------------------------------+
int OrderSend_(string sy, int op=0, double ll=0, double pp=0,double Slippage=0,
              double sl=0, double tp=0,  string co="",int mn=0, datetime ex=0, color cl=0) {

  cl=IIFc(op==OP_BUYLIMIT || op==OP_BUYSTOP, clOpenBuy, clOpenSell);
  datetime ot;
  double   pa, pb, mp;
  int      err, it, ticket, msl;


  msl=MarketInfo(sy, MODE_STOPLEVEL);

  if (ex>0 && ex<TimeCurrent()) ex=0;
  for (it=1; it<=5; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("SetOrder(): Îñòàíîâêà ðàáîòû ôóíêöèè");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    ot=TimeCurrent();

    pp=NormalizeDouble(pp,Digits);
    sl=NormalizeDouble(sl,Digits);
    tp=NormalizeDouble(tp,Digits);
        
    ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, co, mn, ex, cl);
    if (ticket>0) {
       break;
    } else {
      err=GetLastError();
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66);
        if (OrderExist_(sy, op, mn, ot)) {
           break;
        }
        Print("Error(",err,") set order: ",", try ",it);
        continue;
      }
      
      mp=MarketInfo(sy, MODE_POINT);
      pa=MarketInfo(sy, MODE_ASK);
      pb=MarketInfo(sy, MODE_BID);

      Print("Error(",err,") set order: ",", try ",it);
      Print("Ask=",pa,"  Bid=",pb,"  sy=",sy,"  ll=",ll,"  op=",
            "  pp=",pp,"  sl=",sl,"  tp=",tp,"  mn=",mn);
      // Íåïðàâèëüíûå ñòîïû
      if (err==130) {
        // Êîððåêòèðîâêà öåíîâûõ óðîâíåé
        if (modeSetOrders==1) {
          Sleep(1000*5.3);
          switch (op) {
            case OP_BUYLIMIT:
              if (pp>pa-msl*mp) pp=pa-msl*mp;
              if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
              if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
              break;
            case OP_BUYSTOP:
              if (pp<pa+(msl+1)*mp) pp=pa+(msl+1)*mp;
              if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
              if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
              break;
            case OP_SELLLIMIT:
              if (pp<pb+msl*mp) pp=pb+msl*mp;
              if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
              if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
              break;
            case OP_SELLSTOP:
              if (pp>pb-msl*mp) pp=pb-msl*mp;
              if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
              if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
              break;
          }
          Print("SetOrder(): Ñêîððåêòèðîâàíû öåíîâûå óðîâíè");
          continue;
        }
        // Âõîä ïî òåêóùèì öåíàì
        if (modeSetOrders==2) {
          Print("SetOrder(): Âõîä ïî òåêóùèì öåíàì");
          if (op==OP_BUYLIMIT || op==OP_BUYSTOP) OpenPosition(sy, OP_BUY, ll, sl, tp, mn, co);
          if (op==OP_SELLLIMIT || op==OP_SELLSTOP) OpenPosition(sy, OP_SELL, ll, sl, tp, mn, co);
          break;
        }
      }
      // Áëîêèðîâêà ðàáîòû ñîâåòíèêà
      if (err==2 || err==64 || err==65 || err==133) {
        TradeAllowed=false; 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);
}
//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáîé îðäåð)                    |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//|    ot - âðåìÿ îòêðûòèÿ             ( 0   - ëþáîå âðåìÿ óñòàíîâêè)          |
//+----------------------------------------------------------------------------+
bool OrderExist_(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);
}
//|  Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ.      |
//+----------------------------------------------------------------------------+
color IIFc(bool condition, color ifTrue, color ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 10.04.2008                                                     |
//|  Îïèñàíèå : Îòêðûâàåò ïîçèöèþ ïî ðûíî÷íîé öåíå.                            |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (NULL èëè "" - òåêóùèé ñèìâîë)          |
//|    op - îïåðàöèÿ                                                           |
//|    ll - ëîò                                                                |
//|    sl - óðîâåíü ñòîï                                                       |
//|    tp - óðîâåíü òåéê                                                       |
//|    mn - MagicNumber                                                        |
//|    co - êîììåíòàðèé                                                        |
//+----------------------------------------------------------------------------+
void OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0, string co="") {
  color    clOpen;
  datetime ot;
  double   pp, pa, pb;
  int      dg, err, it, ticket=0;

  if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
  for (it=1; it<=5; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || 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, co, mn, 0, clOpen);
    else
      ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, co, mn, 0, clOpen);
    if (ticket>0) {
       break;
    } else {
      err=GetLastError();
      
      
      // Âûâîä ñîîáùåíèÿ îá îøèáêå
      Print("Error(",err,") opening position: ",", try ",it);
      Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",
            " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
      // Áëîêèðîâêà ðàáîòû ñîâåòíèêà
      if (err==2 || err==64 || err==65 || err==133) {
        TradeAllowed=false; 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)) {
           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)) OrderModify_(-1, sl, tp);
  }
}
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 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);
}
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 28.11.2006                                                     |
//|  Îïèñàíèå : Ìîäèôèêàöèÿ îäíîãî ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà.           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    pp - öåíà óñòàíîâêè îðäåðà                                              |
//|    sl - öåíîâîé óðîâåíü ñòîïà                                              |
//|    tp - öåíîâîé óðîâåíü òåéêà                                              |
//|    ex - äàòà èñòå÷åíèÿ                                                     |
//+----------------------------------------------------------------------------+
bool OrderModify_(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  bool   fm=true;
  color  cl=IIFc(OrderType()==OP_BUY
              || OrderType()==OP_BUYLIMIT
              || OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell);
  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){
         return(true);
      } 
      else {
        er=GetLastError();

        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(",er,") modifying order: ",", try ",it);
        Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),"  pp=",pp,"  sl=",sl,"  tp=",tp);
        Sleep(1000*10);
      }
    }
  }
   return(fm);
}
//+----------------------------------------------------------------------------+
//|  Ñîïðîâîæäåíèå ïîçèöèè ïðîñòûì òðàëîì                                      |
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   ("" - òåêóùèé ñèìâîë)                   |
//|    op - îïåðàöèÿ                   (-1 - ëþáàÿ ïîçèöèÿ)                    |
//|    mn - MagicNumber                (-1 - ëþáîé ìàãèê)                      |
//+----------------------------------------------------------------------------+
void Trailing(string sy="", int op=-1, int mn=-1) {
  double p, pp;
  int    i, k=OrdersTotal();

  if (sy=="") sy=Symbol();
  p=MarketInfo(sy, MODE_POINT);
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            pp=MarketInfo(sy, MODE_BID);
            if (!TrailProfitOnly || (pp-OrderOpenPrice())>TrailingStop*p) {
              if (OrderStopLoss()<pp-(TrailingStop+TrailingStep-1)*p) {
                ModifyOrder(-1, pp-TrailingStop*p, -1, -1);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            pp=MarketInfo(sy, MODE_ASK);
            if (!TrailProfitOnly || OrderOpenPrice()-pp>TrailingStop*p) {
              if (OrderStopLoss()>pp+(TrailingStop+TrailingStep-1)*p || OrderStopLoss()==0) {
                ModifyOrder(-1, pp+TrailingStop*p, -1, -1);
              }
            }
          }
        }
      }
    }
  }
}
//+----------------------------------------------------------------------------+

//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. 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=IIFc(OrderType()==OP_BUY
              || OrderType()==OP_BUYLIMIT
              || OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell);
  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) {
        break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(",er,") modifying order, try ",it);
        Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
              "  pp=",pp,"  sl=",sl,"  tp=",tp);
        Sleep(1000*10);
      }
    }
  }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int Trend(string sym = "", int TF=0, int slow = 0, int fast = 0)
{
   
   double ma1=iMA(sym,TF,slow,0,2,4,1);
   double ma2=iMA(sym,TF,slow,0,2,4,2);
   double ma3=iMA(sym,TF,fast,0,2,4,1);

   
   if (sym=="" || sym=="0") sym=Symbol();
   if(ma1>=ma2 && ma1<=ma3)return(1);
   if(ma1<=ma2 && ma1>=ma3)return(-1);
   return(0);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++





Sample





Analysis



Market Information Used:

Series array that contains open prices of each bar


Indicator Curves created:


Indicators Used:

Indicator of the average true range
Moving average indicator


Custom Indicators Used:

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

Other Features:


It issuies visual alerts to the screen
It sends emails