Индикаторы: Коридор и угол его наклона методом наименьших квадратов

 

Коридор и угол его наклона методом наименьших квадратов:

Реагирует на рынок быстрее, чем МА (скользящая средняя)

Author: Evgeniy Trofimov

 

"Индикатор MLS-HL4-Angle расчитывает значение a и обозначает угол наклона найденной прямой к горизонту."

на EU H1 около 180 и на H4 где-то 360 ...

...на приведеннм выше рис.: 91 ... ???

 

А как правильно?

Угол наклона, в данном случае, измеряется не в градусах, а в количестве пунктов за 1 свечу. (см. учебник по Аналитической геометрии, радел "Уравнение прямой")

Прямая может быть задана с помощью уравнения

y = ax + b,

где x - координата по оси X,

a - угол прямой к горизонту

b - координата по оси Y, если x = 0.

За ось Y я принял значение цены, за X - номер свечи (время)

 

ну раз никто не откликается, - то просто брейнсторм для поддержания развития идеи :

углы конечно понятие раятяжимое и ученные спорят за это под разным градусм - то пока Бокипер не решил, как правильно - можно попробовать начать с того, что ноль поставить на место (если а=в, угол =0) как бы моментально и если измерять в килограммах - прирост не превысит максимального значения или сам себя; как-бы по простому - если взять (временно) стохастик (рси) и вместо 100 написать 90 - то все будут думать шо это 90 градусв ... угол ...

шутка, конечно, я ж сказал - временно... : ))))

 
fxxx:

ну раз никто не откликается, - то просто брейнсторм для поддержания развития идеи :

углы конечно понятие раятяжимое и ученные спорят за это под разным градусм - то пока Бокипер не решил, как правильно - можно попробовать начать с того, что ноль поставить на место (если а=в, угол =0) как бы моментально и если измерять в килограммах - прирост не превысит максимального значения или сам себя; как-бы по простому - если взять (временно) стохастик (рси) и вместо 100 написать 90 - то все будут думать шо это 90 градусв ... угол ...

шутка, конечно, я ж сказал - временно... : ))))

Если вы говорите о нормализации советника, то могу предложить воспользоваться интерполяцией. Эта тема раскрыта в комментариях к вот этим индикаторам (/ru/code/8694). Кому неохото ковыряться в коде, предоставляю пример нормализированного индикатора угла (приведённого к +100% и -100% относительно его максимумов/минимумов)

Сразу скажу, что напрашивается ещё и дивергенцию находить....

Это будет выглядеть примерно так:

#property copyright "Copyright © Trofimov Evgeniy Vitalyevich, 2008"
#property link      "http://multitest.semico.ru/mnk.htm"
//---- Свойства индикатора
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
#property indicator_width1 2
#property indicator_maximum 100
#property indicator_minimum -100
#property indicator_level1 0
#property indicator_level2 50
#property indicator_level3 -50
//#property indicator_color2 DarkSeaGreen
//#property indicator_width2 0
//---- Входящие параметры
extern int MyPeriod=12;
extern int BuffSize=288;
bool ReDraw=true; //-если включен, то перерисовывает нулевой
// бар при каждом новом тике
// если выключен, то нулевой бар содержит
// фиксированное значение, 
// вычисленное по предыдущим (готовым) барам
//---- Массив данных индикатора
double MLS_Angel[];
double Angels[];
//+------------------------------------------------------------------+
//|                Функция инициализации индикатора                  |
//+------------------------------------------------------------------+
int init()
  {
//---- x дополнительных буфера, используемых для расчета
   IndicatorBuffers(1);
//---- параметры рисования (установка начального бара)
   SetIndexDrawBegin(0,MyPeriod);
   //SetIndexDrawBegin(1,MyPeriod);
//---- x распределенных буфера индикатора
   SetIndexBuffer(0,MLS_Angel);
   //SetIndexBuffer(1,MLS_b);
//---- имя индикатора и подсказки для линий
   IndicatorShortName("MLS-HL4-Procent ("+MyPeriod+", "+BuffSize+") = ");
   SetIndexLabel(0,"a");
   //SetIndexLabel(1,"b");
   //SetIndexStyle(1,DRAW_NONE, EMPTY, EMPTY, CLR_NONE);
   ArrayResize(Angels,BuffSize);
   
   return(0);
  }
//+------------------------------------------------------------------+
//|                Функция индикатора                                |
//+------------------------------------------------------------------+
int start() {
   int limit, RD;
   if(ReDraw) RD=1;
   static datetime LastTime;
   double MAX,MIN;
   // Пропущенные бары
   int counted_bars=IndicatorCounted();
//---- обходим возможные ошибки
   if(counted_bars<0) return(-1);
//---- новые бары не появились и поэтому ничего рисовать не нужно
   limit=Bars-counted_bars-1+RD;
//---- основные переменные
   double k1, i1, j1, k2, i2, j2;
   double a, b, y, S, H, L;
   int x;
//---- основной цикл
   for(int t=limit-RD; t>-RD; t--) {
      //Вычисление угла
      //if(LastTime==iTime(NULL,0,t)) return(0); //лучше не включать
      //LastTime=iTime(NULL,0,t);
      //if(t<5) Print(t,"===== ",TimeToStr(LastTime)," =====");
      k1=0; i1=0; j1=0; k2=0; i2=0;
      for(x=t+MyPeriod-1; x>=t; x--)
        { // составляем нормальные уравнения k1=a*i1+b*j1 и k2=a*i2+b*j2
         H=High[x]/Point;
         L=Low[x]/Point;
         k1=k1+H*x;    k2=k2+H;
         k1=k1+L*x;    k2=k2+L;
         i1=i1+2*x*x;  i2=i2+2*x;
         j1=j1+2*x;           
        }
      j2=MyPeriod*2;
      //Решаем систему уравнений
      a=(k1*j2-j1*k2)/(i1*j2-j1*i2);
      //b=(k2-i2*a)/j2;
      //Теперь все точки High и Low, на данный момент времени,
      //приблизительно расположены вдоль прямой, описаной уравнением y=ax+b,
      //где x - это номер свечи, а y - значение цены.
      
      //Если образовался новый бар, то производится сдвижка массива
      if(LastTime!=Time[t+1]){
         for(x=BuffSize-1; x>0; x--) {
            Angels[x]=Angels[x-1];
         }//Next x
         LastTime=Time[t+1];
      }
      //Конец сдвижки массива
      //Перерисовка угла
      Angels[0]=-a;
      MAX=Angels[ArrayMaximum(Angels)];
      MIN=Angels[ArrayMinimum(Angels)];
      MLS_Angel[t]=Интерполяция(MAX,MIN,100,-100,Angels[0]);
      if(!ReDraw && t==1) MLS_Angel[0]=MLS_Angel[1];
      //Конец перерисовки угла
   }
   return(0);
}
//+------------------------------------------------------------------+
double Интерполяция(double a,double b,double c,double d,double X) {
//a; X; b - столбец изветных чисел, c; d; - столбец со стороны неизвестной.
    if(b - a == 0)
        return(10000000); //бесконечность
    else
        return(d - (b - X) * (d - c) / (b - a));
}//Интерполяция
//+------------------------------------------------------------------+

ну а если предпочитаете принимать за максимум значение 90, тонеобходимо заменить строку





MLS_Angel[t]=Интерполяция(MAX,MIN,100,-100,Angels[0]);

на строку





MLS_Angel[t]=Интерполяция(MAX,MIN,90,-90,Angels[0]);

и в параметрах сделать, чтобы границы нормальные были:





#property indicator_maximum 90
#property indicator_minimum -90
 

"Если вы говорите о нормализации советника, то могу предложить воспользоваться интерполяцией. Эта тема раскрыта в комментариях к вот этим индикаторам (/ru/code/8694). Кому неохото ковыряться в коде, предоставляю пример нормализированного индикатора угла (приведённого к +100% и -100% относительно его максимумов/минимумов)"

_____________

Вот именно! прекрасное решение - то что нужно

 

Евгений Виталиевич, - как привести к нормализированному моментуму (100, -100) от MLS (или МА)?

 

Ребята зачем работу усложнять индюк никак кинуть?

 
Pasya:

Ребята зачем работу усложнять индюк никак кинуть?

так он выложен - в постах только обсуждение различных вариантов применения алгоритмов, заложенных в этих индикаторах

величина "уклона" (период 12 и 5) - разница величины значений инд на 12-ти и 5 барах

следуя Е.В. примеру - осциллятор указывает как бы "угол"(наклон) доски длинной в 12 или 5 баров (сьвечек) волочимой дворником по этим горбам (типа аналагична под градусом каким; период : от 0 бара до конца доски, справа налево) т.е. насколько конец дворника (с правой от нас стороны ) выше противоположного конца доски

 
EvgeTrofi:

А как правильно?

Угол наклона, в данном случае, измеряется не в градусах, а в количестве пунктов за 1 свечу. (см. учебник по Аналитической геометрии, радел "Уравнение прямой")

Прямая может быть задана с помощью уравнения

y = ax + b,

где x - координата по оси X,

a - угол прямой к горизонту

b - координата по оси Y, если x = 0.

За ось Y я принял значение цены, за X - номер свечи (время)


Здраствуйте я хотел бы у вас спросить .Нет ли у вас отдельной функции для расчета угла тренда.Если есть выложите пожалуйста в эой ветке.

Причина обращения: