TrailingFuncLib





//+------------------------------------------------------------------+
//|                                                  TrailingAll.mq4 |
//|                                                              I_D |
//|             Ñîôò äëÿ óïðàâëåíèÿ êàïèòàëîì: http://www.mymmk.com/ |
//+------------------------------------------------------------------+
#property copyright "I_D / Þðèé Äçþáàí"
#property link      "http://www.mymmk.com/ Ñîôò äëÿ óïðàâëåíèÿ êàïèòàëîì"
#property library

static datetime sdtPrevtime = 0;

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÔÐÀÊÒÀËÀÌ                                            |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, êîëè÷åñòâî áàðîâ â ôðàêòàëå,   |
//| è îòñòóï (ïóíêòîâ) - ðàññòîÿíèå îò ìàêñ. (ìèí.) ñâå÷è, íà        |
//| êîòîðîå ïåðåíîñèòñÿ ñòîïëîññ (îò 0), trlinloss - òðàëèòü ëè â    |
//| çîíå óáûòêîâ                                                     |
//+------------------------------------------------------------------+
void TrailingByFractals(int ticket,int tmfrm,int frktl_bars,int indent,bool trlinloss)
   {
   int i, z; // counters
   int extr_n; // íîìåð áëèæàéøåãî ýêñòðåìóìà frktl_bars-áàðíîãî ôðàêòàëà 
   double temp; // ñëóæåáíàÿ ïåðåìåííàÿ
   int after_x, be4_x; // ñâå÷åé ïîñëå è äî ïèêà ñîîòâåòñòâåííî
   int ok_be4, ok_after; // ôëàãè ñîîòâåòñòâèÿ óñëîâèþ (1 - íåïðàâèëüíî, 0 - ïðàâèëüíî)
   int sell_peak_n, buy_peak_n; // íîìåðà ýêñòðåìóìîâ áëèæàéøèõ ôðàêòàëîâ íà ïðîäàæó (äëÿ ïîäæàòèÿ äë.ïîç.) è ïîêóïêó ñîîòâåòñâåííî   
   
   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   if ((frktl_bars<=3) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET)))
      {
      Print("Òðåéëèíã ôóíêöèåé TrailingByFractals() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      } 
   
   temp = frktl_bars;
      
   if (MathMod(frktl_bars,2)==0)
   extr_n = temp/2;
   else                
   extr_n = MathRound(temp/2);
      
   // áàðîâ äî è ïîñëå ýêñòðåìóìà ôðàêòàëà
   after_x = frktl_bars - extr_n;
   if (MathMod(frktl_bars,2)!=0)
   be4_x = frktl_bars - extr_n;
   else
   be4_x = frktl_bars - extr_n - 1;    
   
   // åñëè äëèííàÿ ïîçèöèÿ (OP_BUY), íàõîäèì áëèæàéøèé ôðàêòàë íà ïðîäàæó (ò.å. ýêñòðåìóì "âíèç")
   if (OrderType()==OP_BUY)
      {
      // íàõîäèì ïîñëåäíèé ôðàêòàë íà ïðîäàæó
      for (i=extr_n;i<iBars(Symbol(),tmfrm);i++)
         {
         ok_be4 = 0; ok_after = 0;
         
         for (z=1;z<=be4_x;z++)
            {
            if (iLow(Symbol(),tmfrm,i)>=iLow(Symbol(),tmfrm,i-z)) 
               {
               ok_be4 = 1;
               break;
               }
            }
            
         for (z=1;z<=after_x;z++)
            {
            if (iLow(Symbol(),tmfrm,i)>iLow(Symbol(),tmfrm,i+z)) 
               {
               ok_after = 1;
               break;
               }
            }            
         
         if ((ok_be4==0) && (ok_after==0))                
            {
            sell_peak_n = i; 
            break;
            }
         }
     
      // åñëè òðàëèòü â óáûòêå
      if (trlinloss==true)
         {
         // åñëè íîâûé ñòîïëîññ ëó÷øå èìåþùåãîñÿ (â ò.÷. åñëè ñòîïëîññ == 0, íå âûñòàâëåí)
         // à òàêæå åñëè êóðñ íå ñëèøêîì áëèçêî, íó è åñëè ñòîïëîññ óæå íå áûë ïåðåìåùåí íà ðàññìàòðèâàåìûé óðîâåíü         
         if ((iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point>OrderStopLoss()) && (iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }
      // åñëè òðàëèòü òîëüêî â ïðîôèòå, òî
      else
         {
         // åñëè íîâûé ñòîïëîññ ëó÷øå èìåþùåãîñÿ È êóðñà îòêðûòèÿ, à òàêæå íå ñëèøêîì áëèçêî ê òåêóùåìó êóðñó
         if ((iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point>OrderStopLoss()) && (iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point>OrderOpenPrice()) && (iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL), íàõîäèì áëèæàéøèé ôðàêòàë íà ïîêóïêó (ò.å. ýêñòðåìóì "ââåðõ")
   if (OrderType()==OP_SELL)
      {
      // íàõîäèì ïîñëåäíèé ôðàêòàë íà ïðîäàæó
      for (i=extr_n;i<iBars(Symbol(),tmfrm);i++)
         {
         ok_be4 = 0; ok_after = 0;
         
         for (z=1;z<=be4_x;z++)
            {
            if (iHigh(Symbol(),tmfrm,i)<=iHigh(Symbol(),tmfrm,i-z)) 
               {
               ok_be4 = 1;
               break;
               }
            }
            
         for (z=1;z<=after_x;z++)
            {
            if (iHigh(Symbol(),tmfrm,i)<iHigh(Symbol(),tmfrm,i+z)) 
               {
               ok_after = 1;
               break;
               }
            }            
         
         if ((ok_be4==0) && (ok_after==0))                
            {
            buy_peak_n = i;
            break;
            }
         }        
      
      // åñëè òðàëèòü â óáûòêå
      if (trlinloss==true)
         {
         if (((iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point<OrderStopLoss()) || (OrderStopLoss()==0)) && (iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }      
      // åñëè òðàëèòü òîëüêî â ïðîôèòå, òî
      else
         {
         // åñëè íîâûé ñòîïëîññ ëó÷øå èìåþùåãîñÿ È êóðñà îòêðûòèÿ
         if ((((iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point<OrderStopLoss()) || (OrderStopLoss()==0))) && (iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point<OrderOpenPrice()) && (iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍà ÏÎ ÒÅÍßÌ N ÑÂÅ×ÅÉ                                       |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, êîëè÷åñòâî áàðîâ, ïî òåíÿì     |
//| êîòîðûõ íåîáõîäèìî òðåéëèíãîâàòü (îò 1 è áîëüøå) è îòñòóï        |
//| (ïóíêòîâ) - ðàññòîÿíèå îò ìàêñ. (ìèí.) ñâå÷è, íà êîòîðîå         |
//| ïåðåíîñèòñÿ ñòîïëîññ (îò 0), trlinloss - òðàëèòü ëè â ëîññå      | 
//+------------------------------------------------------------------+
void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent,bool trlinloss)
   {  
   
   int i; // counter
   double new_extremum;
   
   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET)))
      {
      Print("Òðåéëèíã ôóíêöèåé TrailingByShadows() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      } 
   
   // åñëè äëèííàÿ ïîçèöèÿ (OP_BUY), íàõîäèì ìèíèìóì bars_n ñâå÷åé
   if (OrderType()==OP_BUY)
      {
      for(i=1;i<=bars_n;i++)
         {
         if (i==1) new_extremum = iLow(Symbol(),tmfrm,i);
         else 
         if (new_extremum>iLow(Symbol(),tmfrm,i)) new_extremum = iLow(Symbol(),tmfrm,i);
         }         
      
      // åñëè òðàëèì è â çîíå óáûòêîâ
      if (trlinloss==true)
         {
         // åñëè íàéäåííîå çíà÷åíèå "ëó÷øå" òåêóùåãî ñòîïëîññà ïîçèöèè, ïåðåíîñèì 
         if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum - indent*Point,OrderTakeProfit(),OrderExpiration()))            
         Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
         }
      else
         {
         // åñëè íîâûé ñòîïëîññ íå òîëüêî ëó÷øå ïðåäûäóùåãî, íî è êóðñà îòêðûòèÿ ïîçèöèè
         if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice()) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
         }
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL), íàõîäèì ìèíèìóì bars_n ñâå÷åé
   if (OrderType()==OP_SELL)
      {
      for(i=1;i<=bars_n;i++)
         {
         if (i==1) new_extremum = iHigh(Symbol(),tmfrm,i);
         else 
         if (new_extremum<iHigh(Symbol(),tmfrm,i)) new_extremum = iHigh(Symbol(),tmfrm,i);
         }         
           
      // åñëè òðàëèì è â çîíå óáûòêîâ
      if (trlinloss==true)
         {
         // åñëè íàéäåííîå çíà÷åíèå "ëó÷øå" òåêóùåãî ñòîïëîññà ïîçèöèè, ïåðåíîñèì 
         if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
         }
      else
         {
         // åñëè íîâûé ñòîïëîññ íå òîëüêî ëó÷øå ïðåäûäóùåãî, íî è êóðñà îòêðûòèÿ ïîçèöèè
         if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderOpenPrice()) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
         }      
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍà ÑÒÀÍÄÀÐÒÍÛÉ-ÑÒÓÏÅÍ×ÀÑÒÛÉ                                |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ðàññòîÿíèå îò êóðñà îòêðûòèÿ,  |
//| íà êîòîðîì òðåéëèíã çàïóñêàåòñÿ (ïóíêòîâ) è "øàã", ñ êîòîðûì îí  |
//| ïåðåíîñèòñÿ (ïóíêòîâ)                                            |
//| Ïðèìåð: ïðè +30 ñòîï íà +10, ïðè +40 - ñòîï íà +20 è ò.ä.        |
//+------------------------------------------------------------------+

void TrailingStairs(int ticket,int trldistance,int trlstep)
   { 
   
   double nextstair; // áëèæàéøåå çíà÷åíèå êóðñà, ïðè êîòîðîì áóäåì ìåíÿòü ñòîïëîññ

   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   if ((trldistance<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trlstep<1) || (trldistance<trlstep) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
      {
      Print("Òðåéëèíã ôóíêöèåé TrailingStairs() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      } 
   
   // åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
   if (OrderType()==OP_BUY)
      {
      // ðàñ÷èòûâàåì, ïðè êàêîì çíà÷åíèè êóðñà ñëåäóåò ñêîððåêòèðîâàòü ñòîïëîññ
      // åñëè ñòîïëîññ íèæå îòêðûòèÿ èëè ðàâåí 0 (íå âûñòàâëåí), òî áëèæàéøèé óðîâåíü = êóðñ îòêðûòèÿ + trldistance + ñïðýä
      if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()))
      nextstair = OrderOpenPrice() + trldistance*Point;
         
      // èíà÷å áëèæàéøèé óðîâåíü = òåêóùèé ñòîïëîññ + trldistance + trlstep + ñïðýä
      else
      nextstair = OrderStopLoss() + trldistance*Point;

      // åñëè òåêóùèé êóðñ (Bid) >= nextstair è íîâûé ñòîïëîññ òî÷íî ëó÷øå òåêóùåãî, êîððåêòèðóåì ïîñëåäíèé
      if (Bid>=nextstair)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()) && (OrderOpenPrice() + trlstep*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) 
            {
            if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }
      else
         {
         if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
         }
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
   if (OrderType()==OP_SELL)
      { 
      // ðàñ÷èòûâàåì, ïðè êàêîì çíà÷åíèè êóðñà ñëåäóåò ñêîððåêòèðîâàòü ñòîïëîññ
      // åñëè ñòîïëîññ íèæå îòêðûòèÿ èëè ðàâåí 0 (íå âûñòàâëåí), òî áëèæàéøèé óðîâåíü = êóðñ îòêðûòèÿ + trldistance + ñïðýä
      if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
      nextstair = OrderOpenPrice() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
      
      // èíà÷å áëèæàéøèé óðîâåíü = òåêóùèé ñòîïëîññ + trldistance + trlstep + ñïðýä
      else
      nextstair = OrderStopLoss() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
       
      // åñëè òåêóùèé êóðñ (Àñê) >= nextstair è íîâûé ñòîïëîññ òî÷íî ëó÷øå òåêóùåãî, êîððåêòèðóåì ïîñëåäíèé
      if (Ask<=nextstair)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()) && (OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }
      else
         {
         if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
         }
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍà ÑÒÀÍÄÀÐÒÍÛÉ-ÇÀÒßÃÈÂÀÞÙÈÉÑß                              |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, èñõîäíûé òðåéëèíã (ïóíêòîâ) è  |
//| 2 "óðîâíÿ" (çíà÷åíèÿ ïðîôèòà, ïóíêòîâ), ïðè êîòîðûõ òðåéëèíã     |
//| ñîêðàùàåì, è ñîîòâåòñòâóþùèå çíà÷åíèÿ òðåéëèíãà (ïóíêòîâ)        |
//| Ïðèìåð: èñõîäíûé òðåéëèíã 30 ï., ïðè +50 - 20 ï., +80 è áîëüøå - |
//| íà ðàññòîÿíèè â 10 ïóíêòîâ.                                      |
//+------------------------------------------------------------------+

void TrailingUdavka(int ticket,int trl_dist_1,int level_1,int trl_dist_2,int level_2,int trl_dist_3)
   {  
   
   double newstop = 0; // íîâûé ñòîïëîññ
   double trldist; // ðàññòîÿíèå òðåéëèíãà (â çàâèñèìîñòè îò "ïðîéäåííîãî" ìîæåò = trl_dist_1, trl_dist_2 èëè trl_dist_3)

   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   if ((trl_dist_1<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trl_dist_2<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trl_dist_3<MarketInfo(Symbol(),MODE_STOPLEVEL)) || 
   (level_1<=trl_dist_1) || (level_2<=trl_dist_1) || (level_2<=level_1) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
      {
      Print("Òðåéëèíã ôóíêöèåé TrailingUdavka() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      } 
   
   // åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
   if (OrderType()==OP_BUY)
      {
      // åñëè ïðîôèò <=trl_dist_1, òî trldist=trl_dist_1, åñëè ïðîôèò>trl_dist_1 && ïðîôèò<=level_1*Point ...
      if ((Bid-OrderOpenPrice())<=level_1*Point) trldist = trl_dist_1;
      if (((Bid-OrderOpenPrice())>level_1*Point) && ((Bid-OrderOpenPrice())<=level_2*Point)) trldist = trl_dist_2;
      if ((Bid-OrderOpenPrice())>level_2*Point) trldist = trl_dist_3; 
            
      // åñëè ñòîïëîññ = 0 èëè ìåíüøå êóðñà îòêðûòèÿ, òî åñëè òåê.öåíà (Bid) áîëüøå/ðàâíà äèñòàíöèè êóðñ_îòêðûòèÿ+ðàññò.òðåéëèíãà
      if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()))
         {
         if (Bid>(OrderOpenPrice() + trldist*Point))
         newstop = Bid -  trldist*Point;
         }

      // èíà÷å: åñëè òåêóùàÿ öåíà (Bid) áîëüøå/ðàâíà äèñòàíöèè òåêóùèé_ñòîïëîññ+ðàññòîÿíèå òðåéëèíãà, 
      else
         {
         if (Bid>(OrderStopLoss() + trldist*Point))
         newstop = Bid -  trldist*Point;
         }
      
      // ìîäèôèöèðóåì ñòîïëîññ
      if ((newstop>OrderStopLoss()) && (newstop<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         {
         if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
         Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
         }
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
   if (OrderType()==OP_SELL)
      { 
      // åñëè ïðîôèò <=trl_dist_1, òî trldist=trl_dist_1, åñëè ïðîôèò>trl_dist_1 && ïðîôèò<=level_1*Point ...
      if ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))<=level_1*Point) trldist = trl_dist_1;
      if (((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))>level_1*Point) && ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))<=level_2*Point)) trldist = trl_dist_2;
      if ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))>level_2*Point) trldist = trl_dist_3; 
            
      // åñëè ñòîïëîññ = 0 èëè ìåíüøå êóðñà îòêðûòèÿ, òî åñëè òåê.öåíà (Ask) áîëüøå/ðàâíà äèñòàíöèè êóðñ_îòêðûòèÿ+ðàññò.òðåéëèíãà
      if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
         {
         if (Ask<(OrderOpenPrice() - (trldist + MarketInfo(Symbol(),MODE_SPREAD))*Point))
         newstop = Ask + trldist*Point;
         }

      // èíà÷å: åñëè òåêóùàÿ öåíà (Bid) áîëüøå/ðàâíà äèñòàíöèè òåêóùèé_ñòîïëîññ+ðàññòîÿíèå òðåéëèíãà, 
      else
         {
         if (Ask<(OrderStopLoss() - (trldist + MarketInfo(Symbol(),MODE_SPREAD))*Point))
         newstop = Ask +  trldist*Point;
         }
            
       // ìîäèôèöèðóåì ñòîïëîññ
      if (newstop>0)
         {
         if (((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice())) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         else
            {
            if ((newstop<OrderStopLoss()) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))  
               {
               if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
               Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
               }
            }
         }
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÂÐÅÌÅÍÈ                                              |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, èíòåðâàë (ìèíóò), ñ êîòîðûì,   |
//| ïåðåäâèãàåòñÿ ñòîïëîññ è øàã òðåéëèíãà (íà ñêîëüêî ïóíêòîâ       |
//| ïåðåìåùàåòñÿ ñòîïëîññ, trlinloss - òðàëèì ëè â óáûòêå            |
//| (ò.å. ñ îïðåäåë¸ííûì èíòåðâàëîì ïîäòÿãèâàåì ñòîï äî êóðñà        |
//| îòêðûòèÿ, à ïîòîì è â ïðîôèòå, ëèáî òîëüêî â ïðîôèòå)            |
//+------------------------------------------------------------------+
void TrailingByTime(int ticket,int interval,int trlstep,bool trlinloss)
   {
      
   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   if ((ticket==0) || (interval<1) || (trlstep<1) || !OrderSelect(ticket,SELECT_BY_TICKET))
      {
      Print("Òðåéëèíã ôóíêöèåé TrailingByTime() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      }
      
   double minpast; // êîë-âî ïîëíûõ ìèíóò îò îòêðûòèÿ ïîçèöèè äî òåêóùåãî ìîìåíòà 
   double times2change; // êîë-âî èíòåðâàëîâ interval ñ ìîìåíòà îòêðûòèÿ ïîçèöèè (ò.å. ñêîëüêî ðàç äîëæåí áûë áûòü ïåðåìåùåí ñòîïëîññ) 
   double newstop; // íîâîå çíà÷åíèå ñòîïëîññà (ó÷èòûâàÿ êîë-âî ïåðåíîñîâ, êîòîðûå äîëæíû áûëè èìåòü ìåñòî)
   
   // îïðåäåëÿåì, ñêîëüêî âðåìåíè ïðîøëî ñ ìîìåíòà îòêðûòèÿ ïîçèöèè
   minpast = (TimeCurrent() - OrderOpenTime()) / 60;
      
   // ñêîëüêî ðàç íóæíî áûëî ïåðåäâèíóòü ñòîïëîññ
   times2change = MathFloor(minpast / interval);
         
   // åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
   if (OrderType()==OP_BUY)
      {
      // åñëè òðàëèì â óáûòêå, òî îòñòóïàåì îò ñòîïëîññà (åñëè îí íå 0, åñëè 0 - îò îòêðûòèÿ)
      if (trlinloss==true)
         {
         if (OrderStopLoss()==0) newstop = OrderOpenPrice() + times2change*(trlstep*Point);
         else newstop = OrderStopLoss() + times2change*(trlstep*Point); 
         }
      else
      // èíà÷å - îò êóðñà îòêðûòèÿ ïîçèöèè
      newstop = OrderOpenPrice() + times2change*(trlstep*Point); 
         
      if (times2change>0)
         {
         if ((newstop>OrderStopLoss()) && (newstop<Bid- MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
   if (OrderType()==OP_SELL)
      {
      // åñëè òðàëèì â óáûòêå, òî îòñòóïàåì îò ñòîïëîññà (åñëè îí íå 0, åñëè 0 - îò îòêðûòèÿ)
      if (trlinloss==true)
         {
         if (OrderStopLoss()==0) newstop = OrderOpenPrice() - times2change*(trlstep*Point) - MarketInfo(Symbol(),MODE_SPREAD)*Point;
         else newstop = OrderStopLoss() - times2change*(trlstep*Point) - MarketInfo(Symbol(),MODE_SPREAD)*Point;
         }
      else
      newstop = OrderOpenPrice() - times2change*(trlstep*Point) - MarketInfo(Symbol(),MODE_SPREAD)*Point;
                
      if (times2change>0)
         {
         if (((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice())) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         else
         if ((newstop<OrderStopLoss()) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ATR (Average True Range, Ñðåäíèé èñòèííûé äèàïàçîí)  |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ïåðèîä ÀÒR è êîýôôèöèåíò, íà   |
//| êîòîðûé óìíîæàåòñÿ ATR. Ò.î. ñòîïëîññ "òÿíåòñÿ" íà ðàññòîÿíèè    |
//| ATR õ N îò òåêóùåãî êóðñà; ïåðåíîñ - íà íîâîì áàðå (ò.å. îò öåíû |
//| îòêðûòèÿ î÷åðåäíîãî áàðà)                                        |
//+------------------------------------------------------------------+
void TrailingByATR(int ticket,int atr_timeframe,int atr1_period,int atr1_shift,int atr2_period,int atr2_shift,double coeff,bool trlinloss)
   {
   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ   
   if ((ticket==0) || (atr1_period<1) || (atr2_period<1) || (coeff<=0) || (!OrderSelect(ticket,SELECT_BY_TICKET)) || 
   ((atr_timeframe!=1) && (atr_timeframe!=5) && (atr_timeframe!=15) && (atr_timeframe!=30) && (atr_timeframe!=60) && 
   (atr_timeframe!=240) && (atr_timeframe!=1440) && (atr_timeframe!=10080) && (atr_timeframe!=43200)) || (atr1_shift<0) || (atr2_shift<0))
      {
      Print("Òðåéëèíã ôóíêöèåé TrailingByATR() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      }
   
   double curr_atr1; // òåêóùåå çíà÷åíèå ATR - 1
   double curr_atr2; // òåêóùåå çíà÷åíèå ATR - 2
   double best_atr; // áîëüøåå èç çíà÷åíèé ATR
   double atrXcoeff; // ðåçóëüòàò óìíîæåíèÿ áîëüøåãî èç ATR íà êîýôôèöèåíò
   double newstop; // íîâûé ñòîïëîññ
   
   // òåêóùåå çíà÷åíèå ATR-1, ATR-2
   curr_atr1 = iATR(Symbol(),atr_timeframe,atr1_period,atr1_shift);
   curr_atr2 = iATR(Symbol(),atr_timeframe,atr2_period,atr2_shift);
   
   // áîëüøåå èç çíà÷åíèé
   best_atr = MathMax(curr_atr1,curr_atr2);
   
   // ïîñëå óìíîæåíèÿ íà êîýôôèöèåíò
   atrXcoeff = best_atr * coeff;
              
   // åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
   if (OrderType()==OP_BUY)
      {
      // îòêëàäûâàåì îò òåêóùåãî êóðñà (íîâûé ñòîïëîññ)
      newstop = Bid - atrXcoeff;           
      
      // åñëè trlinloss==true (ò.å. ñëåäóåò òðàëèòü â çîíå ëîññîâ), òî
      if (trlinloss==true)      
         {
         // åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì â ëþáîì ñëó÷àå
         if ((OrderStopLoss()==0) && (newstop<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         // èíà÷å òðàëèì òîëüêî åñëè íîâûé ñòîï ëó÷øå ñòàðîãî
         else
            {
            if ((newstop>OrderStopLoss()) && (newstop<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }
      else
         {
         // åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì, åñëè ñòîï ëó÷øå îòêðûòèÿ
         if ((OrderStopLoss()==0) && (newstop>OrderOpenPrice()) && (newstop<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         // åñëè ñòîï íå ðàâåí 0, òî ìåíÿåì åãî, åñëè îí ëó÷øå ïðåäûäóùåãî è êóðñà îòêðûòèÿ
         else
            {
            if ((newstop>OrderStopLoss()) && (newstop>OrderOpenPrice()) && (newstop<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
   if (OrderType()==OP_SELL)
      {
      // îòêëàäûâàåì îò òåêóùåãî êóðñà (íîâûé ñòîïëîññ)
      newstop = Ask + atrXcoeff;
      
      // åñëè trlinloss==true (ò.å. ñëåäóåò òðàëèòü â çîíå ëîññîâ), òî
      if (trlinloss==true)      
         {
         // åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì â ëþáîì ñëó÷àå
         if ((OrderStopLoss()==0) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         // èíà÷å òðàëèì òîëüêî åñëè íîâûé ñòîï ëó÷øå ñòàðîãî
         else
            {
            if ((newstop<OrderStopLoss()) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }
      else
         {
         // åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì, åñëè ñòîï ëó÷øå îòêðûòèÿ
         if ((OrderStopLoss()==0) && (newstop<OrderOpenPrice()) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         // åñëè ñòîï íå ðàâåí 0, òî ìåíÿåì åãî, åñëè îí ëó÷øå ïðåäûäóùåãî è êóðñà îòêðûòèÿ
         else
            {
            if ((newstop<OrderStopLoss()) && (newstop<OrderOpenPrice()) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü îðäåð ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ RATCHET ÁÀÐÈØÏÎËÜÖÀ                                     |
//| Ïðè äîñòèæåíèè ïðîôèòîì óðîâíÿ 1 ñòîïëîññ - â +1, ïðè äîñòèæåíèè |
//| ïðîôèòîì óðîâíÿ 2 ïðîôèòà - ñòîïëîññ - íà óðîâåíü 1, êîãäà       |
//| ïðîôèò äîñòèãàåò óðîâíÿ 3 ïðîôèòà, ñòîïëîññ - íà óðîâåíü 2       |
//| (äàëüøå ìîæíî òðåéëèòü äðóãèìè ìåòîäàìè)                         |
//| ïðè ðàáîòå â ëîññîâîì ó÷àñòêå - òîæå 3 óðîâíÿ, íî ñõåìà ðàáîòû   |
//| ñ íèìè íåñêîëüêî èíàÿ, à èìåííî: åñëè ìû îïóñòèëèñü íèæå óðîâíÿ, |
//| à ïîòîì ïîäíÿëèñü âûøå íåãî (ïðèìåð äëÿ ïîêóïêè), òî ñòîïëîññ    |
//| ñòàâèì íà ñëåäóþùèé, áîëåå ãëóáîêèé óðîâåíü (íàïðèìåð, óðîâíè    |
//| -5, -10 è -25, ñòîïëîññ -40; åñëè îïóñòèëèñü íèæå -10, à ïîòîì   |
//| ïîäíÿëèñü âûøå -10, òî ñòîïëîññ - íà -25, åñëè ïîäíèìåìñÿ âûùå   |
//| -5, òî ñòîïëîññ ïåðåíåñåì íà -10, ïðè -2 (ñïðýä) ñòîï íà -5      |
//| ðàáîòàåì òîëüêî ñ îäíîé ïîçèöèåé îäíîâðåìåííî                    |
//+------------------------------------------------------------------+
void TrailingRatchetB(int ticket,int pf_level_1,int pf_level_2,int pf_level_3,int ls_level_1,int ls_level_2,int ls_level_3,bool trlinloss)
   {
    
   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   if ((ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET)) || (pf_level_2<=pf_level_1) || (pf_level_3<=pf_level_2) || 
   (pf_level_3<=pf_level_1) || (pf_level_2-pf_level_1<=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) || (pf_level_3-pf_level_2<=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) ||
   (pf_level_1<=MarketInfo(Symbol(),MODE_STOPLEVEL)))
      {
      Print("Òðåéëèíã ôóíêöèåé TrailingRatchetB() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      }
                
   // åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
   if (OrderType()==OP_BUY)
      {
      double dBid = MarketInfo(Symbol(),MODE_BID);
      
      // Ðàáîòàåì íà ó÷àñòêå ïðîôèòîâ
      
      // åñëè ðàçíèöà "òåêóùèé_êóðñ-êóðñ_îòêðûòèÿ" áîëüøå ÷åì "pf_level_3+ñïðýä", ñòîïëîññ ïåðåíîñèì â "pf_level_2+ñïðýä"
      if ((dBid-OrderOpenPrice())>=pf_level_3*Point)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice() + pf_level_2 *Point))
         OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + pf_level_2*Point,OrderTakeProfit(),OrderExpiration());
         }
      else
      // åñëè ðàçíèöà "òåêóùèé_êóðñ-êóðñ_îòêðûòèÿ" áîëüøå ÷åì "pf_level_2+ñïðýä", ñòîïëîññ ïåðåíîñèì â "pf_level_1+ñïðýä"
      if ((dBid-OrderOpenPrice())>=pf_level_2*Point)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice() + pf_level_1*Point))
         OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + pf_level_1*Point,OrderTakeProfit(),OrderExpiration());
         }
      else        
      // åñëè ðàçíèöà "òåêóùèé_êóðñ-êóðñ_îòêðûòèÿ" áîëüøå ÷åì "pf_level_1+ñïðýä", ñòîïëîññ ïåðåíîñèì â +1 ("îòêðûòèå + ñïðýä")
      if ((dBid-OrderOpenPrice())>=pf_level_1*Point)
      // åñëè ñòîïëîññ íå îïðåäåëåí èëè õóæå ÷åì "îòêðûòèå+1"
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice() + 1*Point))
         OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + 1*Point,OrderTakeProfit(),OrderExpiration());
         }

      // Ðàáîòàåì íà ó÷àñòêå ëîññîâ
      if (trlinloss==true)      
         {
         // Ãëîáàëüíàÿ ïåðåìåííàÿ òåðìèíàëà ñîäåðæèò çíà÷åíèå ñàìîãî óðîâíÿ óáûòêà (ls_level_n), íèæå êîòîðîãî îïóñêàëñÿ êóðñ
         // (åñëè îí ïîñëå ýòîãî ïîäíèìàåòñÿ âûøå, óñòàíàâëèâàåì ñòîïëîññ íà áëèæàéøåì áîëåå ãëóáîêîì óðîâíå óáûòêà (åñëè ýòî íå íà÷àëüíûé ñòîïëîññ ïîçèöèè)
         // Ñîçäà¸ì ãëîáàëüíóþ ïåðåìåííóþ (îäèí ðàç)
         if(!GlobalVariableCheck("zeticket")) 
            {
            GlobalVariableSet("zeticket",ticket);
            // ïðè ñîçäàíèè ïðèñâîèì åé "0"
            GlobalVariableSet("dpstlslvl",0);
            }
         // åñëè ðàáîòàåì ñ íîâîé ñäåëêîé (íîâûé òèêåò), çàòèðàåì çíà÷åíèå dpstlslvl
         if (GlobalVariableGet("zeticket")!=ticket)
            {
            GlobalVariableSet("dpstlslvl",0);
            GlobalVariableSet("zeticket",ticket);
            }
      
         // óáûòî÷íûì ñ÷èòàåì ó÷àñòîê íèæå êóðñà îòêðûòèÿ è äî ïåðâîãî óðîâíÿ ïðîôèòà
         if ((dBid-OrderOpenPrice())<pf_level_1*Point)         
            {
            // åñëè (òåêóùèé_êóðñ ëó÷øå/ðàâíî îòêðûòèå) è (dpstlslvl>=ls_level_1), ñòîïëîññ - íà ls_level_1
            if (dBid>=OrderOpenPrice()) 
            if ((OrderStopLoss()==0) || (OrderStopLoss()<(OrderOpenPrice()-ls_level_1*Point)))
            OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice()-ls_level_1*Point,OrderTakeProfit(),OrderExpiration());
      
            // åñëè (òåêóùèé_êóðñ ëó÷øå óðîâíÿ_óáûòêà_1) è (dpstlslvl>=ls_level_1), ñòîïëîññ - íà ls_level_2
            if ((dBid>=OrderOpenPrice()-ls_level_1*Point) && (GlobalVariableGet("dpstlslvl")>=ls_level_1))
            if ((OrderStopLoss()==0) || (OrderStopLoss()<(OrderOpenPrice()-ls_level_2*Point)))
            OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice()-ls_level_2*Point,OrderTakeProfit(),OrderExpiration());
      
            // åñëè (òåêóùèé_êóðñ ëó÷øå óðîâíÿ_óáûòêà_2) è (dpstlslvl>=ls_level_2), ñòîïëîññ - íà ls_level_3
            if ((dBid>=OrderOpenPrice()-ls_level_2*Point) && (GlobalVariableGet("dpstlslvl")>=ls_level_2))
            if ((OrderStopLoss()==0) || (OrderStopLoss()<(OrderOpenPrice()-ls_level_3*Point)))
            OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice()-ls_level_3*Point,OrderTakeProfit(),OrderExpiration());
      
            // ïðîâåðèì/îáíîâèì çíà÷åíèå íàèáîëåå ãëóáîêîé "âçÿòîé" ëîññîâîé "ñòóïåíüêè"
            // åñëè "òåêóùèé_êóðñ-êóðñ îòêðûòèÿ+ñïðýä" ìåíüøå 0, 
            if ((dBid-OrderOpenPrice()+MarketInfo(Symbol(),MODE_SPREAD)*Point)<0)
            // ïðîâåðèì, íå ìåíüøå ëè îí òîãî èëè èíîãî óðîâíÿ óáûòêà
               {
               if (dBid<=OrderOpenPrice()-ls_level_3*Point)
               if (GlobalVariableGet("dpstlslvl")<ls_level_3)
               GlobalVariableSet("dpstlslvl",ls_level_3);
               else
               if (dBid<=OrderOpenPrice()-ls_level_2*Point)
               if (GlobalVariableGet("dpstlslvl")<ls_level_2)
               GlobalVariableSet("dpstlslvl",ls_level_2);   
               else
               if (dBid<=OrderOpenPrice()-ls_level_1*Point)
               if (GlobalVariableGet("dpstlslvl")<ls_level_1)
               GlobalVariableSet("dpstlslvl",ls_level_1);
               }
            } // end of "if ((dBid-OrderOpenPrice())<pf_level_1*Point)"
         } // end of "if (trlinloss==true)"
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
   if (OrderType()==OP_SELL)
      {
      double dAsk = MarketInfo(Symbol(),MODE_ASK);
      
      // Ðàáîòàåì íà ó÷àñòêå ïðîôèòîâ
      
      // åñëè ðàçíèöà "òåêóùèé_êóðñ-êóðñ_îòêðûòèÿ" áîëüøå ÷åì "pf_level_3+ñïðýä", ñòîïëîññ ïåðåíîñèì â "pf_level_2+ñïðýä"
      if ((OrderOpenPrice()-dAsk)>=pf_level_3*Point)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice() - (pf_level_2 + MarketInfo(Symbol(),MODE_SPREAD))*Point))
         OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (pf_level_2 + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
         }
      else
      // åñëè ðàçíèöà "òåêóùèé_êóðñ-êóðñ_îòêðûòèÿ" áîëüøå ÷åì "pf_level_2+ñïðýä", ñòîïëîññ ïåðåíîñèì â "pf_level_1+ñïðýä"
      if ((OrderOpenPrice()-dAsk)>=pf_level_2*Point)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice() - (pf_level_1 + MarketInfo(Symbol(),MODE_SPREAD))*Point))
         OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (pf_level_1 + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
         }
      else        
      // åñëè ðàçíèöà "òåêóùèé_êóðñ-êóðñ_îòêðûòèÿ" áîëüøå ÷åì "pf_level_1+ñïðýä", ñòîïëîññ ïåðåíîñèì â +1 ("îòêðûòèå + ñïðýä")
      if ((OrderOpenPrice()-dAsk)>=pf_level_1*Point)
      // åñëè ñòîïëîññ íå îïðåäåëåí èëè õóæå ÷åì "îòêðûòèå+1"
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice() - (1 + MarketInfo(Symbol(),MODE_SPREAD))*Point))
         OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (1 + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
         }

      // Ðàáîòàåì íà ó÷àñòêå ëîññîâ
      if (trlinloss==true)      
         {
         // Ãëîáàëüíàÿ ïåðåìåííàÿ òåðìèíàëà ñîäåðæèò çíà÷åíèå ñàìîãî óðîâíÿ óáûòêà (ls_level_n), íèæå êîòîðîãî îïóñêàëñÿ êóðñ
         // (åñëè îí ïîñëå ýòîãî ïîäíèìàåòñÿ âûøå, óñòàíàâëèâàåì ñòîïëîññ íà áëèæàéøåì áîëåå ãëóáîêîì óðîâíå óáûòêà (åñëè ýòî íå íà÷àëüíûé ñòîïëîññ ïîçèöèè)
         // Ñîçäà¸ì ãëîáàëüíóþ ïåðåìåííóþ (îäèí ðàç)
         if(!GlobalVariableCheck("zeticket")) 
            {
            GlobalVariableSet("zeticket",ticket);
            // ïðè ñîçäàíèè ïðèñâîèì åé "0"
            GlobalVariableSet("dpstlslvl",0);
            }
         // åñëè ðàáîòàåì ñ íîâîé ñäåëêîé (íîâûé òèêåò), çàòèðàåì çíà÷åíèå dpstlslvl
         if (GlobalVariableGet("zeticket")!=ticket)
            {
            GlobalVariableSet("dpstlslvl",0);
            GlobalVariableSet("zeticket",ticket);
            }
      
         // óáûòî÷íûì ñ÷èòàåì ó÷àñòîê íèæå êóðñà îòêðûòèÿ è äî ïåðâîãî óðîâíÿ ïðîôèòà
         if ((OrderOpenPrice()-dAsk)<pf_level_1*Point)         
            {
            // åñëè (òåêóùèé_êóðñ ëó÷øå/ðàâíî îòêðûòèå) è (dpstlslvl>=ls_level_1), ñòîïëîññ - íà ls_level_1
            if (dAsk<=OrderOpenPrice()) 
            if ((OrderStopLoss()==0) || (OrderStopLoss()>(OrderOpenPrice() + (ls_level_1 + MarketInfo(Symbol(),MODE_SPREAD))*Point)))
            OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + (ls_level_1 + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
      
            // åñëè (òåêóùèé_êóðñ ëó÷øå óðîâíÿ_óáûòêà_1) è (dpstlslvl>=ls_level_1), ñòîïëîññ - íà ls_level_2
            if ((dAsk<=OrderOpenPrice() + (ls_level_1 + MarketInfo(Symbol(),MODE_SPREAD))*Point) && (GlobalVariableGet("dpstlslvl")>=ls_level_1))
            if ((OrderStopLoss()==0) || (OrderStopLoss()>(OrderOpenPrice() + (ls_level_2 + MarketInfo(Symbol(),MODE_SPREAD))*Point)))
            OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + (ls_level_2 + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
      
            // åñëè (òåêóùèé_êóðñ ëó÷øå óðîâíÿ_óáûòêà_2) è (dpstlslvl>=ls_level_2), ñòîïëîññ - íà ls_level_3
            if ((dAsk<=OrderOpenPrice() + (ls_level_2 + MarketInfo(Symbol(),MODE_SPREAD))*Point) && (GlobalVariableGet("dpstlslvl")>=ls_level_2))
            if ((OrderStopLoss()==0) || (OrderStopLoss()>(OrderOpenPrice() + (ls_level_3 + MarketInfo(Symbol(),MODE_SPREAD))*Point)))
            OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + (ls_level_3 + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
      
            // ïðîâåðèì/îáíîâèì çíà÷åíèå íàèáîëåå ãëóáîêîé "âçÿòîé" ëîññîâîé "ñòóïåíüêè"
            // åñëè "òåêóùèé_êóðñ-êóðñ îòêðûòèÿ+ñïðýä" ìåíüøå 0, 
            if ((OrderOpenPrice()-dAsk+MarketInfo(Symbol(),MODE_SPREAD)*Point)<0)
            // ïðîâåðèì, íå ìåíüøå ëè îí òîãî èëè èíîãî óðîâíÿ óáûòêà
               {
               if (dAsk>=OrderOpenPrice()+(ls_level_3+MarketInfo(Symbol(),MODE_SPREAD))*Point)
               if (GlobalVariableGet("dpstlslvl")<ls_level_3)
               GlobalVariableSet("dpstlslvl",ls_level_3);
               else
               if (dAsk>=OrderOpenPrice()+(ls_level_2+MarketInfo(Symbol(),MODE_SPREAD))*Point)
               if (GlobalVariableGet("dpstlslvl")<ls_level_2)
               GlobalVariableSet("dpstlslvl",ls_level_2);   
               else
               if (dAsk>=OrderOpenPrice()+(ls_level_1+MarketInfo(Symbol(),MODE_SPREAD))*Point)
               if (GlobalVariableGet("dpstlslvl")<ls_level_1)
               GlobalVariableSet("dpstlslvl",ls_level_1);
               }
            } // end of "if ((dBid-OrderOpenPrice())<pf_level_1*Point)"
         } // end of "if (trlinloss==true)"
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÖÅÍÂÎÌÓ ÊÀÍÀËÓ                                       |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ïåðèîä (êîë-âî áàðîâ) äëÿ      | 
//| ðàññ÷åòà âåðõíåé è íèæíåé ãðàíèö êàíàëà, îòñòóï (ïóíêòîâ), íà    |
//| êîòîðîì ðàçìåùàåòñÿ ñòîïëîññ îò ãðàíèöû êàíàëà                   |
//| Òðåéëèíã ïî çàêðûâøèìñÿ áàðàì.                                   |
//+------------------------------------------------------------------+
void TrailingByPriceChannel(int iTicket,int iBars_n,int iIndent)
   {     
   
   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   if ((iBars_n<1) || (iIndent<0) || (iTicket==0) || (!OrderSelect(iTicket,SELECT_BY_TICKET)))
      {
      Print("Òðåéëèíã ôóíêöèåé TrailingByPriceChannel() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      } 
   
   double   dChnl_max; // âåðõíÿÿ ãðàíèöà êàíàëà
   double   dChnl_min; // íèæíÿÿ ãðàíèöà êàíàëà
   
   // îïðåäåëÿåì ìàêñ.õàé è ìèí.ëîó çà iBars_n áàðîâ íà÷èíàÿ ñ [1] (= âåðõíÿÿ è íèæíÿÿ ãðàíèöû öåíîâîãî êàíàëà)
   dChnl_max = High[iHighest(Symbol(),0,2,iBars_n,1)] + (iIndent+MarketInfo(Symbol(),MODE_SPREAD))*Point;
   dChnl_min = Low[iLowest(Symbol(),0,1,iBars_n,1)] - iIndent*Point;   
   
   // åñëè äëèííàÿ ïîçèöèÿ, è å¸ ñòîïëîññ õóæå (íèæå íèæíåé ãðàíèöû êàíàëà ëèáî íå îïðåäåëåí, ==0), ìîäèôèöèðóåì åãî
   if (OrderType()==OP_BUY)
      {
      if ((OrderStopLoss()<dChnl_min) && (dChnl_min<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         {
         if (!OrderModify(iTicket,OrderOpenPrice(),dChnl_min,OrderTakeProfit(),OrderExpiration()))
         Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
         }
      }
   
   // åñëè ïîçèöèÿ - êîðîòêàÿ, è å¸ ñòîïëîññ õóæå (âûøå âåðõíåé ãðàíèöû êàíàëà èëè íå îïðåäåë¸í, ==0), ìîäèôèöèðóåì åãî
   if (OrderType()==OP_SELL)
      {
      if (((OrderStopLoss()==0) || (OrderStopLoss()>dChnl_max)) && (dChnl_min>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         {
         if (!OrderModify(iTicket,OrderOpenPrice(),dChnl_max,OrderTakeProfit(),OrderExpiration()))
         Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
         }
      }
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÑÊÎËÜÇßÙÅÌÓ ÑÐÅÄÍÅÌÓ                                 |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè è ïàðàìåòðû ñðåäíåé (òàéìôðåéì, | 
//| ïåðèîä, òèï, ñäâèã îòíîñèòåëüíî ãðàôèêà, ìåòîä ñãëàæèâàíèÿ,      |
//| ñîñòàâëÿþùàÿ OHCL äëÿ ïîñòðîåíèÿ, ¹ áàðà, íà êîòîðîì áåðåòñÿ     |
//| çíà÷åíèå ñðåäíåé.                                                |
//+------------------------------------------------------------------+

//    Äîïóñòèìûå âàðèàíòû ââîäà:   
//    iTmFrme:    1 (M1), 5 (M5), 15 (M15), 30 (M30), 60 (H1), 240 (H4), 1440 (D), 10080 (W), 43200 (MN);
//    iMAPeriod:  2-infinity, öåëûå ÷èñëà; 
//    iMAShift:   öåëûå ïîëîæèòåëüíûå èëè îòðèöàòåëüíûå ÷èñëà, à òàêæå 0;
//    MAMethod:   0 (MODE_SMA), 1 (MODE_EMA), 2 (MODE_SMMA), 3 (MODE_LWMA);
//    iApplPrice: 0 (PRICE_CLOSE), 1 (PRICE_OPEN), 2 (PRICE_HIGH), 3 (PRICE_LOW), 4 (PRICE_MEDIAN), 5 (PRICE_TYPICAL), 6 (PRICE_WEIGHTED)
//    iShift:     0-Bars, öåëûå ÷èñëà;
//    iIndent:    0-infinity, öåëûå ÷èñëà;

void TrailingByMA(int iTicket,int iTmFrme,int iMAPeriod,int iMAShift,int MAMethod,int iApplPrice,int iShift,int iIndent)
   {     
   
   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   if ((iTicket==0) || (!OrderSelect(iTicket,SELECT_BY_TICKET)) || ((iTmFrme!=1) && (iTmFrme!=5) && (iTmFrme!=15) && (iTmFrme!=30) && (iTmFrme!=60) && (iTmFrme!=240) && (iTmFrme!=1440) && (iTmFrme!=10080) && (iTmFrme!=43200)) ||
   (iMAPeriod<2) || (MAMethod<0) || (MAMethod>3) || (iApplPrice<0) || (iApplPrice>6) || (iShift<0) || (iIndent<0))
      {
      Print("Òðåéëèíã ôóíêöèåé TrailingByMA() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      } 

   double   dMA; // çíà÷åíèå ñêîëüçÿùåãî ñðåäíåãî ñ ïåðåäàííûìè ïàðàìåòðàìè
   
   // îïðåäåëèì çíà÷åíèå ÌÀ ñ ïåðåäàííûìè ôóíêöèè ïàðàìåòðàìè
   dMA = iMA(Symbol(),iTmFrme,iMAPeriod,iMAShift,MAMethod,iApplPrice,iShift);
         
   // åñëè äëèííàÿ ïîçèöèÿ, è å¸ ñòîïëîññ õóæå çíà÷åíèÿ ñðåäíåãî ñ îòñòóïîì â iIndent ïóíêòîâ, ìîäèôèöèðóåì åãî
   if (OrderType()==OP_BUY)
      {
      if ((OrderStopLoss()<dMA-iIndent*Point) && (dMA-iIndent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         {
         if (!OrderModify(iTicket,OrderOpenPrice(),dMA-iIndent*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
         }
      }
   
   // åñëè ïîçèöèÿ - êîðîòêàÿ, è å¸ ñòîïëîññ õóæå (âûøå âåðõíåé ãðàíèöû êàíàëà èëè íå îïðåäåë¸í, ==0), ìîäèôèöèðóåì åãî
   if (OrderType()==OP_SELL)
      {
      if (((OrderStopLoss()==0) || (OrderStopLoss()>dMA+(MarketInfo(Symbol(),MODE_SPREAD)+iIndent)*Point)) && (dMA+(MarketInfo(Symbol(),MODE_SPREAD)+iIndent)*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         {
         if (!OrderModify(iTicket,OrderOpenPrice(),dMA+(MarketInfo(Symbol(),MODE_SPREAD)+iIndent)*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
         }
      }
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ "ÏÎËÎÂÈÍßÙÈÉ"                                           |
//| Ïî çàêðûòèè î÷åðåäíîãî ïåðèîäà (áàðà) ïîäòÿãèâàåì ñòîïëîññ íà    |
//| ïîëîâèíó (íî ìîæíî è ëþáîé èíîé êîýôôèöèåíò) äèñòàíöèè, ïðîé-    |
//| äåííîé êóðñîì (ò.å., íàïðèìåð, ïî çàêðûòèè ñóòîê ïðîôèò +55 ï. - |
//| ñòîïëîññ ïåðåíîñèì â 55/2=27 ï. Åñëè ïî çàêðûòèè ñëåä.           |
//| ñóòîê ïðîôèò äîñòèã, äîïóñòèì, +80 ï., òî ñòîïëîññ ïåðåíîñèì íà  |
//| ïîëîâèíó (íàïð.) ðàññòîÿíèÿ ìåæäó òåê. ñòîïëîññîì è êóðñîì íà    |
//| çàêðûòèè áàðà - 27 + (80-27)/2 = 27 + 53/2 = 27 + 26 = 53 ï.     |
//| iTicket - òèêåò ïîçèöèè; iTmFrme - òàéìôðåéì (â ìèíóòàõ, öèôðàìè |
//| dCoeff - "êîýôôèöèåíò ïîäæàòèÿ", â % îò 0.01 äî 1 (â ïîñëåäíåì   |
//| ñëó÷àå ñòîïëîññ áóäåò ïåðåíåñåí (åñëè ïîëó÷èòñÿ) âïëîòíóþ ê òåê. |
//| êóðñó è ïîçèöèÿ, ñêîðåå âñåãî, ñðàçó æå çàêðîåòñÿ)               |
//| bTrlinloss - ñòîèò ëè òðàëèòü íà ëîññîâîì ó÷àñòêå - åñëè äà, òî  |
//| ïî çàêðûòèþ î÷åðåäíîãî áàðà ðàññòîÿíèå ìåæäó ñòîïëîññîì (â ò.÷.  |
//| "äî" áåçóáûòêà) è òåêóùèì êóðñîì áóäåò ñîêðàùàòüñÿ â dCoeff ðàç  |
//| ÷òîáû ïîñë. âàðèàíò ðàáîòàë, îáÿçàòåëüíî äîëæåí áûòü îïðåäåë¸í   |
//| ñòîïëîññ (íå ðàâåí 0)                                            |
//+------------------------------------------------------------------+

void TrailingFiftyFifty(int iTicket,int iTmFrme,double dCoeff,bool bTrlinloss)
   { 
   // àêòèâèðóåì òðåéëèíã òîëüêî ïî çàêðûòèè áàðà
   if (sdtPrevtime == iTime(Symbol(),iTmFrme,0)) return(0);
   else
      {
      sdtPrevtime = iTime(Symbol(),iTmFrme,0);             
      
      // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
      if ((iTicket==0) || (!OrderSelect(iTicket,SELECT_BY_TICKET)) || 
      ((iTmFrme!=1) && (iTmFrme!=5) && (iTmFrme!=15) && (iTmFrme!=30) && (iTmFrme!=60) && (iTmFrme!=240) && 
      (iTmFrme!=1440) && (iTmFrme!=10080) && (iTmFrme!=43200)) || (dCoeff<0.01) || (dCoeff>1.0))
         {
         Print("Òðåéëèíã ôóíêöèåé TrailingFiftyFifty() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
         return(0);
         }
         
      // íà÷èíàåì òðàëèòü - ñ ïåðâîãî áàðà ïîñëå îòêðûâàþùåãî (èíà÷å ïðè bTrlinloss ñðàçó æå ïîñëå îòêðûòèÿ 
      // ïîçèöèè ñòîïëîññ áóäåò ïåðåíåñåí íà ïîëîâèíó ðàññòîÿíèÿ ìåæäó ñòîïëîññîì è êóðñîì îòêðûòèÿ)
      // ò.å. ðàáîòàåì òîëüêî ïðè óñëîâèè, ÷òî ñ ìîìåíòà OrderOpenTime() ïðîøëî íå ìåíåå iTmFrme ìèíóò
      if (iTime(Symbol(),iTmFrme,0)>OrderOpenTime())
      {         
      
      double dBid = MarketInfo(Symbol(),MODE_BID);
      double dAsk = MarketInfo(Symbol(),MODE_ASK);
      double dNewSl;
      double dNexMove;     
      
      // äëÿ äëèííîé ïîçèöèè ïåðåíîñèì ñòîïëîññ íà dCoeff äèñòàíöèè îò êóðñà îòêðûòèÿ äî Bid íà ìîìåíò îòêðûòèÿ áàðà
      // (åñëè òàêîé ñòîïëîññ ëó÷øå èìåþùåãîñÿ è èçìåíÿåò ñòîïëîññ â ñòîðîíó ïðîôèòà)
      if (OrderType()==OP_BUY)
         {
         if ((bTrlinloss) && (OrderStopLoss()!=0))
            {
            dNexMove = NormalizeDouble(dCoeff*(dBid-OrderStopLoss()),Digits);
            dNewSl = NormalizeDouble(OrderStopLoss()+dNexMove,Digits);            
            }
         else
            {
            // åñëè ñòîïëîññ íèæå êóðñà îòêðûòèÿ, òî òðàëèì "îò êóðñà îòêðûòèÿ"
            if (OrderOpenPrice()>OrderStopLoss())
               {
               dNexMove = NormalizeDouble(dCoeff*(dBid-OrderOpenPrice()),Digits);                 
               //Print("dNexMove = ",dCoeff,"*(",dBid,"-",OrderOpenPrice(),")");
               dNewSl = NormalizeDouble(OrderOpenPrice()+dNexMove,Digits);
               //Print("dNewSl = ",OrderOpenPrice(),"+",dNexMove);
               }
         
            // åñëè ñòîïëîññ âûøå êóðñà îòêðûòèÿ, òðàëèì îò ñòîïëîññà
            if (OrderStopLoss()>=OrderOpenPrice())
               {
               dNexMove = NormalizeDouble(dCoeff*(dBid-OrderStopLoss()),Digits);
               dNewSl = NormalizeDouble(OrderStopLoss()+dNexMove,Digits);
               }                                      
            }
            
         // ñòîïëîññ ïåðåìåùàåì òîëüêî â ñëó÷àå, åñëè íîâûé ñòîïëîññ ëó÷øå òåêóùåãî è åñëè ñìåùåíèå - â ñòîðîíó ïðîôèòà
         // (ïðè ïåðâîì ïîäæàòèè, îò êóðñà îòêðûòèÿ, íîâûé ñòîïëîññ ìîæåò áûòü ëó÷øå èìåþùåãîñÿ, è â òî æå âðåìÿ íèæå 
         // êóðñà îòêðûòèÿ (åñëè dBid íèæå ïîñëåäíåãî) 
         if ((dNewSl>OrderStopLoss()) && (dNexMove>0) && ((dNewSl<Bid- MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)))
            {
            if (!OrderModify(OrderTicket(),OrderOpenPrice(),dNewSl,OrderTakeProfit(),OrderExpiration(),Red))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }       
      
      // äåéñòâèÿ äëÿ êîðîòêîé ïîçèöèè   
      if (OrderType()==OP_SELL)
         {
         if ((bTrlinloss) && (OrderStopLoss()!=0))
            {
            dNexMove = NormalizeDouble(dCoeff*(OrderStopLoss()-(dAsk+MarketInfo(Symbol(),MODE_SPREAD)*Point)),Digits);
            dNewSl = NormalizeDouble(OrderStopLoss()-dNexMove,Digits);            
            }
         else
            {         
            // åñëè ñòîïëîññ âûøå êóðñà îòêðûòèÿ, òî òðàëèì "îò êóðñà îòêðûòèÿ"
            if (OrderOpenPrice()<OrderStopLoss())
               {
               dNexMove = NormalizeDouble(dCoeff*(OrderOpenPrice()-(dAsk+MarketInfo(Symbol(),MODE_SPREAD)*Point)),Digits);                 
               dNewSl = NormalizeDouble(OrderOpenPrice()-dNexMove,Digits);
               }
         
            // åñëè ñòîïëîññ íèæó êóðñà îòêðûòèÿ, òðàëèì îò ñòîïëîññà
            if (OrderStopLoss()<=OrderOpenPrice())
               {
               dNexMove = NormalizeDouble(dCoeff*(OrderStopLoss()-(dAsk+MarketInfo(Symbol(),MODE_SPREAD)*Point)),Digits);
               dNewSl = NormalizeDouble(OrderStopLoss()-dNexMove,Digits);
               }                  
            }
         
         // ñòîïëîññ ïåðåìåùàåì òîëüêî â ñëó÷àå, åñëè íîâûé ñòîïëîññ ëó÷øå òåêóùåãî è åñëè ñìåùåíèå - â ñòîðîíó ïðîôèòà
         if ((dNewSl<OrderStopLoss()) && (dNexMove>0) && (dNewSl>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(OrderTicket(),OrderOpenPrice(),dNewSl,OrderTakeProfit(),OrderExpiration(),Blue))
            Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError());
            }
         }               
      }
      }   
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ KillLoss                                                |
//| Ïðèìåíÿåòñÿ íà ó÷àñòêå ëîññîâ. Ñóòü: ñòîïëîññ äâèæåòñÿ íàâñòðå÷ó |
//| êóðñó ñî ñêîðîñòüþ äâèæåíèÿ êóðñà õ êîýôôèöèåíò (dSpeedCoeff).   |
//| Ïðè ýòîì êîýôôèöèåíò ìîæíî "ïðèâÿçàòü" ê ñêîðîñòè óâåëè÷åíèÿ     |
//| óáûòêà - òàê, ÷òîáû ïðè áûñòðîì ðîñòå ëîññà ïîòåðÿòü ìåíüøå. Ïðè |
//| êîýôôèöèåíòå = 1 ñòîïëîññ ñðàáîòàåò ðîâíî ïîñðåäèíå ìåæäó óðîâ-  |
//| íåì ñòîïëîññà è êóðñîì íà ìîìåíò çàïóñêà ôóíêöèè, ïðè êîýôô.>1   |
//| òî÷êà âñòðå÷è êóðñà è ñòîïëîññà áóäåò ñìåùåíà â ñòîðîíó èñõîä-   |
//| íîãî ïîëîæåíèÿ êóðñà, ïðè êîýôô.<1 - íàîáîðîò, áëèæå ê èñõîäíî-  |
//| ìó ñòîïëîññó.                                                    |
//+------------------------------------------------------------------+

void KillLoss(int iTicket,double dSpeedCoeff)
   {   
   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   if ((iTicket==0) || (!OrderSelect(iTicket,SELECT_BY_TICKET)) || (dSpeedCoeff<0.1))
      {
      Print("Òðåéëèíã ôóíêöèåé KillLoss() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      }           
      
   double dStopPriceDiff; // ðàññòîÿíèå (ïóíêòîâ) ìåæäó êóðñîì è ñòîïëîññîì   
   double dToMove; // êîë-âî ïóíêòîâ, íà êîòîðîå ñëåäóåò ïåðåìåñòèòü ñòîïëîññ   
   // òåêóùèé êóðñ
   double dBid = MarketInfo(OrderSymbol(),MODE_BID);
   double dAsk = MarketInfo(OrderSymbol(),MODE_ASK);      
   
   // òåêóùåå ðàññòîÿíèå ìåæäó êóðñîì è ñòîïëîññîì
   if (OrderType()==OP_BUY) dStopPriceDiff = dBid - OrderStopLoss();
   if (OrderType()==OP_SELL) dStopPriceDiff = (OrderStopLoss() + MarketInfo(OrderSymbol(),MODE_SPREAD)*MarketInfo(OrderSymbol(),MODE_POINT)) - dAsk;                  
   
   // ïðîâåðÿåì, åñëè òèêåò != òèêåòó, ñ êîòîðûì ðàáîòàëè ðàíüøå, çàïîìèíàåì òåêóùåå ðàññòîÿíèå ìåæäó êóðñîì è ñòîïëîññîì
   if (GlobalVariableGet("zeticket")!=iTicket)
      {
      GlobalVariableSet("sldiff",dStopPriceDiff);      
      GlobalVariableSet("zeticket",iTicket);
      }
   else
      {                                   
      // èòàê, ó íàñ åñòü êîýôôèöèåíò óñêîðåíèÿ èçìåíåíèÿ êóðñà
      // íà êàæäûé ïóíêò, êîòîðûé ïðîõîäèò êóðñ â ñòîðîíó ëîññà, 
      // ìû äîëæíû ïåðåìåñòèòü ñòîïëîññ åìó íà âñòðå÷ó íà dSpeedCoeff ðàç ïóíêòîâ
      // (íàïðèìåð, åñëè ëîññ óâåëè÷èëñÿ íà 3 ïóíêòà çà òèê, dSpeedCoeff = 1.5, òî
      // ñòîïëîññ ïîäòÿãèâàåì íà 3 õ 1.5 = 4.5, îêðóãëÿåì - 5 ï. Åñëè ïîäòÿíóòü íå 
      // óäà¸òñÿ (ñëèøêîì áëèçêî), íè÷åãî íå äåëàåì.            
      
      // êîë-âî ïóíêòîâ, íà êîòîðîå ïðèáëèçèëñÿ êóðñ ê ñòîïëîññó ñ ìîìåíòà ïðåäûäóùåé ïðîâåðêè (òèêà, ïî èäåå)
      dToMove = (GlobalVariableGet("sldiff") - dStopPriceDiff) / MarketInfo(OrderSymbol(),MODE_POINT);
      
      // çàïèñûâàåì íîâîå çíà÷åíèå, íî òîëüêî åñëè îíî óìåíüøèëîñü
      if (dStopPriceDiff<GlobalVariableGet("sldiff"))
      GlobalVariableSet("sldiff",dStopPriceDiff);
      
      // äàëüøå äåéñòâèÿ íà ñëó÷àé, åñëè ðàññòîÿíèå óìåíüøèëîñü (ò.å. êóðñ ïðèáëèçèëñÿ ê ñòîïëîññó, óáûòîê ðàñòåò)
      if (dToMove>0)
         {       
         // ñòîïëîññ, ñîîòâåòñòâåííî, íóæíî òàêæå ïåðåäâèíóòü íà òàêîå æå ðàññòîÿíèå, íî ñ ó÷åòîì êîýôô. óñêîðåíèÿ
         dToMove = MathRound(dToMove * dSpeedCoeff) * MarketInfo(OrderSymbol(),MODE_POINT);                 
      
         // òåïåðü ïðîâåðèì, ìîæåì ëè ìû ïîäòÿíóòü ñòîïëîññ íà òàêîå ðàññòîÿíèå
         if (OrderType()==OP_BUY)
            {
            if (dBid - (OrderStopLoss() + dToMove)>MarketInfo(OrderSymbol(),MODE_STOPLEVEL)* MarketInfo(OrderSymbol(),MODE_POINT))
            OrderModify(iTicket,OrderOpenPrice(),OrderStopLoss() + dToMove,OrderTakeProfit(),OrderExpiration());            
            }
         if (OrderType()==OP_SELL)
            {
            if ((OrderStopLoss() - dToMove) - dAsk>MarketInfo(OrderSymbol(),MODE_STOPLEVEL) * MarketInfo(OrderSymbol(),MODE_POINT))
            OrderModify(iTicket,OrderOpenPrice(),OrderStopLoss() - dToMove,OrderTakeProfit(),OrderExpiration());
            }      
         }
      }            
   }
   
//+------------------------------------------------------------------+ 



Sample





Analysis



Market Information Used:

Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar


Indicator Curves created:


Indicators Used:

Indicator of the average true range
Moving average indicator


Custom Indicators Used:

Order Management characteristics:

It can change open orders parameters, due to possible stepping strategy

Other Features: