главная учебник коды официально файлы форум о проекте
AFL (Язык формул АмиБрокера)

Индикатор окончания тенденции на основе стандартной ошибки.

Идея этого индикатора возникла из желания как-то автоматизировать построение трендовых линий.

Часто можно наблюдать, что тенденции имеют достаточно прямолинейный вид. Если начать строить на таком участке линию линейной регрессии, то ширина канала стандартной ошибки «Standard error channel», по мере увеличения длинны линии регрессии, меняется мало. При смене тенденции происходит резкое увеличение ширины канала.




Решил попробовать написать код для автоматизации построения и анализа. В двух словах работу кода можно описать так.

Строим линию регрессию, постоянно оценивая стандартную ошибку. В качестве границы прорыва стандартной ошибки после некоторого колдовства решил использовать среднее приращение цены за один бар. После прорыва границы с места прорыва начинаем строить новую регрессию и т.д.


Для первичного изучения был написан вот такой код
Long = Param("Long", 20, 3, 50, 1);
Level = EMA(abs(C-Ref(C, -1)), 100);
Start = IIf(SelectedValue(BarIndex()) < 5, BarCount - Long - 5, SelectedValue(BarIndex()));
Num = BarIndex() - Start;
Num = IIf(Num < 3 OR Num > Long, Null, Num);
qqq = StdErr(Close, Num);
Plot(qqq, "qqq", IIf(qqq > Level, colorRed, colorGreen), styleLine);
Plot(Level, "", colorBlack, styleLine);

Работает так.
Щелкаем в любое место на графике. От этой линии начинается построение линейной регрессии и расчет стандартной ошибки (зелено-красная на графике). Длину рассчитываемой регрессии можно задавать параметром «Long». Черная линия показывает границу прорыва. Когда стандартная ошибка превышает границу – изменяется её цвет.



Вот собственно и все. Осталось написать окончательный код.
SetBarsRequired(100000, 0);
Level = EMA(abs(C-Ref(C, -1)), 100);
// Минимальная начальная длинна регрессии. Меньше 3 быть не может
startRegressionLength = LastValue(Param("startRegressionLength", 3, 3, 6, 1));

RegressionStart = 0;
StartBar = 0;
StartBarSet = 1;

/* Рассчитываем сразу 98 линий стандартных ошибок длинной 3,4,5,... 100
с названиями Err3, Err4, Err5, ... Err100
Таким образом теоретически максимальная длинна просчитываемой тенденции ограничена ста барами.
Можно конечно написать функцию, которая каждый раз будет просчитывать стандартную ошибку
необходимой длинны,
по началу так и сделал,
но в таком случае потребуется слишком много расчетов, и это будет сильно тормозить скрипт */

for(i = startRegressionLength; i < 100; i++)
{
  VarSet("Err"+i, StdErr(Close, i));
}

/* Функция возвращающая значение стандартной ошибки длинной n на баре k */
function StError(n, k)
{
  Error = VarGet("Err"+n);
  return Error[k];
}
for(i = startRegressionLength; i < BarCount; i++)
{
  if(StError(i - StartBar, i) < Level[i]) // прорыв отсутствует
  {
   j = i - StartBar; // длинна линии регрессии
   Error[i] = StError(j, i); // обращение к функции. Величина ошибки на текущем баре
  }
  else // Прорыв. Начало отсчета новой регрессии
  {
   RegressionEnd[i] = 1; // отмечаем конец предыдущей тенденции
   if(i + startRegressionLength >= BarCount)
    break;

/* следующий блок проверяет, чтобы ошибка на регрессии минимальной длинны
была ниже границы прорыва. Если ошибка больше, то переходим на следующий бар
и начинаем строить регрессию по новому, и так до тех пор, пока
стандартная ошибка на регрессии минимальной длины не будет меньше границы */


   while(i < BarCount - startRegressionLength)
   {
    if(StError(startRegressionLength, i + startRegressionLength) < Level[i + startRegressionLength])
    {
     RegressionStart[i] = 1;
     StartBar = i;
     i = i + startRegressionLength;
     j = StartRegressionLength;
     Error[i] = StError(j, i);
     break;
    }
    else
    {
     i++;
    }
   }
  }
}
// Величина стандартной ошибки
Plot(Error, "Error", colorBlue, styleLine);
// Граница прорыва стандартной ошибки
Plot(Level, "Level", colorBlack, styleLine);
/* Начало линии ошибки для текущей тенденции.
Начинается спустя три бара от начала построения линии регрессии*/

Plot(RegressionStart, "", colorGreen, styleHistogram|styleLeftAxisScale);
/* Момент окончания тенденции.
Бывает отмечается ни только при развороте, но и при ускорении тренда*/

Plot(RegressionEnd, "", colorRed, styleArea|styleLeftAxisScale);



  • Красные жирные столбики – окончание тенденции
  • Зеленые тонкие – начало оценки стандартной ошибки очередной тенденции
  • Черная линия – граница максимального значения стандартной ошибки
  • Синяя – значение стандартной ошибки


Обсуждение на форуме