KillLoss





//+------------------------------------------------------------------+
//|                                                     KillLoss.mq4 |
//|                                                              I_D |
//|                                            http://www.mymmk.com/ |
//+------------------------------------------------------------------+
#property copyright "I_D"
#property link      "http://www.mymmk.com/ Ñîôò äëÿ óïðàâëåíèÿ êàïèòàëîì"

extern   int      iTicket;             // óíèêàëüíûé íîìåð (òèêåò) îòêðûòîé ïîçèöèè
extern   double   dSpeedCoeff = 1;     // êîýôôèöèåíò óñèëåíèÿ, îïðåäåëÿþùèé, êàê áûñòðî äâèæåòñÿ ñòîïëîññ íàâñòðå÷ó êóðñó â çîíå ëîññîâ

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

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {    
   return(0);
  }
  
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
  
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   KillLoss(iTicket,dSpeedCoeff);
   return(0);
  }
//+------------------------------------------------------------------+

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



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

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

Other Features: