TrailingByFractals

Author: I_D
TrailingByFractals
Price Data Components
Series array that contains the lowest prices of each barSeries array that contains the highest prices of each bar
Orders Execution
It can change open orders parameters, due to possible stepping strategy
0 Views
0 Downloads
0 Favorites
TrailingByFractals
//+------------------------------------------------------------------+
//|                                           TrailingByFractals.mq4 |
//|                                                              I_D |
//|                                            http://www.mymmk.com/ |
//+------------------------------------------------------------------+
#property copyright "I_D"
#property link      "http://www.mymmk.com/ Ñîôò äëÿ óïðàâëåíèÿ êàïèòàëîì"

extern   int      iTicket;             // óíèêàëüíûé íîìåð (òèêåò) îòêðûòîé ïîçèöèè
extern   int      iTmfrm;              // ïåðèîä ãðàôèêà, íà êîòîðîì îïðåäåëÿþòñÿ ôðàêòàëû (1, 5, 15, 30, 60, 240, 1440, 10080, 43200)
extern   int      iFrktl_bars = 5;     // êîë-âî áàðîâ âî ôðàêòàëå
extern   int      iIndent = 3;         // îòñòóï îò òåíè áàðà, íà êîòîðîì ðàçìåùàåòñÿ ñòîïëîññ
extern   bool     bTrlinloss = false;  // ñëåäóåò ëè òðàëèòü íà ó÷àñòêå ëîññîâ (ìåæäó êóðñîì ñòîïëîññà è îòêðûòèÿ)

//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ ÏÎ ÔÐÀÊÒÀËÀÌ                                            |
//| Ïðè çàïóñêå ýêñïåðòà åìó íåîáõîäèìî óêàçàòü óíèêàëüíûé íîìåð     |
//| (òèêåò) îòêðûòîé ïîçèöèè, à òàêæå îïðåäåëèòü ïàðàìåòðû òðåéëèíãà:|
//| òàéìôðåéì, ïî ôðàêòàëàì êîòîðîãî ïðîèçâîäèòñÿ òðåéëèíã, êîë-âî   |
//| áàðîâ â ôðàêòàëå, îòñòóï îò ýêñòðåìóìà (ïóíêòîâ) ïðè ðàçìåùåíèè  |
//| ñòîïëîññà, à òàêæå ñëåäóåò ëè òðàëèòü â çîíå óáûòêîâ (bTrlinloss)|
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {    
   return(0);
  }
  
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
  
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  { 
   TrailingByFractals(iTicket,iTmfrm,iFrktl_bars,iIndent,bTrlinloss);
   return(0);
  }
//+------------------------------------------------------------------+

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());
            }
         }
      }      
   }
//+------------------------------------------------------------------+

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