Author: ��� ����� �. aka KimIV
Orders Execution
It Closes Orders by itself Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
Miscellaneous
It plays sound alerts
0 Views
0 Downloads
0 Favorites
e-TFL_v2
//+----------------------------------------------------------------------------+
//|                                                              e-TFL_v2.mq4  |
//|                                                    Êèì Èãîðü Â. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//+----------------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Âíåøíèå ïàðàìåòðû ñîâåòíèêà -----------------------------------------+
extern string _P_Expert="---------- Ïàðàìåòðû ñîâåòíèêà";
extern string NameUpLine    = "UPLine";     // Íàèìåíîâàíèå âåðõíåé ëèíèè
extern string NameDnLine    = "DNLine";     // Íàèìåíîâàíèå íèæíåé ëèíèè
extern bool   BuyFromUp     = False;        // Ïîêóïàòü îò âåðõíåé ëèíèè
extern bool   BuyFromDn     = True;         // Ïîêóïàòü îò íèæíåé ëèíèè
extern int    OffsetTL      = 3;            // Ñìåùåíèå òîðãîâîãî óðîâíÿ
extern bool   SetRevStopOrd = False;        // Ñòàâèòü ïåðåâîðîòíûå ñòîï-îðäåðà
extern bool   ShowComment   = True;         // Ïîêàçûâàòü êîììåíòàðèè
extern bool   MarketWatch   = True;         // Çàïðîñû ïîä èñïîëíåíèå "Market Watch".
extern int    Magic         = 20080320;     // Èäåíòèôèêàòîð ïîçèöèé ñîâåòíèêà
extern bool   UseSound      = True;         // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern string NameFileSound = "expert.wav"; // Íàèìåíîâàíèå çâóêîâîãî ôàéëà

extern string _P_Trade="---------- Ïàðàìåòðû òîðãîâëè";
extern double Lots        = 0.1;       // Ðàçìåð òîðãóåìîãî ëîòà
extern int    StopLoss    = 30;        // Ðàçìåð ôèêñèðîâàííîãî ñòîïà
extern int    TakeProfit  = 0;         // Ðàçìåð ôèêñèðîâàííîãî òýéêà
extern int    Slippage    = 3;         // Ïðîñêàëüçûâàíèå öåíû
extern int    NumberOfTry = 5;         // Êîëè÷åñòâî òîðãîâûõ ïîïûòîê

//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà -------------------------------------+
bool   gbDisabled   = False;           // Ôëàã áëîêèðîâêè ñîâåòíèêà
bool   gbNoInit     = False;           // Ôëàã íåóäà÷íîé èíèöèàëèçàöèè
color  clOpenBuy    = LightBlue;       // Öâåò çíà÷êà îòêðûòèÿ ïîêóïêè
color  clOpenSell   = LightCoral;      // Öâåò çíà÷êà îòêðûòèÿ ïðîäàæè
color  clModifyBuy  = Aqua;            // Öâåò çíà÷êà ìîäèôèêàöèè ïîêóïêè
color  clModifySell = Tomato;          // Öâåò çíà÷êà ìîäèôèêàöèè ïðîäàæè
color  clCloseBuy   = Blue;            // Öâåò çíà÷êà çàêðûòèÿ ïîêóïêè
color  clCloseSell  = Red;             // Öâåò çíà÷êà çàêðûòèÿ ïðîäàæè
double gdUpPrice, gdDnPrice;           // Òåêóùèå öåíîâûå óðîâíè
double gdPrevUpPrice, gdPrevDnPrice;   // Ïðåäûäóùèå öåíîâûå óðîâíè
double gdPrevAsk, gdPrevBid;           // Ïðåäûäóùèå öåíû

