Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
iSAR.Gap
/*
âûçîâ èç êîäîâ - ñòàíäàðòíûå ïîëÿ + ïîëå Gap
double iCustom(
   string symbol,       // ñèìâîëüíîå èìÿ èíñòðóìåíòà (NULL- òåêóùèé)
   int timeframe,       // òàéì-ôðåéì (0- òåêóùèé)
   "iSAR.Gap",          // èìÿ ýòîãî èíäèêàòîðà
   //
   double step,         // øàã ôàêòîðà óñêîðåíèÿ è åãî íà÷àëüíîå çíà÷åíèå
   double maximum       // ìàêñèìàëüíîå çíà÷åíèå ôàêòîðà óñêîðåíèÿ
   int GapPoints,       // ïîðîã äëÿ èäåíòèôèêàöèè ãýïà â ïï; 
                           // =0- ñòàíäàðíûé ðåæèì
                           // <0- âûâîä áåç ñìåùåíèÿ
   //
   int mode,            // mode - íîìåð áóôåðà èíäèêàòîðà (0)
   int shift            // ñäâèã
   ) 

==============

iCustom(NULL,0,"iSAR.Gap",Step,Maximum,GapPoints, 0,i);
*/

//Added Fix1 September 6, 2006 Advance Index if new bar by Stanley Fiala http://merlin4x.com
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
//---- input parameters
extern double Step = 0.02;
extern double Maximum = 0.2;
extern int GapPoints=0; // ïîðîã èäåíòèôèêàöèè ãýïà â ïï.
 int GapHours=8; // ïîðîã ïî âðåìåíè â ÷àñàõ (>0) èëè â ìèíóòàõ (<0)
//---- buffers
double SarBuffer[];
double   HighG[],
         LowG[],
         SAR[],
         Base[];
//----
int    save_lastreverse;
bool   save_dirlong;
double save_start;
double save_last_high;
double save_last_low;
double save_ep;
double save_sar;
int    bartime;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_ARROW);
   SetIndexArrow(0, 159);
   SetIndexBuffer(0, SAR);

   // áóôåðû áåçãýïîâûõ êîòèðîâîê
   IndicatorBuffers(5);
   SetIndexBuffer(1, SarBuffer);
   SetIndexBuffer(2,HighG); 
   SetIndexBuffer(3,LowG); 
   SetIndexBuffer(4,Base); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SaveLastReverse(int last, int dir, double start, double low, double high, 
                     double ep, double sar)
  {
   save_lastreverse = last;
   save_dirlong = dir;
   save_start = start;
   save_last_low = low;
   save_last_high = high;
   save_ep = ep;
   save_sar = sar;
  }
//+------------------------------------------------------------------+
//| Parabolic Sell And Reverse system                                |
//+------------------------------------------------------------------+
int start()
  {
   static bool first = true;
   bool   dirlong;
   double start, last_high, last_low;
   double ep, sar, price_low, price_high, price;
   int    i, counted_bars = IndicatorCounted();

   // îáðàáîòêà ãýïà ////////
   int limit=Bars-counted_bars-1;  
   if(limit>1) limit=Bars-1; 
   for(i=limit;i>=0;i--) {
      // ñìåùåíèå
      double base=iCustom(NULL,0,"KillGap",GapPoints,GapHours,0,1,i);
      // çàïîëíåíèå áóôåðîâ áåçãïîâûìè êîòèðîâêàìè
      Base[i]=base; // ñìåùåíèå
      HighG[i]=High[i]+base; // áåçãýïîâûé High
      LowG[i] =Low[i] +base; // áåçãýïîâûé Low
     }
   //////////////////////////
//----
   if(Bars < 3) 
       return(0);
//---- initial settings
   i = Bars - 2;
//----
   if(counted_bars == 0 || first)
     {
       first = false;
       dirlong = true;
       start = Step;
       last_high = -10000000.0;
       last_low = 10000000.0;
       //----
       while(i > 0)
         {
           save_lastreverse = i;
           price_low = LowG[i];
           //----
           if(last_low > price_low)
               last_low = price_low;
           price_high = HighG[i];
           //----
           if(last_high < price_high)
               last_high = price_high;
           //----
           if(price_high > HighG[i+1] && price_low > LowG[i+1]) 
               break;
           //----
           if(price_high < HighG[i+1] && price_low < LowG[i+1])
             { 
               dirlong = false; 
               break; 
             }
           i--;
         }
       //---- initial zero
       int k = i;
       Print("  k=", k, "  Bars=", Bars);      
       //----
       while(k < Bars)
         {
           SarBuffer[k] = 0.0;
           k++;
         }
       //---- check further
       if(dirlong)
         { 
           SarBuffer[i] = LowG[i+1];
           ep = HighG[i];
         }
       else        
         { 
           SarBuffer[i] = HighG[i+1]; 
           ep = LowG[i]; 
         }
       i--;
     }
   else
     {
       i =         save_lastreverse;
       start =     save_start;
       dirlong =   save_dirlong;
       last_high = save_last_high;
       last_low =  save_last_low;
       ep =        save_ep;
       sar =       save_sar;
       // Fix1 start
       // If new bar increment index   
       if(Time[0] != bartime)       
         {
           bartime = Time[0];
           i++;
         }
       //Fix1 end         
     }
//----
   while(i >= 0)
     {
       price_low = LowG[i];
       price_high = HighG[i];
       //--- check for reverse from long to short
       if(dirlong && price_low < SarBuffer[i+1])
         {
           SaveLastReverse(i, true, start, price_low, last_high, ep, sar);
           start = Step; 
           dirlong = false;
           ep = price_low;  
           last_low = price_low;
           SarBuffer[i] = last_high;
           i--;
           continue;
         }
       //--- check for reverse from short to long  
       if(!dirlong && price_high > SarBuffer[i+1])
         {
           SaveLastReverse(i, false, start, last_low, price_high, ep, sar);
           start = Step; 
           dirlong = true;
           ep = price_high; 
           last_high = price_high;
           SarBuffer[i] = last_low;
           i--;
           continue;
         }
       //sar(i) = sar(i+1)+start*(ep-sar(i+1))
       price = SarBuffer[i+1];
       sar = price + start*(ep - price);
       //----
       if(dirlong)
         {
           if(ep < price_high && (start + Step) <= Maximum) 
               start += Step;
           //----
           if(price_high < HighG[i+1] && i == Bars - 2)  
               sar = SarBuffer[i+1];
           price = LowG[i+1];
           //----
           if(sar > price)
               sar = price;
           price = LowG[i+2];
           //----
           if(sar > price)
               sar = price;
           //----
           if(sar > price_low)
             {
               SaveLastReverse(i, true, start, price_low, last_high, ep, sar);
               start = Step; 
               dirlong = false; 
               ep = price_low;
               last_low = price_low;
               SarBuffer[i] = last_high;
               i--;
               continue;
             }
           //----
           if(ep < price_high)
             {
               last_high = price_high;
               ep = price_high;
             }
         }     //dir-long
       else
         {
           if(ep > price_low && (start + Step) <= Maximum) 
               start += Step;
           //----
           if(price_low < LowG[i+1] && i == Bars - 2)  
               sar = SarBuffer[i+1];
           price = HighG[i+1];
           //----
           if(sar < price)
               sar = price;
           price = HighG[i+2];
           //----
           if(sar < price)
               sar = price;
           //----
           if(sar < price_high)
             {
               SaveLastReverse(i, false, start, last_low, price_high, ep,sar);
               start = Step; 
               dirlong = true; 
               ep = price_high;
               last_high = price_high;
               SarBuffer[i] = last_low;
               i--;
               continue;
             }
           //----
           if(ep > price_low)
             {
               last_low = price_low; 
               ep = price_low; 
             }
         }     //dir-short
       SarBuffer[i] = sar;
       i--;
     }        //while   
//   sar=SarBuffer[0];
//   price=iSAR(NULL,0,Step,Maximum,0);
//   if(sar!=price) Print("custom=",sar,"   SAR=",price,"   counted=",counted_bars);
//   if(sar==price) Print("custom=",sar,"   SAR=",price,"   counted=",counted_bars);
//----
   
   for(i=limit;i>=0;i--) SAR[i]=SarBuffer[i]-Base[i];

   
   return(0);
  }
//+------------------------------------------------------------------+


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