А ObjectMove пробовали использовать? Там, вроде, все просто.
А тут есть статья с кодом проверки на новый бар.
Print(" Angle = "+ObjectGetDouble(0,"Tr_Angle",OBJPROP_ANGLE,1));
А зачем в ObjectGetDouble указан последний параметр (модификатор свойства), по умолчанию он равен 0, и кажется он тут не нужен.
Попробуйте так
Print(" Angle = "+ObjectGetDouble(0,"Tr_Angle",OBJPROP_ANGLE));
Есть кривая необходимо расчитать ее наклон.
1. Как вариант можно................
2. .............. Да и этот метод должен работать, но нет в чем то ошибка. Так в чем же ?
1. Низя.
2. Ошибка ваще в принципе. Угол зависит от масштаба визуализации по осям. Поэтому: углы мерять - деньги на ветер.
Наклон кривой можно (и нужно) оценивать по тангенсу (например в пипс/секундах). Он не зависит от визуального масштаба.
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 точки: А (левая на графике) и Б (правая).
Угол линии = (цена.Б - цена.А) / (индекс_бара.А - индекс_бара.Б)
Меряется он в пунктах за бар.
Градусы, как уже замечали выше, к дискретной графике не применимы.
Переводить бары в секунды, как по мне, будет лишним. Кроме того, возникнут сложности с выходными, праздниками и т.д.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Есть кривая необходимо расчитать ее наклон.
Как вариант можно построить линию по углу через две точки т.е. провести касательную и получить ее наклон ( воникшая погрешность не страшна ).
Итак:
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
Как видно угол вывелся правильный. Но это не годится т.к. функция вызывается несколько раз, а объект уже создан, создавать для каждого бара новую линию и ее не удалять : бред )) Создать один раз объкт и далле изменять координаты точек привязки не получилось. Да и этот метод должен работать, но нет в чем то ошибка.
Так в чем же ?