//------- Ïîäêëþ÷åíèå âíåøíèõ ìîäóëåé -----------------------------------------+
#include <stdlib.mqh>        // Ñòàíäàðòíàÿ áèáëèîòåêà ÌÒ4
//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ÏÐÅÄÎÏÐÅÄÅ˨ÍÍÛÅ ÔÓÍÊÖÈÈ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Ôóíêöèÿ èíèöèàëèçàöèè                                                     |
//+----------------------------------------------------------------------------+
void init()
  {
   gbNoInit=False;
   if(!IsTradeAllowed())
     {
      Message("Äëÿ íîðìàëüíîé ðàáîòû ñîâåòíèêà íåîáõîäèìî\n"+
              "Ðàçðåøèòü ñîâåòíèêó òîðãîâàòü");
      gbNoInit=True; return;
     }
   if(!IsLibrariesAllowed())
     {
      Message("Äëÿ íîðìàëüíîé ðàáîòû ñîâåòíèêà íåîáõîäèìî\n"+
              "Ðàçðåøèòü èìïîðò èç âíåøíèõ ýêñïåðòîâ");
      gbNoInit=True; return;
     }
   if(!IsTesting())
     {
      if(IsExpertEnabled()) Message("Ñîâåòíèê áóäåò çàïóùåí ñëåäóþùèì òèêîì");
      else Message("Îòæàòà êíîïêà \"Ðàçðåøèòü çàïóñê ñîâåòíèêîâ\"");
     }
  }

//+----------------------------------------------------------------------------+
//|  expert deinitialization function                                          |
//+----------------------------------------------------------------------------+
void deinit() { if(!IsTesting()) Comment(""); }
//+----------------------------------------------------------------------------+
//|  expert program start function                                             |
//+----------------------------------------------------------------------------+
void start()
  {
   if(gbDisabled)
     {
      Message("Êðèòè÷åñêàÿ îøèáêà! Ñîâåòíèê ÎÑÒÀÍÎÂËÅÍ!"); return;
     }
   if(gbNoInit)
     {
      Message("Íå óäàëîñü èíèöèàëèçèðîâàòü ñîâåòíèê!"); return;
     }
   gdUpPrice=0; gdDnPrice=0;
   if(idPriceLevel() && gdPrevAsk!=0 && gdPrevBid!=0) ManagePositions();

   if(ShowComment)
     {
      string st="";
      if(gdUpPrice==0) st="Íå îïðåäåë¸í âåðõíèé öåíîâîé óðîâåíü\n";
      else
        {
         if(BuyFromUp) st="Ïîêóïêà îò ";
         else st="Ïðîäàæà îò ";
         st=st+DoubleToStr(gdUpPrice,Digits)+"\n";
         if(SetRevStopOrd)
           {
            if(BuyFromUp) st=st+"SellStop íà "+DoubleToStr(gdUpPrice-StopLoss*Point,Digits)+"\n";
            else st=st+"BuyStop íà "+DoubleToStr(gdUpPrice+StopLoss*Point,Digits)+"\n";
           }
        }
      if(gdDnPrice==0) st=st+"Íå îïðåäåë¸í íèæíèé öåíîâîé óðîâåíü";
      else
        {
         if(BuyFromDn) st=st+"Ïîêóïêà îò ";
         else st=st+"Ïðîäàæà îò ";
         st=st+DoubleToStr(gdDnPrice,Digits)+"\n";
         if(SetRevStopOrd)
           {
            if(BuyFromDn) st=st+"SellStop íà "+DoubleToStr(gdDnPrice-StopLoss*Point,Digits)+"\n";
            else st=st+"BuyStop íà "+DoubleToStr(gdDnPrice+StopLoss*Point,Digits)+"\n";
           }
        }
      if(gdUpPrice>0 || gdDnPrice>0)
        {
         st="Lots="+DoubleToStr(Lots,2)+
            "  StopLoss="+StopLoss+" ï."+
            "  TakeProfit="+TakeProfit+" ï.\n"+st;
        }
      st="OffsetTL="+OffsetTL+IIFs(MarketWatch,"  MarketWatch","")+"  Magic="+Magic+"\n"+st;
      Comment(st);
     }

   if(gdUpPrice>0) gdPrevUpPrice=gdUpPrice;
   if(gdDnPrice>0) gdPrevDnPrice=gdDnPrice;
   gdPrevAsk=Ask;
   gdPrevBid=Bid;
  }
