Расчёт угла наклона трендовой линии. - страница 15

 
Daniil Kurmyshev:

А, ну тогда ясно) Тогда возвращаю код, может кому нибудь кроме Renat Akhtyamovпригодиться, я кстати по этому на форумах и мало сижу)))

//-----------------------------------------------------------------------------------

// xAngle ///////////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------------------------------

double xAngle(double x1,double y1,double x2,double y2) // x1,x2 Time[] - y1,y2 Price

  {

   if(x1==0 || x2==0 || y1==y2){return(0);}

   if(y1==y2) {return(0);}

//---

   double PriceMAX=ChartGetDouble(0,CHART_PRICE_MAX,0);

   double PriceMIN=ChartGetDouble(0,CHART_PRICE_MIN,0);

   double Bar1proc=(double)(ChartGetInteger(0,CHART_WIDTH_IN_BARS,0)*_Period*60)/100;

   double Price1proc=((PriceMAX-PriceMIN)/_Point)/100;

   x1=iBarShift(NULL,0,(datetime)x1);

   x2=iBarShift(NULL,0,(datetime)x2);

   double x1x2=MathAbs(x1-x2)*_Period*60;

   double y1y2=MathAbs(y1-y2)/_Point;

   double x1x2_proc=x1x2/Bar1proc;

   double y1y2_proc=y1y2/Price1proc;

//---

   double theta=MathArctan(y1y2_proc/x1x2_proc)*(180/3.1415926535);

   if(y2<y1){theta=NormalizeDouble(theta*(-1),2);}

   return(theta);

  }

//+------------------------------------------------------------------+ 

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

Здесь:

   double Bar1proc=(double)(ChartGetInteger(0,CHART_WIDTH_IN_BARS,0)*_Period*60)/100;

   double Price1proc=((PriceMAX-PriceMIN)/_Point)/100;

Деление на 100 лишнее. В конечной формуле при вычислении тэты они (100) размещаются в числителе и знаменателе. И сокращаются.


Здесь:

double Price1proc=((PriceMAX-PriceMIN)/_Point)/100;

double y1y2=MathAbs(y1-y2)/_Point;

деление на _Point лишнее. Аналогично делению на 100.

В конечной формуле double y1y2_proc=y1y2/Price1proc;

_Point в числителе и знаменателе сокращаются.

Эти упрощения во-первых уменьшают вычисления (нагрузку на процессор), а во-вторых возможно увеличивают точность конечного результата.


===============================

А может попробовать через функцию ChartTimePriceToXY определять значения пикселей в точках привязки графического инструмента.

Через количество пикселей по горизонтали и вертикали проще вычисляются тригонометрические функции. Без преобразования баров и пунктов.

Должно быть значительно проще.


//-----------------------------------------------------------------------------------

// xAngle ///////////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------------------------------

double xAngle(datetime x1,double y1,datetime x2,double y2) // x1,x2 Time[] - y1,y2 Price

  {

   if(x1==0 || x2==0 || y1==y2){return(0);}

   int _x1, _y1, _x2, _y2;

  ChartTimePriceToXY(0,0,x1,y1,_x1, _y1);

  ChartTimePriceToXY(0,0,x2,y2,_x2, _y2);

  double theta=MathArctan((double)MathAbs(_y1-_y2)/(double)MathAbs(_x1-_x2))*(180/3.1415926535);

   if(y2<y1){theta=NormalizeDouble(theta*(-1),2);}

   return(theta);

  }

Здесь if(y2<y1){theta=NormalizeDouble(theta*(-1),2);} подкорректировать знак по результату
 
Eugeni Neumoin:

Здесь:

.........

Должно быть значительно проще.

Да все это - совершенно бесполезно, поскольку зависит от установленного пользователем масштаба, который может быть разным на разных графиках.

Единственно верное решение - это измерение тренда в цене на единицу времени.

Тренд "0,0001 Евродолларов в час" нарисует совершенно одинаково любой человек, независимо ни от каких масштабов, и даже от платформ. 

 
George Merts:

Да все это - совершенно бесполезно, поскольку зависит от установленного пользователем масштаба, который может быть разным на разных графиках.

Единственно верное решение - это измерение тренда в цене на единицу времени.

Тренд "0,0001 Евродолларов в час" нарисует совершенно одинаково любой человек, независимо ни от каких масштабов, и даже от платформ. 

Я не обратил внимание на тему ветки. Было интересно вычисление угла, чтобы делать наклонные надписи параллельные трендовой. Выше написал упрощенную функцию вычисления угла. От масштаба она совершенно не зависит. Чтобы не искажалась надпись при изменении масштаба и других свойств графика, можно задействовать CHARTEVENT_CHART_CHANGE

=========

Хотелось вывода надписей около линий, как на картинке. С вышеизмененной функцией получилось так:


 
Eugeni Neumoin:
 

Хотелось вывода надписей около линий, как на картинке. С вышеизмененной функцией получилось так: 

Красиво!
 
Eugeni Neumoin:

С Вами согласен, корректировки по сокращению вычислений и лишних телодвижений в вычислениях согласен, сам не люблю такое, но когда изначально создавал эту функцию, проверял несколько различных способов, а потом уже не переделывал) а по поводу пикселей, я с вами полностью согласен, самое идеальное вычисление угла лично для меня именно таким образом, вот моя функция:

//-----------------------------------------------------------------------------------

// xAnglePixels /////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------------------------------

double xAnglePixels(datetime x1,double y1,datetime x2,double y2) // x1,x2 Time[] - y1,y2 Price

  {

   if(x1==0 || x2==0 || y1==y2){return(0);}

//---

   int x[2],y[2];

   ChartTimePriceToXY(0,0,x1,y1,x[0],y[0]);

   ChartTimePriceToXY(0,0,x2,y2,x[1],y[1]);

//---

   if(x[1]<x[0]){return(-1000);}

//---   

   double x1x2=MathAbs(x[0]-x[1]);

   double y1y2=MathAbs(y[0]-y[1]);

//---

   double theta;

   if(x1x2!=0){theta=MathArctan(y1y2/x1x2)*(180/3.1415926535);}

   else{theta=90;}

   if(y2<y1){theta=NormalizeDouble(theta*(-1),2);}else{theta=NormalizeDouble(theta,2);}

   return(theta);

  }

//---------------------------------------------------------------------------------

п.с. в функции if(x[1]<x[0]){return(-1000);} можно убрать, так как я использовал это для себя), а если точнее это необходимо для того, если пользователь поменял две точки объекта местами.

//-----------------

Кстати для надписей на графике я именно это и использую, ранее в ветке я отправлял примеры работы данного индикатора, там как раз это видно.

//-----------------

Вам отдельное спасибо и уважение)

 
Eugeni Neumoin:

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

Да, это - совсем другое дело. Здесь задача-то - не определение тренда, а определение наклона выведенной на монитор прямой. И, в данном случае - путь правильный. Ну и на картинке - все красиво.
 
George Merts:
Да, это - совсем другое дело. Здесь задача-то - не определение тренда, а определение наклона выведенной на монитор прямой. И, в данном случае - путь правильный. Ну и на картинке - все красиво.
Если исходить из ваших слов, по идеи мы же можем построить трендовые линии, они и покажут направление тренда, а относительно построенной линии будет указан правильный угол без танцев с бубном. Пример на картинке приложил, построения по всем правилам производит мой робот, но суть видна.
Файлы:
 
Daniil Kurmyshev:
Если исходить из ваших слов, по идеи мы же можем построить трендовые линии, они и покажут направление тренда, а относительно построенной линии будет указан правильный угол без танцев с бубном. Пример на картинке приложил, построения по всем правилам производит мой робот, но суть видна.
На картинке - визуализация ваших вычислений. Можно исказить пропорции визуализации (поменять масштаб чарта) и картинка оч существенно изменится - линии поменяют углы наклона в градусах. А результаты ваших вычислений от смены масштаба не изменятся. Если конечно вы не в пикселах трендовые вычисляли
 
Alexander Puzanov:
На картинке - визуализация ваших вычислений. Можно исказить пропорции визуализации (поменять масштаб чарта) и картинка оч существенно изменится - линии поменяют углы наклона в градусах. А результаты ваших вычислений от смены масштаба не изменятся. Если конечно вы не в пикселах трендовые вычисляли
Я с вами согласен, но вы же понимаете, что на каждом ТФ, тренды разные те что на маленьком казались большими, на большем ТФ стали маленькими, и наклоны изменятся, при этом меняется просто представление тренда, а не системы измерения углов, если мерная система будет меняться, то ни чего хорошего из этого не выйдет.
 
Daniil Kurmyshev:
Я с вами согласен, но вы же понимаете, что на каждом ТФ, тренды разные те что на маленьком казались большими, на большем ТФ стали маленькими, и наклоны изменятся, при этом меняется просто представление тренда, а не системы измерения углов, если мерная система будет меняться, то ни чего хорошего из этого не выйдет.
Смена ТФ здесь не при чём - когда меняете ТФ, меняются ваши расчёты. А когда меняете масштаб (кнопками +/- или кнопкой на панели терминала, иногда - просто прокруткой графика) то ничего в расчётах не меняется, а ° плывут хз куда
Причина обращения: