TrailingFuncLib

Author: I_D / ���� ������
TrailingFuncLib
Price Data Components
Series array that contains the lowest prices of each barSeries array that contains the highest prices of each barSeries array that contains open time of each bar
Orders Execution
It can change open orders parameters, due to possible stepping strategy
Indicators Used
Indicator of the average true rangeMoving average indicator
0 Views
0 Downloads
0 Favorites
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());
            }      
         }
      }            
   }
   
//+------------------------------------------------------------------+ 

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