//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ÏÎËÜÇÎÂÀÒÅËÜÑÊÈÅ ÔÓÍÊÖÈÈ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ  : 19.02.2008                                                      |
//|  Îïèñàíèå: Çàêðûòèå îäíîé ïðåäâàðèòåëüíî âûáðàííîé ïîçèöèè                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect()
  {
   bool   fc;
   color  clClose;
   double ll,pa,pb,pp;
   int    err,it;

   if(OrderType()==OP_BUY || OrderType()==OP_SELL)
     {
      for(it=1; it<=NumberOfTry; it++)
        {
         if(!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
         while(!IsTradeAllowed()) Sleep(5000);
         RefreshRates();
         pa=MarketInfo(OrderSymbol(), MODE_ASK);
         pb=MarketInfo(OrderSymbol(), MODE_BID);
         if(OrderType()==OP_BUY)
           {
            pp=pb; clClose=clCloseBuy;
              } else {
            pp=pa; clClose=clCloseSell;
           }
         ll=OrderLots();
         fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
         if(fc)
           {
            if(UseSound) PlaySound(NameFileSound); break;
              } else {
            err=GetLastError();
            if(err==146) while(IsTradeContextBusy()) Sleep(1000*11);
            Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
                  ErrorDescription(err),", try ",it);
            Print(OrderTicket(),"  Ask=",pa,"  Bid=",pb,"  pp=",pp);
            Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),
                  "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());
            Sleep(1000*5);
           }
        }
     }
   else Print("Íåêîððåêòíàÿ òîðãîâàÿ îïåðàöèÿ. Close ",GetNameOP(OrderType()));
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 19.02.2008                                                     |
//|  Îïèñàíèå : Çàêðûòèå ïîçèöèé ïî ðûíî÷íîé öåíå                              |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//+----------------------------------------------------------------------------+
void ClosePositions(string sy="",int op=-1,int mn=-1)
  {
   int i,k=OrdersTotal();

   if(sy=="0") sy=Symbol();
   for(i=k-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
              }
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 12.03.2008                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ îðäåðîâ.                         |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáîé îðäåð)                    |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//|    ot - âðåìÿ îòêðûòèÿ             ( 0   - ëþáîå âðåìÿ óñòàíîâêè)          |
//+----------------------------------------------------------------------------+
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);
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 06.03.2008                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ ïîçèöèé                          |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//|    ot - âðåìÿ îòêðûòèÿ             ( 0   - ëþáîå âðåìÿ îòêðûòèÿ)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="",int op=-1,int mn=-1,datetime ot=0)
  {
   int i,k=OrdersTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sy || sy=="")
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(ot<=OrderOpenTime()) return(True);
                    }
                 }
              }
           }
        }
     }
   return(False);
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè                      |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op)
  {
   switch(op)
     {
      case OP_BUY      : return("Buy");
      case OP_SELL     : return("Sell");
      case OP_BUYLIMIT : return("Buy Limit");
      case OP_SELLLIMIT: return("Sell Limit");
      case OP_BUYSTOP  : return("Buy Stop");
      case OP_SELLSTOP : return("Sell Stop");
      default          : return("Unknown Operation");
     }
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òàéìôðåéìà                             |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    TimeFrame - òàéìôðåéì (êîëè÷åñòâî ñåêóíä)      (0 - òåêóùèé ÒÔ)         |
//+----------------------------------------------------------------------------+
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("UnknownPeriod");
     }
  }

