TrailingAll

Author: I_D / ���� ������
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
TrailingAll
//+------------------------------------------------------------------+
//|                                                  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 - òðàëèòü ëè â    |
//| çîíå óáûòêîâ      
//| Ôóíêöèÿ òðàëèò ñòîïëîññ ïî ýêñòðåìóìàì ôðàêòàëîâ çàäàíîãî ðàçìåðà 
//| (ò.å. êîë-âà áàðîâ â ñîñòàâå ôðàêòàëà) íà çàäàííîì òàéìôðåéìå. 
//| Ôðàêòàë, êàê èçâåñòíî, â "êëàññè÷åñêîì" âèäå (Âèëüÿìñà, åñëè íå îøèáàþñü) - 
//| ýòî êîìáèíàöèÿ èç 5 áàðîâ, íî ìíå ïîäóìàëîñü, à ïî÷åìó áû íå èñïîëüçîâàòü è äðóãèå "ðàçìåðû" - 
//| íà÷èíàÿ îò 3 áàðîâ è âûøå, âêëþ÷àÿ ïàðíûå êîë-âà áàðîâ (â ïîñëåäíåì ñëó÷àå êîë-âî áàðîâ ïîñëå ýêñòðåìóìà, 
//| ïî ìåðå äâèæåíèÿ "â ïðîøëîå", áóäåò áîëüøå, ÷åì äî ýêñòðåìóìà).
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà(âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| tmfrm - òàéìôðåéì, ïî áàðàì êîòîðîãî îñóùåñòâëÿåòñÿ òðåéëèíã (âàðèàíòû - 1, 5, 15, 30, 60, 240, 1440, 10080, 43200);
//| bars_n - êîëè÷åñòâî áàðîâ â ñîñòàâå ôðàêòàëà (íå ìåíüøå 3);
//| indent - îòñòóï (ïóíêòîâ) îò ýêñòðåìóìà ïîñëåäíåãî ôðàêòàëà, íà êîòîðîì áóäåò ðàçìåùåí ñòîïëîññ (íå ìåíüøå 0);
//| trlinloss - óêàçàòåëü òîãî, ñëåäóåò ëè ïåðåäâèãàòü ñòîïëîññ íà "ëîññîâîì" ó÷àñòêå, ò.å. â èíòåðâàëå ìåæäó 
//| íà÷àëüíûì ñòîïëîññîì è êóðñîì îòêðûòèÿ (true - òðàëèì, false - òðåéëèíã íà÷èíàåòñÿ òîëüêî ïðè óñëîâèè, 
//| ÷òî íîâûé ñòîïëîññ "ëó÷øå" êóðñà îòêðûòèÿ, "â ïðîôèòå").
//+------------------------------------------------------------------+
//| Íå ðàç âñòðå÷àë íà íåñêîëüêèõ èç îñíîâíûõ ðóíåòîâñêèõ ôîðóìîâ Ôîðåêñ-òåìàòèêè óòâåðæäåíèÿ îòíîñèòåëüíî òîãî, 
//| ÷òî "õîðîø òðåéëèíã ïî ôðàêòàëàì íà áîëåå íèçêîì òàéìôðåéìå". 
//| Ïîñêîëüêó ôðàêòàëû, ïî ñóòè, îáîçíà÷àþò ëîêàëüíûå ýêñòðåìóìû, òðåéëèíã ïî íèì, òàêæå, â ïðèíöèïå, 
//| ìîæíî íàçâàòü òðåéëèíãîì ïî ëîêàëüíûì ýêñòðåìóìàì. Èäåÿ íå íîâàÿ è âïîëíå çäðàâàÿ, 
//| èñïîëüçîâàâøàÿñÿ ìíîãèìè èçâåòíûìè òðåéäåðàìè (òåì æå Âèëüÿìñîì, åñëè íå îøèáàþñü). 
//| Ïîçâîëÿåò ïåðåæèâàòü îòêàòû è íåïëîõî "âûáèðàòü" çàìåòíûå äâèæåíèÿ, íåâàæíî (ïî ëè÷íîìó îïûòó) ðàáîòàåò âî ôëýòå. 
//| Ïîäîáíî ïðåäûäóùåé, äàííàÿ ôóíêöèÿ "òðàëèò" ïî ñôîðìèðîâàâøèìñÿ áàðàì. Ïðè æåëàíèè ìîæíî äèíàìè÷åñêè 
//| (â ïðåäåëàõ "æèçíè" ïîçèöèè) èçìåíÿòü ïàðàìåòðû, íàïðèìåð, ïðè áûñòðîì "ïðèðîñòå" ïðîôèòå (íàïðèìåð, ïðè ñèëüíîì òðåíäå),
//|  "çàãðóáëÿòü" å¸ ÷óâñòâèòåëüíîñòü, ïåðåõîäÿ íà áîëåå êðóïíûé òàéìôðåéì èëè óâåëè÷èâàÿ êîë-âî áàðîâ âî ôðàêòàëå,
//|  èëè, íàîáîðîò, ïðè ñïàäàõ âîëàòèëüíîñòè ïîâûøàòü ÷óâñòâèòåëüíîñòü, ïåðåõîäÿ íà áîëåå ìåëêèé òàéìôðåéì èëè óìåíüøàÿ
//|  êîë-âî áàðîâ âî ôðàêòàëå. Âîçìîæíû è äðóãèå âàðèàíòû.
//+------------------------------------------------------------------+
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())
         OrderModify(ticket,OrderOpenPrice(),iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point,OrderTakeProfit(),OrderExpiration());
         }
      // åñëè òðàëèòü òîëüêî â ïðîôèòå, òî
      else
      // åñëè íîâûé ñòîïëîññ ëó÷øå èìåþùåãîñÿ È êóðñà îòêðûòèÿ
      if ((iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point>OrderStopLoss()) && (iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point>OrderOpenPrice()))
      OrderModify(ticket,OrderOpenPrice(),iLow(Symbol(),tmfrm,sell_peak_n)-indent*Point,OrderTakeProfit(),OrderExpiration());         
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (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))
         OrderModify(ticket,OrderOpenPrice(),iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
         }      
      // åñëè òðàëèòü òîëüêî â ïðîôèòå, òî
      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()))
         OrderModify(ticket,OrderOpenPrice(),iHigh(Symbol(),tmfrm,buy_peak_n)+(indent+MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
         }
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍà ÏÎ ÒÅÍßÌ N ÑÂÅ×ÅÉ                                       |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, êîëè÷åñòâî áàðîâ, ïî òåíÿì     |
//| êîòîðûõ íåîáõîäèìî òðåéëèíãîâàòü (îò 1 è áîëüøå) è îòñòóï        |
//| (ïóíêòîâ) - ðàññòîÿíèå îò ìàêñ. (ìèí.) ñâå÷è, íà êîòîðîå         |
//| ïåðåíîñèòñÿ ñòîïëîññ (îò 0), trlinloss - òðàëèòü ëè â ëîññå      |
//----Ôóíêöèÿ ðåàëèçóåò ïîäòÿãèâàíèå ñòîïëîññà ïî ìèíèìàëüíîìó èç low (äëÿ äëèííûõ ïîçèöèé) èëè ìàêñèìàëüíîìó high 
//(äëÿ êîðîòêèõ) çàäàííîãî êîëè÷åñòâà áàðîâ, íà òåêóùåì èëè îòëè÷íîì îò òåêóùåãî òàéìôðåéìå.
//----------------------------------------------------------------------------------------------------------------------   
//Ïàðàìåòðû:
//ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//tmfrm - òàéìôðåéì, ïî áàðàì êîòîðîãî îñóùåñòâëÿåòñÿ òðåéëèíã (âàðèàíòû - 1, 5, 15, 30, 60, 240, 1440, 10080, 43200);
//bars_n - êîëè÷åñòâî áàðîâ, êîòîðûå èñïîëüçóþòñÿ äëÿ îïðåäåëåíèÿ óðîâíÿ ñòîïëîññà (íå ìåíüøå 1);
//indent - îòñòóï (ïóíêòîâ) îò âûáðàííîãî high/low, íà êîòîðîì áóäåò ðàçìåùåí ñòîïëîññ (íå ìåíüøå 0);
//trlinloss - óêàçàòåëü òîãî, ñëåäóåò ëè ïåðåäâèãàòü ñòîïëîññ íà "ëîññîâîì" ó÷àñòêå, ò.å. 
//â èíòåðâàëå ìåæäó íà÷àëüíûì ñòîïëîññîì è êóðñîì îòêðûòèÿ (true - òðàëèì, false - òðåéëèíã íà÷èíàåòñÿ òîëüêî ïðè óñëîâèè, 
//÷òî íîâûé ñòîïëîññ "ëó÷øå" êóðñà îòêðûòèÿ, "â ïðîôèòå").
//----------------------------------------------------------------------------------------------------------------------
//Äàííûé âèä òðåéëèíãà áûë âïåðâûå âñòðå÷åí ìíîé â îïèñàíèè òàêòèêè Â. Áàðèøïîëüöà "Ïðîáîé ñðåäíåé íà äíåâêàõ", â êîòîðîé ïðåäëàãàëîñü òðåéëèíãîâàòü ñòîïëîññ ïî ëîó (äëÿ ïîêóïîê) èëè õàé (ïðîäàæ) ïîñëåäíèõ 2 áàðîâ (ñâå÷åé) íà äíåâíîì òàéìôðåéìå. Òðàëèò äàííûé àëãîðèòì èíîãäà íà óäèâëåíèå "êðàñèâî" (ïîïðîáóéòå "ïðîéòèñü" ïî ãðàôèêó "ãëàçàìè"), ïîçâîëÿåò ïåðåæèâàòü îòêàòû (ãëóáèíà çàâèñèò îò çàäàííîãî êîëè÷åñòâà áàðîâ, bars_n) è ïåðèîäû îñëàáëåíèÿ âîëàòèëüíîñòè. (Ïî îïðåäåëåíèþ) ñðàáàòûâàåò ïî çàêðûòèþ î÷åðåäíîãî áàðà, äàæå åñëè âû èñïîëüçóåòå åãî íà êàæäîì òèêå. ß èñïîëüçóþ åãî ïðåèìóùåñòâåííî íà äíåâêàõ, òðàëþ ïî 2-4 (íàèáîëåå ÷àñòî) ïîñëåäíèì áàðàì.

//+------------------------------------------------------------------+
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))
         OrderModify(ticket,OrderOpenPrice(),new_extremum - indent*Point,OrderTakeProfit(),OrderExpiration());
         }
      else
         {
         // åñëè íîâûé ñòîïëîññ íå òîëüêî ëó÷øå ïðåäûäóùåãî, íî è êóðñà îòêðûòèÿ ïîçèöèè
         if ((((new_extremum - indent*Point)>OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice()))
         OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration());         
         }
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (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))
         OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
         }
      else
         {
         // åñëè íîâûé ñòîïëîññ íå òîëüêî ëó÷øå ïðåäûäóùåãî, íî è êóðñà îòêðûòèÿ ïîçèöèè
         if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss()) || (OrderStopLoss()==0)) && ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderOpenPrice()))
         OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());         
         }      
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍà ÑÒÀÍÄÀÐÒÍÛÉ-ÑÒÓÏÅÍ×ÀÑÒÛÉ                                |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ðàññòîÿíèå îò êóðñà îòêðûòèÿ,  |
//| íà êîòîðîì òðåéëèíã çàïóñêàåòñÿ (ïóíêòîâ) è "øàã", ñ êîòîðûì îí  |
//| ïåðåíîñèòñÿ (ïóíêòîâ)                                            |
//| Ïðèìåð: ïðè +30 ñòîï íà +10, ïðè +40 - ñòîï íà +20 è ò.ä.        |
//+------------------------------------------------------------------+
//| Äàííûé âèä òðåéëèíãà ÿâëÿåòñÿ äîðàáîòêîé ñòàíäàðòíîãî. Åñëè íå îøèáàþñü, â ñâî¸ âðåìÿ ïîõîæèé áûë íàïèñàí KimIV'îì 
//| (íî ïîñêîëüêó "ñâîå - ðîäíåå",... :) Îòëè÷àåòñÿ îò ñòàíäàðòíîãî òðåéëèíãà òåì, ÷òî ïåðåíîñ ñòîïëîññà îñóùåñòâëÿåòñÿ íå 
//| "ïîïóíêòîâî" (íàïðèìåð, ïðè òðåéëèíãå íà ðàññòîÿíèè 30 ïóíêòîâ ïðè +31 ñòîïëîññ áóäåò ïåíåìåùåí íà +1, ïðè +32 - íà +2 
//| è ò.ä.), à "øàãàìè" çàäàííîé äëèíû (íàïðèìåð, ïðè òðåéëèíãå íà ðàññòîÿíèè â 40 ïóíêòîâ è "øàãå" â 10 ïðè äîñòèæåíèè +40
//|  ñòîïëîññ áóäåò ïåðåìåùåí íà +10, äàëüøå äî ìîìåíòà äîñòèæåíèÿ ïðîôèòîì +50 (40 ï. + øàã) íè÷åãî íå ïîìåíÿåòñÿ (ò.î. ìû 
//| äà¸ì öåíå îïðåäåë¸ííóþ ñâîáîäó, â ÷åì, ñîáñòâåííî, è ñóòü äàííîãî àëãîðèòìà), è òîëüêî ïðè +50 ñòîïëîññ ñ +10 áóäåò 
//| ïåðåíåñåí íà øàã - ñ +10 íà +20, ïðè +60 - íà +30 ï. è ò.ä.
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| trldistance - ðàññòîÿíèå îò òåêóùåãî êóðñà (ïóíêòîâ), íà êîòîðîì "òðàëèì" (íå ìåíüøå MarketInfo(Symbol(),MODE_STOPLEVEL));
//| trlstep - "øàã" èçìåíåíèÿ ñòîïëîññà (ïóíêòîâ) (íå ìåíüøå 1).
//+------------------------------------------------------------------+
//| Ïðè trlstep=1 äàííàÿ ôóíêöèÿ íå áóäåò îòëè÷àòüñÿ îò ñòàíäàðòíîãî òðåéëèíãà. Îñíîâíàÿ "ôèøêà" äàííîãî àëãîðèòìà, 
//| ïîâòîðþñü, â ïðåäîñòàâëåíèè êóðñó íåêîòîðîé "ñâîáîäû äâèæåíèé" - ñòîïëîññ ïîäòÿãèâàåòñÿ òîëüêî ïîñëå òîãî, êàê öåíà 
//| "ïîáðîäèâ, îïðåäåëèëàñü". Äàííûé àëãîðèòì òðåéëèíãà ÿ âïåðâûå âñòðåòèë â îïèñàíèè ïðàâèë òàêòèêè "Ñêîëüçÿùèå êàíàëû"
//|  óæå óïîìèíàâøåãîñÿ Â.Áàðèøïîëüöà.
//+------------------------------------------------------------------+
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())) 
      OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + trlstep*Point,OrderTakeProfit(),OrderExpiration());
      else
      OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep*Point,OrderTakeProfit(),OrderExpiration());
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (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()))
      OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
      else
      OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration());
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÑÒÀÍÄÀÐÒÍÛÉ-"ÓÄÀÂÊÀ"                                    |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, èñõîäíûé òðåéëèíã (ïóíêòîâ) è  |
//| 2 "óðîâíÿ" (çíà÷åíèÿ ïðîôèòà, ïóíêòîâ), ïðè êîòîðûõ òðåéëèíã     |
//| ñîêðàùàåì, è ñîîòâåòñòâóþùèå çíà÷åíèÿ òðåéëèíãà (ïóíêòîâ)        |
//| Ïðèìåð: èñõîäíûé òðåéëèíã 30 ï., ïðè +50 - 20 ï., +80 è áîëüøå - |
//| íà ðàññòîÿíèè â 10 ïóíêòîâ.                                      |
//+------------------------------------------------------------------+
//| Áåçîòêàòíûõ äâèæåíèé íåîãðàíè÷åííîé äëèíû, êàê èçâåñòíî, íå áûâàåò (ýõ...). È ñîâåðøèâ îïðåäåë¸ííûé "ðûâîê" 
//| (ñðåäíåå çíà÷åíèå êîòîðîãî ìîæíî ïîïûòàòüñÿ îïðåäåëèòü, íàïðèìåð, ñòàòèñòè÷åñêè), êóðñ, êàê ïðàâèëî, ôîðìèðóåò 
//| êîíñîëèäàöèþ èëè îòêàò. Èäåÿ äàííîãî àëãîðèòìà ñîïðîâîæäåíèÿ - ïî ìåðå óâåëè÷åíèÿ ïðîôèòà ñîêðàùàòü äèñòàíöèþ 
//| òðåéëèíãà òàêèì îáðàçîì, ÷òîáû ïîäõîäÿ ê ó÷àñòêó âåðîÿòíîãî ðàçâîðîòà/êîíñîëèäàöèè "çàñòîëáèòü" ïîáîëüøå ïðîôèòà. 
//| Ïîìèìî ðàáîòû íà óïîìÿíóòûõ âûøå "ðûâêàõ" (êîòîðûå îáû÷íî èìåþò ìåñòî íà íîâîñòÿõ èëè ïðè ïðîáîå èñòîðè÷åñêèõ óðîâíåé),
//| ôóíêöèþ òàêæå ìîæíî èñïîëüçîâàòü ïðè ðàáîòå â êàíàëàõ, ñîêðàùàÿ äèñòàíöèþ òðåéëèíãà ïðè ïîäõîäå ê ïðîòèâîïîëîæíîé 
//| (îòíîñèòåëüíî îòêðûòèÿ) ãðàíèöå êàíàëà.
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| trl_dist_1 - èñõîäíîå ðàññòîÿíèå òðåéëèíãà (ïóíêòîâ) (íå ìåíüøå MarketInfo(Symbol(),MODE_STOPLEVEL), 
//| áîëüøå trl_dist_2 è trl_dist_3);
//| level_1 - óðîâåíü ïðîôèòà (ïóíêòîâ), ïðè äîñòèæåíèè êîòîðîãî äèñòàíöèÿ òðåéëèíãà áóäåò ñîêðàùåíà 
//| ñ trl_dist_1 äî trl_dist_2 (ìåíüøå level_2; áîëüøå trl_dist_1);
//| trl dist_2 - ðàññòîÿíèå òðåéëèíãà (ïóíêòîâ) ïîñëå äîñòèæåíèÿ êóðñîì óðîâíÿ ïðîôèòà â level_1 ïóíêòîâ 
//| (íå ìåíüøå MarketInfo(Symbol(),MODE_STOPLEVEL));
//| level_2 - óðîâåíü ïðîôèòà (ïóíêòîâ), ïðè äîñòèæåíèè êîòîðîãî äèñòàíöèÿ òðåéëèíãà áóäåò ñîêðàùåíà 
//| ñ trl_dist_2 äî trl_dist_3 ïóíêòîâ (áîëüøå trl_dist_1 è áîëüøå level_1);
//| trl dist_3 - ðàññòîÿíèå òðåéëèíãà (ïóíêòîâ) ïîñëå äîñòèæåíèÿ êóðñîì óðîâíÿ ïðîôèòà â level_2 ïóíêòîâ (
//| íå ìåíüøå MarketInfo(Symbol(),MODE_STOPLEVEL)).
//+------------------------------------------------------------------+
//| Ê ïðèìåðó, ïðè ïàðàìåòðàõ "ticket#, 30, 50, 20, 70, 10" ìû èñõîäíî òðàëèì íà ðàññòîÿíèè â 30 ïóíêòîâ, êàê òîëüêî êóðñ 
//| îòîéäåò îò êóðñà îòêðûòèÿ íà 50 ïóíêòîâ, íà÷èíàåì òðàëèòü "ïëîòíåå" - íà ðàññòîÿíèè â 20 ï., à åñëè åìó óäàëîñü 
//| ïðåîäîëåòü 70 ï. â íàïðàâëåíèè óâåëè÷åíèÿ ïðîôèòà, "çàòÿãèâàåì" (îòêóäà è íàçâàíèå) ðàññòîÿíèå òðàëà äî 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())   
      OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (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()))
         OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
         else
            {
            if (newstop<OrderStopLoss())   
            OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
            }
         }
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÂÐÅÌÅÍÈ                                              |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, èíòåðâàë (ìèíóò), ñ êîòîðûì,   |
//| ïåðåäâèãàåòñÿ ñòîïëîññ è øàã òðåéëèíãà (íà ñêîëüêî ïóíêòîâ       |
//| ïåðåìåùàåòñÿ ñòîïëîññ, trlinloss - òðàëèì ëè â óáûòêå            |
//| (ò.å. ñ îïðåäåë¸ííûì èíòåðâàëîì ïîäòÿãèâàåì ñòîï äî êóðñà        |
//| îòêðûòèÿ, à ïîòîì è â ïðîôèòå, ëèáî òîëüêî â ïðîôèòå)            |
//+------------------------------------------------------------------+
//| Òðàëèì ïî âðåìåíè, áåçîòíîñèòåëüíî ê òåêóùåìó ðåçóëüòàòó ïî ïîçèöèè è ðàñêëàäó íà ðûíêå. 
//| ×åðåç çàäàííûå èíòåðâàëû âðåìåíè (öåëûõ ìèíóò) ïûòàåìñÿ (ïî âîçìîæíîñòè) ïåðåìåñòèòü ñòîïëîññ íà çàäàííûé øàã. 
//| Èñïîëüçîâàíèå äàííîãî òðåéëèíãà îòäåëüíî íå áûëî (äëÿ ìåíÿ, ïî êðàéíåé ìåðå, âîçìîæíî, äëÿ êîãî-òî îêàæåòñÿ èíà÷å) 
//| îñîáî óñïåøíûì, îäíàêî â êîìáèíàöèè ñ äðóãèìè âèäàìè òðàëà èëè ïðè âêëþ÷åíèè ïî îïðåäåë¸ííîìó óñëîâèþ, âîçìîæíî, 
//| îí ìîæåò áûòü ïîëåçåí.
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| interval - êîëè÷åñòâî öåëûõ ìèíóò ñ ìîìåíòà îòêðûòèÿ ïîçèöèè, ïî èñòå÷åíèþ êîòîðûõ ïûòàåìñÿ ïåðåìåñòèòü ñòîïëîññ 
//| íà øàã trlstep ïóíêòîâ;
//| trlstep - øàã (ïóíêòîâ), íà êîòîðûé ïûòàåìñÿ ïåðåìåùàòü ñòîïëîññ ÷åðåç êàæäûå interval ìèíóò;
//| trlinloss - â äàííîì ñëó÷àå åñëè trlinloss==true, òî òðàëèì îò ñòîïëîññà, èíà÷å îò êóðñà îòêðûòèÿ 
//| (åñëè ñòîïëîññ íå áûë óñòàíîâëåí, ==0, òðàëèì âñåãäà îò êóðñà îòêðûòèÿ).
//+------------------------------------------------------------------+
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()) && (Bid>=(newstop + MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)))
         OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
         }
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (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())) && (Ask<=(newstop - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)))
         OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());     
         else
         if ((newstop<OrderStopLoss()) && (Ask<=(newstop - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)))
         OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());     
         }
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ATR (Average True Range, Ñðåäíèé èñòèííûé äèàïàçîí)  |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ïåðèîä ÀÒR è êîýôôèöèåíò, íà   |
//| êîòîðûé óìíîæàåòñÿ ATR. Ò.î. ñòîïëîññ "òÿíåòñÿ" íà ðàññòîÿíèè    |
//| ATR õ N îò òåêóùåãî êóðñà; ïåðåíîñ - íà íîâîì áàðå (ò.å. îò öåíû |
//| îòêðûòèÿ î÷åðåäíîãî áàðà)                                        |

