Индикаторы: Hodrick-Prescott Channel - страница 2

 
СанСаныч Фоменко:

1. Это самопал, решающий конкретные практические задачи. Оригинальный и очень широко применяемый в экономике фильтр НР имеет параметр "лябда"

2.  Берем перерисовывающий индикатор, как у Вас. Это означает, что последние 15-20 баров перерисовываются, так как Вы рисуете каждый раз все вновь рассчитанные бары. Это полностью соответствует алгоритму НР как и всем другим перерисовывающимся индикаторам.

Я же предлагаю делать стандартный расчет, но в буфер индикатор помещать только последний, крайне правый бар. И таким образом в буфере индикатора будут только последние бары для каждого цикла.  

Мысль понял, сам думал примерно о таком же и пробовал это делать. Могу сразу предсказать результат - вся гладкость исчезнет, будет прыгающая кривая. Сейчас у меня отрисовываются хвосты слева, это наиболее сглаженные значения, и то прыгают, что же будет в начале?

Но ок, сделаю с переключением режимов в настройках. 

 
Alexey Volchanskiy:

Мысль понял, сам думал примерно о таком же и пробовал это делать. Могу сразу предсказать результат - вся гладкость исчезнет, будет прыгающая кривая. Сейчас у меня отрисовываются хвосты слева, это наиболее сглаженные значения, и то прыгают, что же будет в начале?

Но ок, сделаю с переключением режимов в настройках. 

Повторю, что писал выше.

Для НР в смысле гладкости кривой  вид перерисовывающегося индикатора для лямбды = 1600 примерно такой же как построенного на последнем баре с лябдой=100 000.   

 
СанСаныч Фоменко:

Повторю, что писал выше.

Для НР в смысле гладкости кривой  вид перерисовывающегося индикатора для лямбды = 1600 примерно такой же как построенного на последнем баре с лябдой=100 000.   

Давайте с лямбдой разберемся. Сейчас есть две лямбды, значения жестко зашиты в код

   Lambda = 0.0625 / MathPow(MathSin(M_PI / HPPeriodFast), 4);   // коэфф. сглаживания быстрой HP
   Lambda2 = 0.0625 / MathPow(MathSin(M_PI / HPPeriodSlow), 4);  // коэфф. сглаживания медленной HP      

// M_PI - это число Пи 3.14159265358979323846      

 Вы предлагаете вынести в настройки множитель 0.0625?

 
Alexey Volchanskiy:

Давайте с лямбдой разберемся. Сейчас есть две лямбды, значения жестко зашиты в код

 Вы предлагаете вынести в настройки множитель 0.0625?

Естественно - лямбда параметр классического фильтра. Но не в них дело.

Гораздо больше меня интересует индикатор, который формируется только на последних барах - свой я куда-то дел, причем канала у меня не было. 

 
СанСаныч Фоменко:

Естественно - лямбда параметр классического фильтра. Но не в них дело.

Гораздо больше меня интересует индикатор, который формируется только на последних барах - свой я куда-то дел, причем канала у меня не было. 

Я написал, что сделаю. Будут дополнительные стандартные индикаторные буфера, как предложил т. Решетов. Буду туда писать нулевой бар, как обычно. Сейчас весь буфер переписывается, поэтому видно только часть длиной InpHPPeriodSlow=100 по умолчанию.

Таким образом, останется и старый вариант, и новый появится. В настройках можно будет отключать тот или другой, чтобы каши не было на экране. 

 
Alexey Volchanskiy:

Я написал, что сделаю. Будут дополнительные стандартные индикаторные буфера, как предложил т. Решетов. Буду туда писать нулевой бар, как обычно. Сейчас весь буфер переписывается, поэтому видно только часть длиной InpHPPeriodSlow=100 по умолчанию.

Таким образом, останется и старый вариант, и новый появится. В настройках можно будет отключать тот или другой, чтобы каши не было на экране. 

Очень интересно. Жду.
 

Канал интересный, оригинальный, отличается от привычных мувингов. И отличается от кривых регрессий, построенных по методу наименьших квадратов. Удивительно краткий программный код. Нет решений СЛАУ. Что-то, связанное c рядом Фурье, поскольку есть sin(x). Я канал скачал, переименовал по-русски: "Канал_Волчанского.mq4" (чтобы не забыть, что за индикатор), установил в терминал. Попробую его, может он поможет мне в моей ручной торговле. Жаль, что перерисовывает. Но это побороть, наверное, невозможно. На каком ТФ ? Посмотрю, попробую.

 

Не обрезает:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tickVolume[],
                const long &volume[],
                const int &spread[])
  {
   int i;
   double InpDat[],disp,dev,val;

   if(rates_total < HPPeriodSlow + 1) return(0);
   if(rates_total!=prev_calculated)
     {
      i=Bars(Symbol(),0)-HPPeriodSlow;
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,i);
      PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,i);
      PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,i);
      PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,i);
     }

Починил:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tickVolume[],
                const long &volume[],
                const int &spread[])
  {
   int i;
   double InpDat[],disp,dev,val;

   if(rates_total < HPPeriodSlow + 1) return(0);
   if(rates_total!=prev_calculated)
     {
      i=Bars(Symbol(),0)-HPPeriodSlow;
      SetIndexDrawBegin(0, i);
      SetIndexDrawBegin(1, i);
      SetIndexDrawBegin(2, i);
      SetIndexDrawBegin(3, i);
     }