//+----------------------------------------------------------------------------+
//|  Âîçâðàùàåò ðàçìåð ëîòà                                                    |
//+----------------------------------------------------------------------------+
double GetSizeLot() { return(Lots); }
//+----------------------------------------------------------------------------+
//|  Èäåíòèôèêàöèÿ âåðõíåãî è íèæíåãî öåíîâûõ óðîâíåé                          |
//+----------------------------------------------------------------------------+
bool idPriceLevel()
  {
// Âåðõíèé öåíîâîé óðîâåíü
   if(ObjectFind(NameUpLine)<0)
     {
      gdUpPrice=0;
      gdPrevUpPrice=0;
      Message("Íå íàéäåíà ëèíèÿ "+NameUpLine);
        } else {
      switch(ObjectType(NameUpLine))
        {
         case OBJ_HLINE: gdUpPrice=ObjectGet(NameUpLine, OBJPROP_PRICE1); break;
         case OBJ_TREND: gdUpPrice=ObjectGetValueByShift(NameUpLine, 0); break;
         default: Message("Íåâåðíûé òèï ëèíèè "+NameUpLine); break;
        }
      if(gdUpPrice>0) gdUpPrice+=OffsetTL*Point;
     }

// Íèæíèé öåíîâîé óðîâåíü
   if(ObjectFind(NameDnLine)<0)
     {
      gdDnPrice=0;
      gdPrevDnPrice=0;
      Message("Íå íàéäåíà ëèíèÿ "+NameDnLine);
        } else {
      switch(ObjectType(NameDnLine))
        {
         case OBJ_HLINE: gdDnPrice=ObjectGet(NameDnLine, OBJPROP_PRICE1); break;
         case OBJ_TREND: gdDnPrice=ObjectGetValueByShift(NameDnLine, 0); break;
         default: Message("Íåâåðíûé òèï ëèíèè "+NameDnLine); break;
        }
      if(gdDnPrice>0) gdDnPrice-=OffsetTL*Point;
     }

   if(gdUpPrice<gdPrevBid && gdUpPrice>0)
     {
      gdUpPrice=0;
      Message("Âåðõíÿÿ ëèíèÿ "+NameUpLine+" ðàñïîëîæåíà íèæå ðûíêà");
     }
   if(gdDnPrice>gdPrevAsk && gdPrevAsk>0)
     {
      gdDnPrice=0;
      Message("Íèæíÿÿ ëèíèÿ "+NameDnLine+" ðàñïîëîæåíà âûøå ðûíêà");
     }

   if(gdUpPrice!=gdPrevUpPrice|| gdDnPrice!=gdPrevDnPrice
      || gdPrevUpPrice==0 || gdPrevDnPrice==0
      || gdUpPrice==0 || gdDnPrice==0) return(False);
   else return(True);
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ.      |
//+----------------------------------------------------------------------------+
string IIFs(bool condition,string ifTrue,string ifFalse)
  {
   if(condition) return(ifTrue); else return(ifFalse);
  }
//+----------------------------------------------------------------------------+
//|  Óïðàâëåíèå ïîçèöèÿìè                                                      |
//+----------------------------------------------------------------------------+
void ManagePositions()
  {
   bool   lbBuy=False,lbSell=False;
   double ll=GetSizeLot();
   double pp,sl=0,tp=0;
   int    ti;

   if((Ask>gdPrevAsk && Ask>=gdUpPrice  &&  BuyFromUp)
      || (Ask<gdPrevAsk  &&  Ask<=gdDnPrice && BuyFromDn)) lbBuy=True;
   if((Bid>gdPrevBid && Bid>=gdUpPrice && !BuyFromUp)
      || (Bid<gdPrevBid  &&  Bid<=gdDnPrice && !BuyFromDn)) lbSell=True;

   if(lbBuy)
     {
      if(ExistPositions(NULL,OP_SELL,Magic)) ClosePositions(NULL,OP_SELL,Magic);
      if(!ExistPositions(NULL,OP_BUY,Magic))
        {
         if(MarketWatch)
           {
            ti=OpenPosition("",OP_BUY,ll,0,0,Magic);
            if(SelectByTicket(ti))
              {
               if(StopLoss  >0) sl=Ask-StopLoss  *Point; else sl=0;
               if(TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
               ModifyOrder(-1,sl,tp,clModifyBuy);
              }
              } else {
            if(StopLoss  >0) sl=Ask-StopLoss  *Point; else sl=0;
            if(TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
            OpenPosition("",OP_BUY,ll,sl,tp,Magic);
           }
         if(SetRevStopOrd && sl>0 && !ExistOrders(NULL,OP_SELLSTOP,Magic))
           {
            pp=sl;
            sl=pp+StopLoss*Point;
            if(TakeProfit>0) tp=pp-TakeProfit*Point; else tp=0;
            SetOrder("",OP_SELLSTOP,ll,pp,sl,tp,Magic);
           }
        }
     }
   if(lbSell)
     {
      if(ExistPositions(NULL,OP_BUY,Magic)) ClosePositions(NULL,OP_BUY,Magic);
      if(!ExistPositions(NULL,OP_SELL,Magic))
        {
         if(MarketWatch)
           {
            ti=OpenPosition("",OP_SELL,ll,0,0,Magic);
            if(SelectByTicket(ti))
              {
               if(StopLoss  >0) sl=Bid+StopLoss  *Point; else sl=0;
               if(TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
               ModifyOrder(-1,sl,tp,clModifySell);
              }
              } else {
            if(StopLoss  >0) sl=Bid+StopLoss  *Point; else sl=0;
            if(TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
            OpenPosition("",OP_SELL,ll,sl,tp,Magic);
           }
         if(SetRevStopOrd && sl>0 && !ExistOrders(NULL,OP_BUYSTOP,Magic))
           {
            pp=sl;
            sl=pp-StopLoss*Point;
            if(TakeProfit>0) tp=pp+TakeProfit*Point; else tp=0;
            SetOrder("",OP_BUYSTOP,ll,pp,sl,tp,Magic);
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                     |
//|  Îïèñàíèå : Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë                           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    m - òåêñò ñîîáùåíèÿ                                                     |
//+----------------------------------------------------------------------------+
void Message(string m)
  {
   Comment(m);
   if(StringLen(m)>0) Print(m);
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 28.11.2006                                                     |
//|  Îïèñàíèå : Ìîäèôèêàöèÿ îäíîãî ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà.           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    pp - öåíà îòêðûòèÿ ïîçèöèè, óñòàíîâêè îðäåðà                            |
//|    sl - öåíîâîé óðîâåíü ñòîïà                                              |
//|    tp - öåíîâîé óðîâåíü òåéêà                                              |
//|    cl - öâåò                                                               |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1,double sl=0,double tp=0,color cl=CLR_NONE)
  {
   bool   fm;
   double pa=MarketInfo(OrderSymbol(), MODE_ASK);
   double pb=MarketInfo(OrderSymbol(), MODE_BID);
   double op,os,ot;
   int    dg,err,it;

   if(pp<=0) pp=OrderOpenPrice();
   if(sl<0) sl=OrderStopLoss();
   if(tp<0) tp=OrderTakeProfit();

   dg=MarketInfo(OrderSymbol(), MODE_DIGITS);
   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<=NumberOfTry; it++)
        {
         if(!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
         while(!IsTradeAllowed()) Sleep(5000);
         RefreshRates();
         fm=OrderModify(OrderTicket(),pp,sl,tp,0,cl);
         if(fm)
           {
            if(UseSound) PlaySound(NameFileSound); break;
              } else {
            err=GetLastError();
            Print("Error(",err,") modifying order: ",ErrorDescription(err),", try ",it);
            Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
                  "  op="+GetNameOP(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);
            Sleep(1000*10);
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 06.03.2008                                                     |
//|  Îïèñàíèå : Îòêðûâàåò ïîçèöèþ è âîçâðàùàåò å¸ òèêåò.                       |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   ("" èëè NULL - òåêóùèé ñèìâîë)          |
//|    op - îïåðàöèÿ                                                           |
//|    ll - ëîò                                                                |
//|    sl - óðîâåíü ñòîï                                                       |
//|    tp - óðîâåíü òåéê                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy,int op,double ll,double sl=0,double tp=0,int mn=0)
  {
   color    clOpen;
   datetime ot;
   double   pp,pa,pb;
   int      dg,err,it,ticket=0;
   string   lsComm=WindowExpertName()+" "+GetNameTF(Period());

   if(sy=="" || sy=="0") sy=Symbol();
   if(op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
   for(it=1; it<=NumberOfTry; it++)
     {
      if(!IsTesting() && (!IsExpertEnabled() || IsStopped())) 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();
      ticket=OrderSend(sy,op,ll,pp,Slippage,sl,tp,lsComm,mn,0,clOpen);
      if(ticket>0)
        {
         if(UseSound) PlaySound(NameFileSound); break;
           } else {
         err=GetLastError();
         if(err==128 || err==142 || err==143)
           {
            Sleep(1000*66.666);
            if(ExistPositions(sy,op,mn,ot))
              {
               if(UseSound) PlaySound(NameFileSound); break;
              }
           }
         // Âûâîä ñîîáùåíèÿ îá îøèáêå
         Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
         Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
               " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
         if(pa==0 && pb==0) Message("Ïðîâåðüòå â Îáçîðå ðûíêà íàëè÷èå ñèìâîëà "+sy);
         // Áëîêèðîâêà ðàáîòû ñîâåòíèêà
         if(err==2 || err==64 || err==65 || err==133)
           {
            gbDisabled=True; break;
           }
         // Äëèòåëüíàÿ ïàóçà
         if(err==4 || err==131 || err==132)
           {
            Sleep(1000*300); break;
           }
         if(err==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);
        }
     }
   return(ticket);
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 20.04.2007                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò ôëàã óäà÷íîãî âûáîðà îðäðåðà èëè ïîçèöèè ïî òèêåòó  |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    ti - òèêåò îðäåðà, ïîçèöèè                                              |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//+----------------------------------------------------------------------------+
bool SelectByTicket(int ti,string sy="",int op=-1,int mn=-1)
  {
   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=="") && (op<0 || OrderType()==op))
           {
            if((mn<0 || OrderMagicNumber()==mn) && OrderTicket()==ti) return(True);
           }
        }
     }
   return(False);
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 13.03.2008                                                     |
//|  Îïèñàíèå : Óñòàíîâêà îðäåðà.                                              |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (NULL èëè "" - òåêóùèé ñèìâîë)          |
//|    op - îïåðàöèÿ                                                           |
//|    ll - ëîò                                                                |
//|    pp - öåíà                                                               |
//|    sl - óðîâåíü ñòîï                                                       |
//|    tp - óðîâåíü òåéê                                                       |
//|    mn - Magic Number                                                       |
//|    ex - Ñðîê èñòå÷åíèÿ                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy,int op,double ll,double pp,
              double sl=0,double tp=0,int mn=0,datetime ex=0)
  {
   color    clOpen;
   datetime ot;
   double   pa,pb,mp;
   int      err,it,ticket,msl;
   string   lsComm=WindowExpertName()+" "+GetNameTF(Period());

   if(sy=="" || sy=="0") sy=Symbol();
   msl=MarketInfo(sy,MODE_STOPLEVEL);
   if(op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
   if(ex>0 && ex<TimeCurrent()) ex=0;
   for(it=1; it<=NumberOfTry; it++)
     {
      if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
        {
         Print("SetOrder(): Îñòàíîâêà ðàáîòû ôóíêöèè");
         break;
        }
      while(!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      ot=TimeCurrent();
      ticket=OrderSend(sy,op,ll,pp,Slippage,sl,tp,lsComm,mn,ex,clOpen);
      if(ticket>0)
        {
         if(UseSound) PlaySound(NameFileSound); break;
           } else {
         err=GetLastError();
         if(err==128 || err==142 || err==143)
           {
            Sleep(1000*66);
            if(ExistOrders(sy,op,mn,ot))
              {
               if(UseSound) PlaySound(NameFileSound); break;
              }
            Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it);
            continue;
           }
         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: ",ErrorDescription(err),", try ",it);
         Print("Ask=",pa,"  Bid=",pb,"  sy=",sy,"  ll=",ll,"  op=",GetNameOP(op),
               "  pp=",pp,"  sl=",sl,"  tp=",tp,"  mn=",mn);
         // Íåïðàâèëüíûå ñòîïû
         if(err==130)
           {
            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(): Ñêîððåêòèðîâàíû öåíîâûå óðîâíè");
           }
         // Áëîêèðîâêà ðàáîòû ñîâåòíèêà
         if(err==2 || err==64 || err==65 || err==133)
           {
            gbDisabled=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);
        }
     }
  }
//+----------------------------------------------------------------------------+

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