Пользовательские индикаторы > Односторонняя производная без запаздывания с подавлением шума

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
BugsDigger
Сообщения: 533
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 91 раз

Односторонняя производная без запаздывания с подавлением шума

Непрочитанное сообщение BugsDigger » 20 янв 2019, 20:31

Односторонняя производная без запаздывания с шумодавом по

Pavel Holoborodko. One-Sided Differentiators. 2009
http://www.holoborodko.com/pavel/

Первый вариант совмещает численную оценку производной (точно для ф-ций 1, x) и гарантированное подавление шума, близкое к верхнему пределу интервала Найквиста.

Второй вариант предназначен для вычисления производной точно для ф-ций 1, x, x2 и подавления шума в минимаксном смысле.

В разных конкретных случаях м.б. предпочтительны разные варианты.

Disclaimer. Materials from this reports can be used in any legal activity (research, teaching, engineering, etc.) freely on the basis of respecting my authorship by giving clear statement and reference to the report (or my website) in related work. If you use materials in commercial project please consider supporting me financially.
(С) Pavel Holoborodko

Код: Выделить всё

function Initialize()
{
 IndicatorName = "DerivativeNSx1";
 PriceStudy = false;
 AddInput("Input", Inputs.Price);   
 AddSeries("DerivativeNSx1", DrawAs.Line, Color.Blue, AxisType.ZeroBased);   
 AddLevel(0, Color.Black, "DerivativeNSx1");

 AddParameter("Period", 10);
}

function Evaluate()
{
 double r=0.0;
 int p;
 p=Math.Max((int)Period, 1);
 p=Math.Min(p, CurrentIndex+1);
 switch(p)
 {
  case  0:
  case  1: r=0.0; break;
  case  2: r=1.0/  2.0*(Input[0] -     Input[-2]); break;
  case  3: r=1.0/  4.0*(Input[0] +     Input[-1] -      Input[-2] -      Input[-3]); break;
  case  4: r=1.0/  8.0*(Input[0] + 2.0*Input[-1] -  2.0*Input[-3] -      Input[-4]); break;
  case  5: r=1.0/ 16.0*(Input[0] + 3.0*Input[-1] +  2.0*Input[-2] -  2.0*Input[-3] -  3.0*Input[-4] -      Input[-5]); break;
  case  6: r=1.0/ 32.0*(Input[0] + 4.0*Input[-1] +  5.0*Input[-2] -  5.0*Input[-4] -  4.0*Input[-5] -      Input[-6]); break;
  case  7: r=1.0/ 64.0*(Input[0] + 5.0*Input[-1] +  9.0*Input[-2] +  5.0*Input[-3] -  5.0*Input[-4] -  9.0*Input[-5] -  5.0*Input[-6] -      Input[-7]); break;
  case  8: r=1.0/128.0*(Input[0] + 6.0*Input[-1] + 14.0*Input[-2] + 14.0*Input[-3] - 14.0*Input[-5] - 14.0*Input[-6] -  6.0*Input[-7] -      Input[-8]); break;
  case  9: r=1.0/256.0*(Input[0] + 7.0*Input[-1] + 20.0*Input[-2] + 28.0*Input[-3] + 14.0*Input[-4] - 14.0*Input[-5] - 28.0*Input[-6] - 20.0*Input[-7] -  7.0*Input[-8] - Input[-9]); break;
  case 10:
  case 11:
  case 12:
  case 13: // >=10
  case 14: r=1.0/512.0*(Input[0] + 8.0*Input[-1] + 27.0*Input[-2] +48.0*Input[-3] + 42.0*Input[-4] - 42.0*Input[-6] - 48.0*Input[-7] - 27.0*Input[-8] -  8.0*Input[-9] - Input[-10]); break;
  default: // >=15
           r=1.0/16384.0*(Input[0]+    13.0*Input[-1] +  77.0*Input[-2]  +273.0*Input[-3] +637.0*Input[-4] +1001.0*Input[-5] +1001.0*Input[-6] +429.0*Input[-7]
                   -429.0*Input[-8] -1001.0*Input[-9] -1001.0*Input[-10] -637.0*Input[-11]-273.0*Input[-12]-  77.0*Input[-13]-13.0*Input[-14]-Input[-15]);
    break;
 }
 DerivativeNSx1=r;
}


Код: Выделить всё

function Initialize()
{
 IndicatorName = "DerivativeNSx2";
 PriceStudy = false;
 AddInput("Input", Inputs.Price);   
 AddSeries("DerivativeNSx2", DrawAs.Line, Color.Blue, AxisType.ZeroBased);   
 AddLevel(0, Color.Black, "DerivativeNSx2");

 AddParameter("Period", 10);
}

function Evaluate()
{
 double r=0.0;
 int p;
 p=Math.Max((int)Period, 1);
 p=Math.Min(p, CurrentIndex+1);
 switch(p)
 {
  case  0:
  case  1: r=0.0; break;
  case  2: r=1.0/  2.0*(     Input[0] -       Input[-2]); break;
  case  3: r=1.0/  2.0*( 2.0*Input[0] -       Input[-1] -  2.0*Input[-2] +      Input[-3]); break;
  case  4: r=1.0/ 10.0*( 7.0*Input[0] +       Input[-1] - 10.0*Input[-2] -      Input[-3] +  3.0*Input[-4]); break;
  case  5: r=1.0/ 28.0*(16.0*Input[0] +       Input[-1] - 10.0*Input[-2] - 10.0*Input[-3] -  6.0*Input[-4] +  9.0*Input[-5]); break;
  case  6: r=1.0/ 28.0*(12.0*Input[0] +   5.0*Input[-1] -  8.0*Input[-2] -  6.0*Input[-3] - 10.0*Input[-4] +      Input[-5] +  6.0*Input[-6]); break;
  case  7: r=1.0/ 60.0*(22.0*Input[0] +   7.0*Input[-1] -  6.0*Input[-2] - 11.0*Input[-3] - 14.0*Input[-4] -  9.0*Input[-5] -  2.0*Input[-6] + 13.0*Input[-7]); break;
  case  8: r=1.0/180.0*(52.0*Input[0] +  29.0*Input[-1] - 14.0*Input[-2] - 17.0*Input[-3] - 40.0*Input[-4] - 23.0*Input[-5] - 26.0*Input[-6] + 11.0*Input[-7] + 28.0*Input[-8]); break;
  case  9: r=1.0/ 20.0*(56.0*Input[0] +  26.0*Input[-1] -  2.0*Input[-2] - 17.0*Input[-3] - 30.0*Input[-4] - 30.0*Input[-5] - 28.0*Input[-6] - 13.0*Input[-7] +  4.0*Input[-8] + 34.0*Input[-9]); break;
  case 10:
  case 11:
  case 12:
  case 13: // >=10
  case 14: r=1.0/1540.0*(320.0*Input[0]+206.0*Input[-1] -   8.0*Input[-2] -47.0*Input[-3] -186.0*Input[-4] -150.0*Input[-5] -214.0*Input[-6] -103.0*Input[-7] - 92.0*Input[-8] + 94.0*Input[-9] +180.0*Input[-10]); break;
  default: // >=15
           r=1.0/2856.0*(322.0*Input[0]+217.0*Input[-1] + 110.0*Input[-2] +35.0*Input[-3] - 42.0*Input[-4] - 87.0*Input[-5] -134.0*Input[-6] -149.0*Input[-7] -166.0*Input[-8] -151.0*Input[-9] -138.0*Input[-10]
                         -93.0*Input[-11]-50.0*Input[-12] +25.0*Input[-13]+98.0*Input[-14]+203.0*Input[-15]);

    break;
 }
 DerivativeNSx2=r;
}


2.png


В приведенном примере индикатор AO (осциллятор awesome) раскрашивается просто по разности соседних значений. А можно было бы раскрасить по вычисленному значению производной. Заявленное отсутствие запаздывания, конечно, идеализация, но небесполезная. :)

Вернуться в «Пользовательские индикаторы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя