Helen v2.72

Author: Copyright � 2009 gorby777
Price Data Components
Series array that contains open prices of each bar
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt can change open orders parameters, due to possible stepping strategy
Indicators Used
Indicator of the average true rangeMoving average indicator
Miscellaneous
It issuies visual alerts to the screenIt sends emails
0 Views
0 Downloads
0 Favorites

Profitability Reports

AUD/USD Oct 2024 - Jan 2025
0.00 %
Total Trades 0
Won Trades 0
Lost trades 0
Win Rate 0.0 %
Expected payoff 0.00
Gross Profit 0.00
Gross Loss 0.00
Total Net Profit 0.00
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
0.00 %
Total Trades 0
Won Trades 0
Lost trades 0
Win Rate 0.0 %
Expected payoff 0.00
Gross Profit 0.00
Gross Loss 0.00
Total Net Profit 0.00
-100%
-50%
0%
50%
100%
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);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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 ---