Скачать MetaTrader 5

Добавить возможности в индикатор Parabolic SAR

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Скачай MetaTrader 5 для iPad и торгуй в любом месте!
Forex Trader
114257
Forex Trader 2007.12.16 20:01 
Как можно заставить индикатор расчитываться с указанного бара и цены? Пробовал разобраться в коде пристраивая переменные начала координат, но индикатор либо рисуется каждый раз с бара находящегося рядом от указанного, то всё правильно но при вызове через icustom вообще непонятно как ведет себя...
Подскажите пожалуйста где происходит установка первой координаты, точнее куда можно вклинить свои значения чтобы далее работало корректно.

/**/ - отмечены строки которые я добавил в оригинальный код..

//+------------------------------------------------------------------+
//|                                                Parabolic Sub.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
//----
//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 Yellow
//---- input parameters
extern double Step = 0.02;
extern double Maximum = 0.2;

/**/extern int SAR_start;      // Начальный бар (X)
/**/extern double SAR_V_shift; // Цена с которой начать (Y)
/**/extern bool SAR_dirlong;   // Рассматривать как длинную или короткую позицию

//---- buffers
double SarBuffer[];
//----
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, SarBuffer);
//----
   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 counted_bars_ii=0;
   
//----
   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 = Low[i];
           //----
           if(last_low > price_low)
               last_low = price_low;
           price_high = High[i];
           //----
           if(last_high < price_high)
               last_high = price_high;
           //----
           if(price_high > High[i+1] && price_low > Low[i+1]) 
               break;
           //----
           if(price_high < High[i+1] && price_low < Low[i+1])
             { 
               dirlong = false; 
               break; 
             }
           i--;
         }
       //---- initial zero
/**/       if(counted_bars_ii == 0){i=SAR_start;}
       int k = i;
       //Print("  k=", k, "  Bars=", Bars);      
       //----
       while(k < Bars)
         {
           SarBuffer[k] = 0.0;
           k++;
         }
       //---- check further
       
/**/       if(counted_bars_ii == 0){dirlong=SAR_dirlong;}
       if(dirlong)
         { 
/**/           if(counted_bars_ii == 0){SarBuffer[i] = SAR_V_shift; ep = SAR_V_shift;}
/**/           else
           {SarBuffer[i] = Low[i+1];
           ep = High[i];}
         }
       else        
         { 
/**/           if(counted_bars_ii == 0){SarBuffer[i] = SAR_V_shift; ep = SAR_V_shift;}
/**/           else
           {SarBuffer[i] = High[i+1]; 
           ep = Low[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 = Low[i];
       price_high = High[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))
       
/**/  if(counted_bars_ii == 0){price = SAR_V_shift;}
/**/  else
      {price = SarBuffer[i+1];}
  
      sar = price + start*(ep - price);     
       //----
       if(dirlong)
         {
           if(ep < price_high && (start + Step) <= Maximum) 
               start += Step;
           //----
           if(price_high < High[i+1] && i == Bars - 2)  
               sar = SarBuffer[i+1];
           price = Low[i+1];
           //----
           if(sar > price)
               sar = price;
           price = Low[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 < Low[i+1] && i == Bars - 2)  
               sar = SarBuffer[i+1];
           price = High[i+1];
           //----
           if(sar < price)
               sar = price;
           price = High[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--;
       
      counted_bars_ii++; 
     }        //while   
     
//----
   return(0);
  }
//+------------------------------------------------------------------+
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий