Индикатор Parabolic SAR требует для своих вычислений на каждом баре максимальное и минимальное значения (HIgh и Low). Каким образом он может быть рассчитан на средней, которая имеет только одно значение для каждого бара?
Индикатор Parabolic SAR требует для своих вычислений на каждом баре максимальное и минимальное значения (HIgh и Low). Каким образом он может быть рассчитан на средней, которая имеет только одно значение для каждого бара?
Но в программе Румус это реализовано, строится МА от графика цены, а затем в виде источника данных для SAR берется эта МА, т.е. все делается в одном слое. Я полагал что и здесь это возможно, это не так?
Я не знаю что там написано в Румусе, но вот код пользовательского индикатора 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
Я не знаю что там написано в Румусе, но вот код пользовательского индикатора 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
Спасибо за разъяснение.
Хм. Я сейчас как раз с параболиком упражняюсь.
Берем серии High, Low, сглаживаем их, и уже к сглаженным
применяем алгоритм параболика.
Осталось придумать, что теперь с ним делать :-)
Индюк тут https://c.mql5.com/mql4/forum/2008/08/Parabolicrmod.rar
Берем серии High, Low, сглаживаем их, и уже к сглаженным
применяем алгоритм параболика.
Осталось придумать, что теперь с ним делать :-)
Индюк тут https://c.mql5.com/mql4/forum/2008/08/Parabolicrmod.rar
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Хотелось бы построить индикатор 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."
Однако как не бился, не смог найти поле "Применить к". Может поможете это сделать?
Спасибо.