//| ATR - (Average True Range, Ñðåäíèé Èñòèííûé Äèàïàçîí) - îäèí èç èíäèêàòîðîâ âîëàòèëüíîñòè; 
//| ÷åì áîëüøå çíà÷åíèå, òåì, ñîîòâåòñòâåííî, âûøå ñðåäíÿÿ âîëàòèëüíîñòü çà çàäàííûé ïåðèîä (èíäèêàòîðà) âðåìåíè; 
//| èçìåðÿòåñÿ â ïóíêòàõ. Òðåéëèíã ïî ATR â áîëüøèíñòâå ñëó÷àåâ ïîçâîëÿåò èçìåíÿòü ñòîïëîññ ñîîòâåòñòâåííî 
//| ("àäåêâàòíî", "àäàïòèâíî") õàðàêòåðó ïîâåäåíèÿ êóðñà - ïðè âûñîêîé âîëàòèëüíîñòè (âûðàæåííûõ ðûâêàõ) êóðñ "îòïóñêàåì", 
//| ïðè "òîïòàíèè íà ìåñòå" ïîäæèìàåì áîëåå "ïëîòíî".  òðåéëèíãå èñïîëüçóåòñÿ 2 ATR, êîòîðûì ïðåäëàãàåòñÿ çàäàâàòü îòëè÷íûå 
//| ïåðèîäû - îäèí êîðîòêèé (íàïð., 5), äðóãîé - äëèííûé (íàïð., 20). Äëÿ ðàñ÷åòà ñòîïëîññà èñïîëüçóåòñÿ âñåãäà áîëüøåå 
//| èç çíà÷åíèé 2 ATR - ýòî ñäåëàíî äëÿ òîãî, ÷òîáû íåñêîëüêî íèçêîâîëàòèëüíûõ áàðîâ ïîäðÿä (íàïðèìåð, ïåðåä âûõîäîì íîâîñòåé) 
//| íå ñäåëàëè íàø ñòîïëîññ ñëèøêîì áëèçêèì ê òåêóùåìó êóðñó.

//| Ïàðàìåòðû:
//| ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| atr_timeframe - òàéìôðåéì, íà êîòîðîì ðàññ÷èòûâàåì çíà÷åíèå ATR (âàðèàíòû - 1, 5, 15, 30, 60, 240, 1440, 10080, 43200);
//| atr1_period - ïåðèîä ïåðâîãî ATR (áîëüøå 0; ìîæåò áûòü ðàâåí atr2_period, íî ëó÷øå îòëè÷åí îò ïîñëåäíåãî, ïî÷åìó - ñì. âûøå);
//| atr1_shift - äëÿ ïåðâîãî ATR ñäâèã "îêíà", â êîòîðîì ðàññ÷èòûâàåòñÿ çíà÷åíèå ATR, îòíîñèòåëüíî òåêóùåãî áàðà íà óêàçàííîå 
//| êîëè÷åñòâî áàðîâ íàçàä (íåîòðèöàòåëüíîå öåëîå ÷èñëî);
//| atr2_period - ïåðèîä âòîðîãî ATR (áîëüøå 0);
//| atr2_shift - äëÿ âòîðîãî ATR ñäâèã "îêíà", â êîòîðîì ðàññ÷èòûâàåòñÿ çíà÷åíèå ATR, îòíîñèòåëüíî òåêóùåãî áàðà íà óêàçàííîå 
//| êîëè÷åñòâî áàðîâ íàçàä (íåîòðèöàòåëüíîå öåëîå ÷èñëî);
//| coeff - ñòîïëîññ ñ÷èòàåì êàê ATR*coeff, ò.å. ýòî êîýôôèöèåíò, îïðåäåëÿþùèé, íà ðàññòîÿíèè ñêîëüêèõ ATR îò òåêóùåãî êóðñà 
//| ñëåäóåò ðàçìåñòèòü ñòîïëîññ;
//| trlinloss - óêàçàòåëü òîãî, ñëåäóåò ëè ïåðåäâèãàòü ñòîïëîññ íà "ëîññîâîì" ó÷àñòêå, ò.å. â èíòåðâàëå ìåæäó íà÷àëüíûì 
//| ñòîïëîññîì è êóðñîì îòêðûòèÿ (true - òðàëèì, false - òðåéëèíã íà÷èíàåòñÿ òîëüêî ïðè óñëîâèè, ÷òî íîâûé ñòîïëîññ "ëó÷øå" 
//| êóðñà îòêðûòèÿ, "â ïðîôèòå").

//| Òàêæå äîâîëüíî ïîïóëÿðíûé ñïîñîá òðåéëèíãà, (â áîëüøèíñòâå ñëó÷àåâ âûãîäíî) îòëè÷àþùèéñÿ îò ñòàíäàðòíîãî "àäàïòèâíîñòüþ" 
//| ê òåêóùåé ñèòóàöèè íà ðûíêå.

//+------------------------------------------------------------------+
void TrailingByATR(int ticket,int atr_timeframe,int atr1_period,int atr1_shift,int atr2_period,int atr2_shift,double coeff,bool trlinloss)
   {      
   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   //Print("ticket: ",ticket,", atr1_period: ",atr1_period,", atr2_period: ",atr2_period,", coeff: ",coeff,", OrderSelect(ticket,SELECT_BY_TICKET): ",OrderSelect(ticket,SELECT_BY_TICKET),", atr_timeframe: ",atr_timeframe,", atr1_shift: ",atr1_shift,", atr2_shift: ",atr2_shift);
   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 (newstop>OrderStopLoss())
         OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());      
         }
      else
         {
         Print("Bid: ",Bid,", atrXcoeff: ",atrXcoeff,", newstop: ",newstop);
         // èíà÷å òðàëèòü íà÷èíàåì òîëüêî òîãäà, êîãäà ñòîïëîññ ëó÷øå êóðñà îòêðûòèÿ (â ïðîôèòå)
         if ((newstop>OrderStopLoss()) && (newstop>OrderOpenPrice()))
         OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());         
         }
      }
      
   // åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
   if (OrderType()==OP_SELL)
      {
      // îòêëàäûâàåì îò òåêóùåãî êóðñà (íîâûé ñòîïëîññ)
      newstop = Ask + (atrXcoeff + MarketInfo(Symbol(),MODE_SPREAD)*Point);
      
      // åñëè trlinloss==true (ò.å. ñëåäóåò òðàëèòü â çîíå ëîññîâ), òî
      if (trlinloss==true)      
         {
         // åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì â ëþáîì ñëó÷àå
         if (OrderStopLoss()==0)
         OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()); 
         // åñëè ñòîïëîññ â óáûòêå èëè â ïðîôèòå, òðàëèì òîëüêî åñëè íîâûé ñòîï ëó÷øå ñòàðîãî
         else
            {
            if (newstop<OrderStopLoss())
            OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()); 
            }
         }
      else
         {
         // åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì, åñëè ñòîï ëó÷øå îòêðûòèÿ
         if ((OrderStopLoss()==0) && (newstop<OrderOpenPrice()-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
         OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()); 
         // åñëè ñòîï íå ðàâåí 0, òî ìåíÿåì åãî, åñëè îí ëó÷øå ïðåäûäóùåãî è êóðñà îòêðûòèÿ
         else
            {
            if ((newstop<OrderStopLoss()) && (newstop<OrderOpenPrice()-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()); 
            }
         }
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ RATCHET ÁÀÐÈØÏÎËÜÖÀ                                     |
//| Ïðè äîñòèæåíèè ïðîôèòîì óðîâíÿ 1 ñòîïëîññ - â +1, ïðè äîñòèæåíèè |
//| ïðîôèòîì óðîâíÿ 2 ïðîôèòà - ñòîïëîññ - íà óðîâåíü 1, êîãäà       |
//| ïðîôèò äîñòèãàåò óðîâíÿ 3 ïðîôèòà, ñòîïëîññ - íà óðîâåíü 2       |
//| (äàëüøå ìîæíî òðåéëèòü äðóãèìè ìåòîäàìè)                         |
//| ïðè ðàáîòå â ëîññîâîì ó÷àñòêå - òîæå 3 óðîâíÿ, íî ñõåìà ðàáîòû   |
//| ñ íèìè íåñêîëüêî èíàÿ, à èìåííî: åñëè ìû îïóñòèëèñü íèæå óðîâíÿ, |
//| à ïîòîì ïîäíÿëèñü âûøå íåãî (ïðèìåð äëÿ ïîêóïêè), òî ñòîïëîññ    |
//| ñòàâèì íà ñëåäóþùèé, áîëåå ãëóáîêèé óðîâåíü (íàïðèìåð, óðîâíè    |
//| -5, -10 è -25, ñòîïëîññ -40; åñëè îïóñòèëèñü íèæå -10, à ïîòîì   |
//| ïîäíÿëèñü âûøå -10, òî ñòîïëîññ - íà -25, åñëè ïîäíèìåìñÿ âûùå   |
//| -5, òî ñòîïëîññ ïåðåíåñåì íà -10, ïðè -2 (ñïðýä) ñòîï íà -5      |
//| ðàáîòàåì òîëüêî ñ îäíîé ïîçèöèåé îäíîâðåìåííî                    |

//| Õðàïîâîé (àíãë. ratchet) êëþ÷, êîëåñî - òîò, êîòîðûé "ïðîâîðà÷èâàåòñÿ òîëüêî â îäíîì íàïðàâëåíèè". 
//| Íàçâàíèå - ìî¸, â îïèñàíèè Áàðèøïîëüöà óïîìèíàåòñÿ êàê "âòîðàÿ òàêòèêà òðåéëèíãà" (â ïðîòèâîâåñ "ïåðâîé", ñî "ñòàíäàðòíûìè"
//|  - äàëüíèìè ñòîïëîññàìè), â èñïîëíåíèè KimIV - ò.í. "òðåõóðîâíåâûé" òðåéëèíã. Ñóòü: áûñòðûé ïåðåíîñ â áåçóáûòîê è ñòóïåí÷àòûé 
//| òðåéëèíã ïðè íåáîëüøîì ïðîôèòå (äàëüøå ïðåäëàãàåòñÿ ïðèìåíÿòü èíûå âèäû òðåéëèíãà, íàïðèìåð, ñòàíäàðòíûé, ìîæíî ìîé 
//| ñòàíäàðòíûé-"ñòóïåí÷àñòûé" èëè êàêîé-íèáóäü äðóãîé èç âûøåîïèñàííûõ). Öåëåñîîáðàçíîñòü òàêîãî òðàëà - "àáñîëþòíîå 
//| áîëüøèíñòâî ïîçèöèé ïî êðàéíåé ìåðå íåêîòîðîå âðåìÿ äàþò ïðîôèò", ïîýòîìó ïðè ïåðâîé âîçìîæíîñòè ïåðåíîñèì ñòîïëîññ 
//| â áåçóáûòîê; åñëè ïðåæäåâðåìåííî "çàêðîåò", íî ñèãíàëû ê îòêðûòèþ ñîõðàíÿþòñÿ, âîçìîæåí ïîâòîðíûé âõîä; à âîîáùå 
//| ïîëó÷àåì áîëüøîå êîë-âî ñäåëîê, çàêðûòûõ â áåçóáûòîê, è íåñêîëüêî, âîçìîæíî, ñ õîðîøèì ïðîôèòîì - íà òåõ ñäåëêàõ, 
//| ãäå ïîñëå îòêðûòèÿ ïîñëåäîâàëî ñèëüíîå äâèæåíèå â ïðîôèòíîì íàïðàâëåíèè. Àâòîð ïîä÷åðêèâàåò, ÷òî äàííûé òðåéëèíã íå ÿâëÿåòñÿ
//|  "ïèïñîâî÷íûì", à ïðåäíàçíà÷åí äëÿ äîñòèæåíèÿ òîðãîâëè ñ íèçêèì % óáûòî÷íûõ ñäåëîê.

//| Ïàðàìåòðû:
//| ticket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| pf_level_1 - óðîâåíü ïðîôèòà (ïóíêòîâ), ïðè êîòîðîì ñòîïëîññ ïåðåíîñèì â áåçóáûòîê + 1 ïóíêò;
//| pf_level_2 - óðîâåíü ïðîôèòà (ïóíêòîâ), ïðè êîòîðîì ñòîïëîññ ïåðåíîñèì ñ +1 íà ðàññòîÿíèå pf_level_1 ïóíêòîâ îò êóðñà îòêðûòèÿ;
//| pf_level_3 - óðîâåíü ïðîôèòà (ïóíêòîâ), ïðè êîòîðîì ñòîïëîññ ïåðåíîñèì ñ pf_level_1 íà pf_level_2 ïóíêòîâ îò êóðñà îòêðûòèÿ 
//| (íà ýòîì äåéñòâèÿ ôóíêöèè çàêàí÷èâàþòñÿ);
//| ls_level_1 - ðàññòîÿíèå îò êóðñà îòêðûòèÿ â ñòîðîíó "ëîññà", íà êîòîðîì áóäåò óñòàíîâëåí ñòîïëîññ ïðè äîñòèæåíèè ïðîôèòîì 
//| ïîçèöèè +1 (ò.å. ïðè +1 ñòîïëîññ áóäåò ïîäæàò íà ls_level_1);
//| ls_level_2 - ðàññòîÿíèå îò êóðñà îòêðûòèÿ â "ëîññå", íà êîòîðîì áóäåò óñòàíîâëåí ñòîïëîññ ïðè óñëîâèè, ÷òî êóðñ ñíà÷àëà 
//| îïóñêàëñÿ íèæå ls_level_1, à ïîòîì ïîäíÿëñÿ âûøå (ò.å. èìåëè ëîññ, íî îí íà÷àë óìåíüøàòüñÿ - íå äîïóñòèì åãî ïîâòîðíîãî 
//| óâåëè÷åíèÿ);
//| ls_level_3 - ðàññòîÿíèå îò êóðñà îòêðûòèÿ "ìèíóñå", íà êîòîðîì áóäåò óñòàíîâëåí ñòîïëîññ ïðè óñëîâèè, ÷òî êóðñ ñíèæàëñÿ 
//| íèæå ls_level_2, à ïîòîì ïîäíÿëñÿ âûøå;
//| trlinloss - óêàçàòåëü òîãî, ñëåäóåò ëè ïåðåäâèãàòü ñòîïëîññ íà "ëîññîâîì" ó÷àñòêå, ò.å. â èíòåðâàëå ìåæäó íà÷àëüíûì 
//| ñòîïëîññîì è êóðñîì îòêðûòèÿ (true - òðàëèì, false - òðåéëèíã íà÷èíàåòñÿ òîëüêî ïðè óñëîâèè, ÷òî íîâûé ñòîïëîññ "ëó÷øå" 
//| êóðñà îòêðûòèÿ, "â ïðîôèòå").

//| Àâòîðîì èäåè ïðåäëàãàëîñü íà EURUSD èñïîëüçîâàòü ñëåäóþùèå çíà÷åíèÿ: "5, 10, 25", ò.å. ïðè +5 
//| (ò.å. "îòáèëè" ñïðýä è åù¸ 5 ïóíêòîâ ïðîøëè â ïðîôèò) ñòîïëîññ ïåðåíîñèì íà +1 (ïðè ðó÷íîé òîðãîâëå ïðåäëàãàåòñÿ 
//| "äåðæàòü" åãî "â ãîëîâå", äàáû íå èñêóøàòü ëèøíèé ðàç äèëëåðà), ïðè +10 ï. ñòîïëîññ ïåðåíîñèòñÿ íà +5, ïðè +25 ï. 
//| ïðîôèòà ñòîïëîññ - íà +10 è êóðñ "îòïóñêàåì" (ìîæíî ïîäæèìàòü äðóãèìè ñïîñîáàìè). Àíàëîãè÷íàÿ ÷àñòü ôóíêöèè äëÿ 
//| ëîññîâîãî èíòåðâàëà àâòîðîì íå îïèñàíà, áûëà ïðèäóìàíà ÷èòàòåëÿìè åãî ðàññûëêè â õîäå îáñóæäåíèÿ. Ñóùåñòâóþò ñâåäåíèÿ, 
//| ÷òî àâòîð (âåñüìà óñïåøíî) ïðèìåíÿåò äàííóþ ìåòîäèêó ïðè òîðãîâëå íà ñ÷åòå ñâîåãî èíâåñòèöèîííîãî ïðîåêòà, ÷òî, âåðîÿòíî, 
//| ÿâëÿåòñÿ îäíèì èç ôàêòîðîâ î÷åíü âûñîêîãî % ïðîôèòîâ â åãî òîðãîâëå.  òî æå âðåìÿ ñëåäóåò îòìåòèòü, ÷òî äàííûé àëãîðèòì 
//| òðåéëèíãà äîâîëüíî ñïåöèôè÷åí è ìîæåò ïîäîéòè íå âñåì.
//+------------------------------------------------------------------+
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)
   {
   Print("RatchetB");
   
   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   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)"
      }      
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÖÅÍÂÎÌÓ ÊÀÍÀËÓ                                       |
//| Äîáàâëåí ïî ñîâåòó Nickolay Zhilin (aka rebus)                   |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, ïåðèîä (êîë-âî áàðîâ) äëÿ      | 
//| ðàññ÷åòà âåðõíåé è íèæíåé ãðàíèö êàíàëà, îòñòóï (ïóíêòîâ), íà    |
//| êîòîðîì ðàçìåùàåòñÿ ñòîïëîññ îò ãðàíèöû êàíàëà                   |
//| Òðåéëèíã ïî çàêðûâøèìñÿ áàðàì.                                   |
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| iTicket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| iBars_n - ïåðèîä êàíàëà (êîë-âî áàðîâ, ñðåäè êîòðûõ èùåì íàèáîëüøèé õàé è íàèìåíüøèé ëîó - âåðõíþþ è íèæíþþ 
//| ãðàíèöû êàíàëà ñîîòâåòñòâåííî);
//| iIndent - îòñòóï (ïóíêòîâ), ñ êîòîðûì óñòàíàâëèâàåì ñòîïëîññ îò ãðàíèöû êàíàëà.
//+------------------------------------------------------------------+
//|  ïðèíöèïå, ïî êîíå÷íîìó ðåçóëüòàòó òðåéëèíã ïî öåíîâîìó êàíàëó ïðàêòè÷åñêè ñîâïàäàåò ñ òðåéëèíãîì ïî òåíÿì ñâå÷åé (ñì. âûøå),
//|  à òàêæå â íåêîòîðîé ñòåïåíè íàïîìèíàåò òðåéëèíã ïî ôðàêòàëàì, õîòü è îòëè÷àåòñÿ ïî "êîíöåïöèè" è "öåëåñîîáðàçíîñòè".
//+------------------------------------------------------------------+
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)
      OrderModify(iTicket,OrderOpenPrice(),dChnl_min,OrderTakeProfit(),OrderExpiration());         
      }
   
   // åñëè ïîçèöèÿ - êîðîòêàÿ, è å¸ ñòîïëîññ õóæå (âûøå âåðõíåé ãðàíèöû êàíàëà èëè íå îïðåäåë¸í, ==0), ìîäèôèöèðóåì åãî
   if (OrderType()==OP_SELL)
      {
      if ((OrderStopLoss()==0) || (OrderStopLoss()>dChnl_max))
      OrderModify(iTicket,OrderOpenPrice(),dChnl_max,OrderTakeProfit(),OrderExpiration());         
      }
   }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÑÊÎËÜÇßÙÅÌÓ ÑÐÅÄÍÅÌÓ                                 |
//| Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè è ïàðàìåòðû ñðåäíåé (òàéìôðåéì, | 
//| ïåðèîä, òèï, ñäâèã îòíîñèòåëüíî ãðàôèêà, ìåòîä ñãëàæèâàíèÿ,      |
//| ñîñòàâëÿþùàÿ OHCL äëÿ ïîñòðîåíèÿ, ¹ áàðà, íà êîòîðîì áåðåòñÿ     |
//| çíà÷åíèå ñðåäíåé. 
//+------------------------------------------------------------------+
//| Èäåÿ, â ïðèíöèïå, "â ïîëóøàãå" îò òðåéëèíãà ïî öåíîâîìó êàíàëó. Ôóíêöèè ïåðåäà¸òñÿ òèêåò ïîçèöèè, íåîáõîäèìûé òàéìôðåéì, 
//| îòñòóï îò ñðåäíåé (ïóíòîâ), íà êîòîðîì óñòàíàâëèâàåòñÿ ñòîïëîññ è ñîáñòâåííî ïàðàìåòðû ñðåäíåãî (àíàëîãè÷íî ñòàíäàðòíûì 
//| â iMA()). Ó÷èòûâàÿ ïðèðîäó ìóâèíãîâ, íåñëîæíî äîãàäàòüñÿ, ÷òî äàííûé àëãîðèòì ìîæåò äàâàòü âåñüìà íåïëîõîå ïîäæàòèå ïðè òðåíäå,
//|  âî ôëýòå, îäíàêî, "ïóòàÿñü" ñ êóðñîì è ÷àñòî ïðèâîäÿ ê ïðåæäåâðåìåííîìó çàêðûòèþ. Âïðî÷åì, ìîæíî ïîïûòàòüñÿ ìåíÿòü ïàðàìåòðû
//|  òðàëà (â ÷àñòíîñòè, ïåðèîä è ìåòîä óñðåäíåíèÿ) àäåêâàòíî ðûíî÷íîé ñèòóàöèè (ó÷èòûâàÿ âîëàòèëüíîñòü, íàïðèìåð).
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| iTicket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| iTmFrme - ïåðèîä ÷àðòà, íà êîòîðîì áóäåò ðàñ÷èòûâàòüñÿ ìóâèíã; äîïóñòèìûå âàðèàíòû ââîäà: 1 (M1), 5 (M5), 15 (M15), 30 (M30), 60 (H1), 240 (H4), 1440 (D), 10080 (W), 43200 (MN);
//| iMAPeriod - ïåðèîä óñðåäíåíèÿ äëÿ âû÷èñëåíèÿ ñêîëüçÿùåãî ñðåäíåãî;
//| iMAShift - ñäâèã èíäèêàòîðà îòíîñèòåëüíî öåíîâîãî ãðàôèêà;
//| iMAMethod - ìåòîä óñðåäíåíèÿ; äîïóñòèìûå âàðèàíòû ââîäà: 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 - ñäâèã îòíîñèòåëüíî òåêóùåãî áàðà íà óêàçàííîå êîëè÷åñòâî ïåðèîäîâ íàçàä;
//| iIndent - îòñòóï (ïóíêòîâ) îò çíà÷åíèÿ ñðåäíåãî ïðè ðàçìåùåíèè ñòîïëîññà.
//+------------------------------------------------------------------+

//    Äîïóñòèìûå âàðèàíòû ââîäà:   
//    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, öåëûå ÷èñëà;


extern int        iTmFrme      =  0;
extern int        iMAPeriod    =  0;
extern int        iMAShift     =  0;
extern int        MAMethod     =  0;
extern int        iApplPrice   =  0;
extern int        iShift       =  0;
extern int        iIndent      =  0;


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)
      OrderModify(iTicket,OrderOpenPrice(),dMA-iIndent*Point,OrderTakeProfit(),OrderExpiration());         
      }
   
   // åñëè ïîçèöèÿ - êîðîòêàÿ, è å¸ ñòîïëîññ õóæå (âûøå âåðõíåé ãðàíèöû êàíàëà èëè íå îïðåäåë¸í, ==0), ìîäèôèöèðóåì åãî
   if (OrderType()==OP_SELL)
      {
      if ((OrderStopLoss()==0) || (OrderStopLoss()>dMA+(MarketInfo(Symbol(),MODE_SPREAD)+iIndent)*Point))
      OrderModify(iTicket,OrderOpenPrice(),dMA+(MarketInfo(Symbol(),MODE_SPREAD)+iIndent)*Point,OrderTakeProfit(),OrderExpiration());         
      }
   }
//+------------------------------------------------------------------+

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

//| Èäåÿ ñëåäóþùàÿ: ïî çàêðûòèþ î÷åðåäíîãî áàðà óìåíüøàåì ðàññòîÿíèå ìåæäó ñòîïëîññîì è òåêóùèì êóðñîì â dCoeff ðàç 
//| (èñõîäíî ÿ âçÿë 0,5, ò.å. íàïîëîâèíó, îòêóäà è íàçâàíèå). Ò.å., äîïóñòèì, îòêðûòà ïîêóïêà ñî ñòîïëîññîì â 40 ïóíêòîâ. 
//| Ïî çàêðûòèþ áàðà, íà êîòîðîì áûë ñîâåðøåí âõîä â ðûíîê, Bid îêàçàëñÿ âûøå êóðñà îòêðûòèÿ íà 42 ïóíêòà. 
//| Åñëè ìû âûáðàëè âàðèàíò òðàëà òîëüêî "â ïðîôèòå" (bTrlinloss==true), òî áåðåì ðàññòîÿíèå îò êóðñà îòêðûòèÿ äî òåêóùåãî êóðñà 
//| - 42 ï., ìíîæèì åãî íà dCoeff (íàïðèìåð, 0.5), è ïîëó÷èâ 21 ï., ïåðåíîñèì ñòîïëîññ â +21. Ïóñòü ïðè çàêðûòèè ñëåäóþùåãî áàðà 
//| ïðîôèò ñîñòàâèë +71 ï. Òîãäà ðàçíèöà ìåæäó òåêóùèì ñòîïëîññîì è êóðñîì: 71-21=50, ïîëîâèíà îò íàéäåííîãî çíà÷åíèÿ - 50*0.5=25,
//|  è íîâûé ñòîïëîññ äîëæåí áûòü óñòàíîâëåí íà 25 ï. âûøå ïðåäûäóùåãî (21+25=46 ï. îò êóðñà îòêðûòèÿ).
//+------------------------------------------------------------------+
//| Ïðè îïèñàííîì âàðèàíò òðåéëèíãà, "â ïðîôèòå" (bTrlinloss==true), ñòîïëîññ ïåðåíîñèòñÿ ëèøü ïðè óñëîâèè, ÷òî íîâûé ñòîïëîññ 
//| áóäåò "ëó÷øå" êóðñà îòêðûòèÿ. Åñëè æå óñòàíîâèòü bTrlinloss ðàâíûì false, òî òðàë áóäåò îñóùåñòâëÿòüñÿ è íà "ëîññîâîì" 
//| ó÷àñòêå (ò.å. èíòåðâàëå ìåæäó êóðñîì îòêðûòèÿ è ñòîïëîññîì, êîòîðûé, êñòàòè, äîëæåí áûòü îáÿçàòåëüíî îïðåäåë¸í (íå ðàâåí 0),
//|  ÷òîáû äàííûé ýëåìåíò ñðàáîòàë). Ò.å., åñëè âçÿòü âûøåîïèñàííûé âàðèàíò, òî ïî çàêðûòèè ïåðâîãî áàðà ñòîïëîññ áóäåò ïåðåìåùåí
//|  íà 0.5 äèñòàíöèè íå ìåæäó îòêðûòèåì è òåêóùèì êóðñîì, à ìåæäó ñòîïëîññîì è òåêóùèì êóðñîì (ïðè ñòîïëîññå â 40 ï. è ïðîôèòå 
//| â 42 ï. ýòî ðàññòîÿíèå ñîñòàâèò (40+42)/2 = 82/2 = 41 ï., ñòîïëîññ áóäåò óñòàíîâëåí â +1 ï. îò êóðñà îòêðûòèÿ. Íà âòîðîì áàðå, 
//| ïðè ïðîôèòå â 71 ï.: à) 71 - 1 = 70, á) 70*0.5 = 35, â) 1 + 35 = 36 ï. Êàê âèäèì, òàêîé âàðèàíò áóäåò ñòàðòîâàòü ñ áîëüøåé 
//| "äèñòàíöèè" è íåñêîëüêî îòñòàâàòü îò ïåðâîãî. Åãî îñíîâíàÿ ôóíêöèÿ - ïîäæàòèå ñòîïëîññà ïðè íåãàòèâíîì ðàçâèòèè ñîáûòèé. 
//| Íàïðèìåð, åñëè ïî çàêðûòèþ ïåðâîãî áàðà ïðîôèò ñîñòàâèë -10 ï., òî ïðè bTrlinloss==true ìû: à) íàéäåì ðàññòîÿíèå îò êóðñà äî
//|  ñòîïëîññà, |-40 + (-10)| = 30 ï., á) ðàññ÷èòàåì ïîëîâèíó ýòîãî çíà÷åíèÿ - 30*0.5 = 15 ï. è â) ïåðåìåñòèì ñòîïëîññ â ñòîðîíó 
//| ïðîôèòà íà ýòî ðàññòîÿíèå: -40 + 15 = -25.
//+------------------------------------------------------------------+
//| Ïðè òðåéëèíãå â ëîññå óâåëè÷èâàåòñÿ êîëè÷åñòâî ïðåæäåâðåìåííûõ çàêðûòèé (ïðè÷åì ñ íåáîëüøèì óáûòêîì), 
//| îäíàêî ñòðàõóåìñÿ îò ïîëó÷åíèÿ áîëüøèõ ëîññîâ.
//+------------------------------------------------------------------+
//| Ïàðàìåòðû:
//| iTicket - óíèêàëüíûé ïîðÿäêîâûé íîìåð îðäåðà (âûáðàííûé ïåðåä âûçîâîì ôóíêöèè ñ ïîìîùüþ OrderSelect());
//| iTmFrme - ïåðèîä ÷àðòà, ïî áàðàì êîòîðîãî áóäåò îñóùåñòâëÿòüñÿ òðåéëèíã; äîïóñòèìûå âàðèàíòû ââîäà: 1 (M1), 5 (M5), 15 (M15), 30 (M30), 60 (H1), 240 (H4), 1440 (D), 10080 (W), 43200 (MN);
//+------------------------------------------------------------------+
//| dCoeff - êîýôôèöèåíò, îïðåäåëÿþùèé òî, â ñêîëüêî ðàç áóäåò ñîêðàùåíî ðàññòîÿíèå ìåæäó êóðñîì íà ìîìåíò çàêðûòèÿ áàðà 
//| è òåêóùèì ñòîïëîññîì;
//| bTrlinloss - óêàçàòåëü òîãî, ñëåäóåò ëè îñóùåñòâëÿòü òðåéëèíã íà ëîññîâîì ó÷àñòêå.
//+------------------------------------------------------------------+

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))
         OrderModify(OrderTicket(),OrderOpenPrice(),dNewSl,OrderTakeProfit(),OrderExpiration(),Red);
         }       
      
      // äåéñòâèÿ äëÿ êîðîòêîé ïîçèöèè   
      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))
         OrderModify(OrderTicket(),OrderOpenPrice(),dNewSl,OrderTakeProfit(),OrderExpiration(),Blue);
         }               
      }
      }   
   }
//+------------------------------------------------------------------+

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