TrailingStopFrCn

Author: Copyright � 2010, cmillion@narod.ru
Price Data Components
Series array that contains the lowest prices of each barSeries array that contains the highest prices of each bar
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategy
Indicators Used
Fractals
0 Views
0 Downloads
0 Favorites
TrailingStopFrCn
//+------------------------------------------------------------------+
//|                                                 TrailingStop.mq4 |
//|                               Copyright © 2010, Õëûñòîâ Âëàäèìèð |
//|                                         http://cmillion.narod.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, cmillion@narod.ru"
#property link      "http://cmillion.narod.ru"
//--------------------------------------------------------------------
/*Îïèñàíèå:
Ìîæåò çàïóñêàòüñÿ êàê îòäåëüíûé ñîâåòíèê èëè êàê ñêðèïò, ñîâìåñòíî ñ ëþáûì ñîâåòíèêîì.  
 çàâèñèìîñòè îò ïåðåìåííîé TrailingStop, òðåéëèíã ìîæåò îñóùåñòâëÿòüñÿ ïî ôðàêòàëàì, 
ïî ýêñòðåìóìàì ïðîøëûõ áàðîâ èëè ïî óêàçàííîìó êîë-âó ïóíêòîâ. 
Åñëè TrailingStop áîëüøå 0, òî òðåéëèíã áóäåò îñóùåñòâëåí ñ òåì êîë-âîì ïóíêòîâ, 
êîòîðîå óêàçàíî â ïåðåìåííîé TrailingStop. Åñëè TrailingStop ìåíüøå îãðàíè÷åíèÿ 
ìèíèìàëüíîãî óðîâíÿ ñòîïîâ, òî òðåéëèíã áóäåò ñ ìèíèìàëüíûìè ñòîïàìè.
Åñëè TrailingStop = 0 è Tip.Fr.or.Candl=0, òî òðåéëèíã áóäåò ïî ôðàêòàëàì. 
Ò.å. äëÿ óðîâíÿ ñòîïëîññ âûáèðàåòñÿ ïåðâûé ñîîòâåòñòâóþùèé ôðàêòàë.
Åñëè TrailingStop = 0 è Tip.Fr.or.Candl=1, òî òðåéëèíã áóäåò ïî ìèíèìóìàì/ìàêñèìóìàì 
ïðîøëûõ ñâå÷åé.
Åñëè  Magic = 0, òî òðåéëèíã ïðîâîäèòñÿ ïî âñåì îðäåðàì òåêóùåãî ñèìâîëà, áåç ó÷åòà 
ìàãè÷åñêîãî íîìåðà. Åñëè â ïåðåìåííîé Magic óêàçàí ìàãè÷åñêèé íîìåð, òî ñîîòâåòñòâåííî 
áóäåò òîëüêî  òðåéëèíã îðäåðîâ ñ íîìåðîì Magic.
Åñëè OnlyProfit = true, òî ìîäèôèöèðóþòñÿ òîëüêî ïðîôèòíûå îðäåðà
Åñëè OnlyWithoutLoss = true, òî âìåñòî òðåéëèíãà îðäåðà òîëüêî ïåðåâîäÿòñÿ â áåçóáûòîê
Âèçóàëèçàöèÿ:
Íà ýêðàíå îòîáðàæàåòñÿ èíôîðìàöèÿ î òåêóùåé ðàáîòå ñêðèïòà:
- óñòàíîâêè ñ êîòîðûìè ñêðèïò çàïóùåí
- êîëè÷åñòâî îðäåðîâ ñ êîòîðûìè ñêðèïò ðàáîòàåò
- òåêóùåå âðåìÿ
- ìèíèìàëüíûå óðîâíè âûñòàâëåíèÿ ñòîïîâ (-)
- òåêóùèå âîçìîæíûå óðîâíè ñòîïîâ (öåíîâûå ìåòêè)
Ñîâåòû:
Ñêðèïò çàêàí÷èâàåò ðàáîòó, êîãäà âñå îðäåðà çàêðûòû. Åñëè ïðîãðàììà çàïóùåíà êàê ñîâåòíèê, 
òî âûõîä èç ïðîãðàììû òîëüêî âðó÷íóþ.
*/
                                     
//--------------------------------------------------------------------
extern bool OnlyProfit       = true; //òîëüêî ïðîôèòíûå îðäåðà
extern bool OnlyWithoutLoss  = false;//òîëüêî áåç óáûòîê
extern int  Magic            = 0;
extern int  TrailingStop     = 0;    //åñëè= 0, òî òðåéëèíã ïî ôðàêòàëàì èëè ñâå÷àì
extern int  Tip.Fr.or.Candl  = 1;    //åñëè= 0, òî òðåéëèíã ïî ôðàêòàëàì 
                                     //åñëè= 1, òî òðåéëèíã ïî ñâå÷àì
//--------------------------------------------------------------------
int  delta, n,DIGITS;
datetime TIME;
double BID,ASK,POINT;
//--------------------------------------------------------------------
int start()                                  
{
   ObjectCreate("info", OBJ_LABEL, 0, 0, 0);
   ObjectSet("info", OBJPROP_CORNER, 1);      
   ObjectSet("info", OBJPROP_XDISTANCE, 200 ); 
   ObjectSet("info", OBJPROP_YDISTANCE, 0);
   string txt;
   POINT=MarketInfo(Symbol(),MODE_POINT);
   DIGITS=MarketInfo(Symbol(),MODE_DIGITS);
   if (TrailingStop!=0 && TrailingStop<MarketInfo(Symbol(),MODE_STOPLEVEL)) 
      TrailingStop=MarketInfo(Symbol(),MODE_STOPLEVEL);
   if (Magic==0) txt=StringConcatenate("total orders ",Symbol()); 
   else  txt=StringConcatenate("orders ",Symbol()," Magic ",Magic);
   if (TrailingStop!=0) txt=StringConcatenate("  ",TrailingStop," ï "); 
   else  if (Tip.Fr.or.Candl==0) txt=" Fractals "; else txt=" ïî ñâå÷àì ";
   Comment("Start TrailingStop ",txt,TimeToStr(TimeCurrent(),TIME_MINUTES));
   while(true)
   {
      RefreshRates();
      BID = MarketInfo(Symbol(),MODE_BID);
      ASK = MarketInfo(Symbol(),MODE_ASK);
      TIME = iTime(Symbol(),0,0);
      delta = MarketInfo(Symbol(),MODE_STOPLEVEL);
      if (delta<TrailingStop)delta=TrailingStop;
      ObjectSetText("info",StringConcatenate("TrailingStop ",txt," Orders ", n,"  ",
      TimeToStr(TimeCurrent(),TIME_SECONDS)),8,"Arial",Aqua);
      TrailingStop();
      if (n==0) break;
      Sleep(1000);
   }
   Comment("Íåò îòêðûòûõ îðäåðîâ. Çàêðûòèå ñêðèïòà ",
   TimeToStr(TimeCurrent(),TIME_MINUTES));
   ObjectDelete("SL Buy");
   ObjectDelete("SL Sell");
   ObjectDelete("info");
   ObjectDelete("SL-");
   ObjectDelete("SL+");
}
//--------------------------------------------------------------------
void TrailingStop()
{
   int tip,Ticket;
   bool error;
   double StLo,OSL,OOP;
   n=0;
   for (int i=0; i<OrdersTotal(); i++) 
   {  if (OrderSelect(i, SELECT_BY_POS)==true)
      {  tip = OrderType();
         if (tip<2 && OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || Magic==0))
         {
            OSL   = OrderStopLoss();
            OOP   = OrderOpenPrice();
            Ticket = OrderTicket();
            if (tip==OP_BUY)             
            {  n++;
               StLo = SlLastBar(1,BID,Tip.Fr.or.Candl,TrailingStop);        
               if (StLo <= OOP && OnlyProfit) continue;
               if (OSL  >= OOP && OnlyWithoutLoss) continue;
               if (StLo > OSL)
               {  error=OrderModify(Ticket,OOP,NormalizeDouble(StLo,DIGITS),
                  OrderTakeProfit(),0,White);
                  Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  Sleep(500);
                  if (!error) Comment("Error order ",Ticket," TrailingStop ",
                              GetLastError(),"   ",Symbol(),"   SL ",StLo);
               }
            }                                         
            if (tip==OP_SELL)        
            {  n++;
               StLo = SlLastBar(-1,ASK,Tip.Fr.or.Candl,TrailingStop);  
               if (StLo==0) continue;        
               if (StLo >= OOP && OnlyProfit) continue;
               if (OSL  >= OOP && OnlyWithoutLoss) continue;
               if (StLo < OSL || OSL==0 )
               {  error=OrderModify(Ticket,OOP,NormalizeDouble(StLo,DIGITS),
                  OrderTakeProfit(),0,White);
                  Comment("TrailingStop "+Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  Sleep(500);
                  if (!error) Comment("Error order ",Ticket," TrailingStop ",
                              GetLastError(),"   ",Symbol(),"   SL ",StLo);
               }
            } 
         }
      }
   }
}
//--------------------------------------------------------------------
double SlLastBar(int tip,double price, int tipFr, int tral)
{
   double fr;
   int jj,ii;
   if (tral!=0)
   {
      if (tip==1) fr = BID - tral*POINT;  
      else fr = ASK + tral*POINT;  
   }
   else
   {
      if (tipFr==0)
      {
         if (tip== 1)
         for (ii=1; ii<100; ii++) 
         {
            fr = iFractals(NULL,0,MODE_LOWER,ii);
            if (fr!=0) if (price-delta*POINT > fr) break;
            else fr=0;
         }
         if (tip==-1)
         for (jj=1; jj<100; jj++) 
         {
            fr = iFractals(NULL,0,MODE_UPPER,jj);
            if (fr!=0) if (price+delta*POINT < fr) break;
            else fr=0;
         }
      }
      else
      {
         if (tip== 1)
         for (ii=1; ii<100; ii++) 
         {
            fr = iLow(NULL,0,ii);
            if (fr!=0) if (price-delta*POINT > fr) break;
            else fr=0;
         }
         if (tip==-1)
         for (jj=1; jj<100; jj++) 
         {
            fr = iHigh(NULL,0,jj);
            if (price+delta*POINT < fr) break;
            else fr=0;
         }
      }
   }
   if (tip== 1)
   {
      ObjectDelete("SL Buy");
      ObjectDelete("SL-");
      ObjectCreate("SL Buy",OBJ_ARROW,0,TIME,fr,0,0,0,0);                     
      ObjectSet   ("SL Buy",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SL Buy",OBJPROP_COLOR, Blue);
      ObjectCreate("SL-",OBJ_ARROW,0,TIME,price-delta*POINT,0,0,0,0);                     
      ObjectSet   ("SL-",OBJPROP_ARROWCODE,4);
      ObjectSet   ("SL-",OBJPROP_COLOR, Blue);
   }
   if (tip==-1)
   {
      ObjectDelete("SL Sell");
      ObjectDelete("SL+");
      ObjectCreate("SL Sell",OBJ_ARROW,0,TIME,fr,0,0,0,0);
      ObjectSet   ("SL Sell",OBJPROP_ARROWCODE,6);
      ObjectSet   ("SL Sell", OBJPROP_COLOR, Green);
      ObjectCreate("SL+",OBJ_ARROW,0,TIME,price+delta*POINT,0,0,0,0);                     
      ObjectSet   ("SL+",OBJPROP_ARROWCODE,4);
      ObjectSet   ("SL+",OBJPROP_COLOR, Green);
   }
   return(fr);
}
//--------------------------------------------------------------------

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