Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Хочешь написать торгового робота? Загляни в Справочник MQL5!
Forex Trader
114375
Forex Trader 2008.08.04 12:09 
Здравствуйте,
Хотелось бы построить индикатор SAR, наложенный на скользящую среднюю МА.
В хелпе к МТ написано:
"При этом можно строить индикаторы не только от ценовых данных и их производных (Median Price, Typical Price, Weighted Close), но и от других индикаторов. Например, можно построить индикатор Moving Average от Awesome Oscillator и тем самым получить в дополнение к AO сигнальную линию. Для этого необходимо сначала построить индикатор AO, а затем при помощи технологии Drag`n`Drop наложить MA на AO и в его настройках в поле "Применить к" выбрать "Previous Indicator Data" (наложить индикатор на данные предыдущего индикатора). Если выбрать "First Indicator Data", MA будет строиться на основании данных самого первого индикатора, которым не обязательно является AO."
Однако как не бился, не смог найти поле "Применить к". Может поможете это сделать?
Спасибо.
Forex Trader
114375
Forex Trader 2008.08.04 13:26  
Индикатор Parabolic SAR требует для своих вычислений на каждом баре максимальное и минимальное значения (HIgh и Low). Каким образом он может быть рассчитан на средней, которая имеет только одно значение для каждого бара?
Forex Trader
114375
Forex Trader 2008.08.04 15:15  
Индикатор Parabolic SAR требует для своих вычислений на каждом баре максимальное и минимальное значения (HIgh и Low). Каким образом он может быть рассчитан на средней, которая имеет только одно значение для каждого бара?


Но в программе Румус это реализовано, строится МА от графика цены, а затем в виде источника данных для SAR берется эта МА, т.е. все делается в одном слое. Я полагал что и здесь это возможно, это не так?
Forex Trader
114375
Forex Trader 2008.08.05 12:12  
Я не знаю что там написано в Румусе, но вот код пользовательского индикатора Parabolic SAR, и в нем в явном виде прописаны High и Low:
   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
       int k = i;
       Print("  k=", k, "  Bars=", Bars);      
       //----
       while(k < Bars)
         {
           SarBuffer[k] = 0.0;
           k++;
         }
       //---- check further
       if(dirlong)
         { 
           SarBuffer[i] = Low[i+1];
           ep = High[i];
         }
       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))
       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--;




Посмотрите описание индикатора у Наймана, например - http://www.iilab.ru/Library/ErikNiman19.aspx

Forex Trader
114375
Forex Trader 2008.08.05 15:47  
Я не знаю что там написано в Румусе, но вот код пользовательского индикатора Parabolic SAR, и в нем в явном виде прописаны High и Low:
   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
       int k = i;
       Print("  k=", k, "  Bars=", Bars);      
       //----
       while(k < Bars)
         {
           SarBuffer[k] = 0.0;
           k++;
         }
       //---- check further
       if(dirlong)
         { 
           SarBuffer[i] = Low[i+1];
           ep = High[i];
         }
       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))
       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--;




Посмотрите описание индикатора у Наймана, например - http://www.iilab.ru/Library/ErikNiman19.aspx


Спасибо за разъяснение.
Forex Trader
114375
Forex Trader 2008.08.14 17:37  
Хм. Я сейчас как раз с параболиком упражняюсь.
Берем серии High, Low, сглаживаем их, и уже к сглаженным
применяем алгоритм параболика.



Осталось придумать, что теперь с ним делать :-)
Индюк тут http://forum.mql4.com/c/forum/2008/08/Parabolicrmod.rar
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий