Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен программист? Оставь заказ и он сам тебя найдет!
lik
37
lik 2007.03.22 17:35 
необходим индикатор, который показывает градусы одного из углов в треугольнике. т.е. в МТ есть стандартная фигура треугольник, и вот когда мы его строим на графике должен отображатся угол в градусах одного из углов. при перемещении точек треугольника, угол естесственно должен меняться. пример на рисунке:  может у кого-то есть уже такой индикатор? поделитесь пожалуйста, если есть. Или сделайте, если не сложно
lik
37
lik 2007.03.22 18:00  
это все понятно. дело в том, что я программировать не умею
Flash
105
Flash 2007.03.22 18:01  
          Если сужать  график угол будет изменяться
Alexandre
602
Alexandre 2007.03.22 18:02  
Хоть и удалил свою ерунду, все же ее увидели. Программировать тут самое простое по сравнению с получением рабочей формулы.
lik
37
lik 2007.03.22 18:07  
при смене масштаба и при смене таймфрейма угол пускай меняется. ничего страшного
Eugeni Neumoin
1306
Eugeni Neumoin 2007.03.24 06:53  
При расчете угла самое главное определиться с начльными масштабами.
Точнее - что брать за единицу измерения по шкале цены и что брать за единиу измерения по шкале времени.
Когда будет определенность в этом вопросе, тогда не будет проблем с расчетом углов.

Например, можно единицу измерения рассчитывать следующим образом.

По шкале времени за единицу берется один бар (опять же на каком таймфрейме?)
По шкале цены. Подсчитываем количество баров на всей истории. Вычисляем средний размер бара в пунктах.
Вот, например, этот средний размер бара и принять за единицу измерения по шкале цены.

Но, опять же, это все условно.

Предложите метод определения единиц измерения по шкале цены и по шкале времени. И в соответствии с Вашим медтодом будет делаться расчет углов.

Кто-то другой метод определения единиц измерения предложит. По его методу будут уже другие углы.

Например, у Ганна была своя методика определения углов.

==============================
Индикатор по расчету углов имеется. Но для других целей он применяется.
С его помощью определяется наклон надписи для вывода на график.

==============================
Угол на графике - величина относительная. Возможно, более важно - значения ретресментов.

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

Sceptic Philozoff
Модератор
17849
Sceptic Philozoff 2007.03.24 11:39  
Все равно придется почти вычислять зум. О том, как его определить, есть ветка https://www.mql5.com/ru/forum/51772 .
Большое спасибо Quod Licet за изящную формулу.

#import "user32.dll"
   int GetClientRect( int hWnd, int lpRect[] );
#import
 
int GetClientWidth()
{
   int rect[4];
   int hWnd = WindowHandle( Symbol(), 0 );
   GetClientRect( hWnd, rect );
   return ( rect[ 2 ] );
}
 
int GetPixelsBetweenBars()
{
   return( GetClientWidth() - 3 - 41 ) / WindowBarsPerChart() );
}

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

по горизонтали в пикселах.

Далее, по сторонам треуга, прилегающим к углу, если бы они были известны в пикселах, легко определить нужный угол: 

fi = MathArcsin( 2*S / (a*b) ).

Площадь S определяется по формуле Герона: S = MathSqrt( p * ( p - a ) * ( p - b )* ( p - c ) )

Здесь p = ( a + b + c) / 2 - полупериметр треуга.

Осталось как-то определить измерения сторон по вертикали в пикселах. Ну тут надо вычислить

WindowPricesRange = WindowPriceMax() - WindowPriceMin().

Осталось определить высоту главного окна в пикселах. Если нет никаких других индикаторных субокон, то неплохую оценку дает

функция GetClientWidth(), в которой возвращается rect[ 3 ]. Можно для более высокой точности еще вычесть из rect[ 3 ] три пиксела и еще

примерно 20, чтобы учесть зазор сверху и подписи внизу.

Теперь определяем, сколько пикселов на чарте занимает один пипс: PixelsPerPips = ( GetClientHeight() - 3. - 20. ) / WindowPricesRange .

Зная это и вертикальные координаты вершин треуга, определяем их вертикальные измерения. Наконец, считаем сами длины сторон

по теореме Пифагора в пипсах. А дальше вычисляем угол.

Конечно, муторно, но другого более простого способа пока не знаю.

А вообще вся эта бодяга с пикселами совсем не нужна, если углы сравниваются между собой только на одном зуме и одном ТФ:

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

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

Eugeni Neumoin
1306
Eugeni Neumoin 2007.03.24 15:44  
Mathemat, примерно так все и делается. Не стал выше эту математику приводить.
Вся проблема в определении размерностей по вертикали и горизонтали.
Все-таки время (по горизонтали) и цена (по вертикали) - разные единицы измерения.
И как их правильно совместить для вычисления углов - большой вопрос?
Dmitry Fedoseev
41208
Dmitry Fedoseev 2007.03.24 16:04  

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

lik
37
lik 2007.03.24 22:38  
Mathemat:

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

точно! так и есть! для сравнения и поиска вручную закономерностей
Yuriy Zaytsev
11651
Yuriy Zaytsev 2007.03.24 20:32  
Integer:

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


возможно попробовать использовать ТРЕНДОВУЮ ЛИНИЮ ПО УГЛУ

 
/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий