Расчет угла наклона кривой. Самый простой способ ))

 

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

Как вариант можно построить линию по углу через две точки т.е. провести касательную и получить ее наклон ( воникшая погрешность не страшна ).

Итак: 

ObjectCreate(0,"Tr_Angle",OBJ_TRENDBYANGLE,0,mrate[end].time,Hodrick[end],mrate[begin].time,Hodrick[begin]);

Print(" Price = "+ObjectGetDouble(0,"Tr_Angle",OBJPROP_PRICE,0));
Print(" Price = "+ObjectGetDouble(0,"Tr_Angle",OBJPROP_PRICE,1));

Print(" Time0 = " +(datetime)ObjectGetInteger(0,"Tr_Angle",OBJPROP_TIME,0));
Print(" Time1 = " +(datetime)ObjectGetInteger(0,"Tr_Angle",OBJPROP_TIME,1));
 
Print(" Angle = "+ObjectGetDouble(0,"Tr_Angle",OBJPROP_ANGLE,1));

ObjectDelete(0,"Tr_Angle"); 

Вот что выходит: 

2012.03.01 01:08:09 2006.02.17 01:00:00 Angle = 360.1
2012.03.01 01:08:09 2006.02.17 01:00:00 Time1 = 2006.02.17 00:45:00
2012.03.01 01:08:09 2006.02.17 01:00:00 Time0 = 2006.02.16 15:00:00
2012.03.01 01:08:09 2006.02.17 01:00:00 Price = 1.190075996462032
2012.03.01 01:08:09 2006.02.17 01:00:00 Price = 1.187217081571835

Прямая конечно же не отображается, а угол в 360.1 градусов настораживает ))) Хотя координаты точек привязки выводится верные.

Теперь закоментируем строчку   ObjectDelete(0,"Tr_Angle");   Тем самым удалять линию мы не будем. 

 Резулятат:

2012.03.01 01:07:16 2006.02.17 01:00:00 Angle = 29.9
2012.03.01 01:07:16 2006.02.17 01:00:00 Time1 = 2006.02.17 00:45:00
2012.03.01 01:07:16 2006.02.17 01:00:00 Time0 = 2006.02.16 14:00:00
2012.03.01 01:07:16 2006.02.17 01:00:00 Price = 1.190075996462032
2012.03.01 01:07:16 2006.02.17 01:00:00 Price = 1.187133099900674

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

Так в чем же ?
 

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов - Документация по MQL5
 

А ObjectMove пробовали использовать? Там, вроде, все просто.

А тут есть статья с кодом проверки на новый бар.

Print(" Angle = "+ObjectGetDouble(0,"Tr_Angle",OBJPROP_ANGLE,1));

А зачем в ObjectGetDouble указан последний параметр (модификатор свойства), по умолчанию он равен 0, и кажется он тут не нужен.

Попробуйте так 

Print(" Angle = "+ObjectGetDouble(0,"Tr_Angle",OBJPROP_ANGLE));

 
hn-usf1884:

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

1.    Как вариант можно................

2.   .............. Да и этот метод должен работать, но нет в чем то ошибка.  Так в чем же ?

1.  Низя.

2.  Ошибка ваще в принципе.  Угол зависит от масштаба визуализации по осям. Поэтому: углы мерять - деньги на ветер.

Наклон кривой можно (и нужно) оценивать по тангенсу (например в пипс/секундах). Он не зависит от визуального масштаба.


 
MetaDriver:

1.  Низя.

2.  Ошибка ваще в принципе.  Угол зависит от масштаба визуализации по осям. Поэтому: углы мерять - деньги на ветер.

Наклон кривой можно (и нужно) оценивать по тангенсу (например в пипс/секундах). Он не зависит от визуального масштаба.


Хорошая идея . Если вы выложили код было бы вообще замечательно ))))
 

fyords:

 


А ObjectMove пробовали использовать? Там, вроде, все просто.

А тут есть статья с кодом проверки на новый бар.

А зачем в ObjectGetDouble указан последний параметр (модификатор свойства), по умолчанию он равен 0, и кажется он тут не нужен.

Попробуйте так 


 Print(" Angle = "+ObjectGetDouble(0,"Tr_Angle",OBJPROP_ANGLE));

Такой вариант тоже не работает

ObjectMove тоже пробывал использовать, но не получилось. Отрисовывается прямая с правильно привязанной одной точкой

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

Создаем объект один раз  

int OnInit()
  {
ObjectCreate(0,"Tr_Angle",OBJ_TRENDBYANGLE,0,0,0,0,0); 

. . .  

Изменяем код


// ObjectCreate(0,"Tr_Angle",OBJ_TRENDBYANGLE,0,mrate[end].time,Hodrick[end],mrate[begin].time,Hodrick[begin]);

Print("1: "+ObjectMove(0,"Tr_Angle",0,mrate[begin].time,Hodrick[begin]));
Print("2: "+ObjectMove(0,"Tr_Angle",1,mrate[end].time,Hodrick[end]));


Print(" Price = "+ObjectGetDouble(0,"Tr_Angle",OBJPROP_PRICE,0));
Print(" Price = "+ObjectGetDouble(0,"Tr_Angle",OBJPROP_PRICE,1));

Print(" Time0 = " +(datetime)ObjectGetInteger(0,"Tr_Angle",OBJPROP_TIME,0));
Print(" Time1 = " +(datetime)ObjectGetInteger(0,"Tr_Angle",OBJPROP_TIME,1));

Print(" Angle = "+ObjectGetDouble(0,"Tr_Angle",OBJPROP_ANGLE));

// ObjectDelete(0,"Tr_Angle");

И вот что выходит

2012.03.01 10:16:10 2006.02.17 00:03:30 Angle = 90
2012.03.01 10:16:11 2006.02.17 00:15:00 Time1 = 2006.02.16 14:15:00
2012.03.01 10:16:11 2006.02.17 00:15:00 Time0 = 2006.02.17 00:00:00
2012.03.01 10:16:11 2006.02.17 00:15:00 Price = 1.187149201586021
2012.03.01 10:16:11 2006.02.17 00:15:00 Price = 1.189774941348604
2012.03.01 10:16:11 2006.02.17 00:15:00 2: true
2012.03.01 10:16:11 2006.02.17 00:15:00 1: true

  под углом в 90 градусов, т.е. вертикальная. Хотя выводится что у точек разное время.  

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

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

 

 

У вас есть 2 точки: А (левая на графике) и Б (правая).

Угол линии = (цена.Б - цена.А) / (индекс_бара.А - индекс_бара.Б)

Меряется он в пунктах за бар.

 

Градусы, как уже замечали выше, к дискретной графике не применимы.

Переводить бары в секунды, как по мне, будет лишним. Кроме того, возникнут сложности с выходными, праздниками и т.д.

 
Все получилось, нашел угол методом предложенным MetaDriver через тангенс, но все же почему тот метод не работал ?
Причина обращения: