TrailingFiftyFifty





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

extern   int      iTicket;             // óíèêàëüíûé íîìåð (òèêåò) îòêðûòîé ïîçèöèè
extern   int      iTmFrme = 60;        // ïåðèîä ÷àðòà, ïî áàðàì êîòîðîãî ïðîèñõîäèò ïîäæàòèå
extern   double   dCoeff = 0.5;        // "êîýôôèöèåíò ïîäæàòèÿ", â % îò 0.01 äî 1 
extern   bool     bTrlinloss = false;  // ñëåäóåò ëè òðàëèòü íà ó÷àñòêå ëîññîâ (ìåæäó êóðñîì ñòîïëîññà è îòêðûòèÿ)

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

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {    
   return(0);
  }
  
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
  
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   TrailingFiftyFifty(iTicket,iTmFrme,dCoeff,bTrlinloss);
   return(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());
            }
         }               
      }
      }   
   }
//+------------------------------------------------------------------+



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: