Определение угла

Автор: vyudin77

Определение угла - Wed Apr 12 2017 05:33 AM

Добрый день! Столкнулся с трудностью в определении угла, между максимальными и минимальными точками. Atan2 - дает не верное значение, class Vector тоже выдает значение с которым визуально согласиться нельзя. Структура Vector Метод Vector.AngleBetween (Vector, Vector) тоже выдает кривое значение.
Может кто сталкивался, как правильно написать определение угла???
Цены же все время движутся по прямоугольным треугольникам, получается это важно учитывать...
Автор: sar

Re: Определение угла - Wed Apr 12 2017 09:35 AM

Делал, но давно, через atan но не помню по итогу как было. Знаю что выбирал именно этот метод.
Автор: vyudin77

Re: Определение угла - Wed Apr 12 2017 11:27 AM

Atan не учитывает время (индекс) поэтому не точно. Ведь 1000 пунктов пройденные за 1 мин, и пройденные за 30 мин дадут разный угол.
Автор: sar

Re: Определение угла - Wed Apr 12 2017 11:47 AM

я рассматривал угол наклона от текущей цены. то есть берем две точки 1 начальная (например точка пересечения) привязываемся к номеру бара. 2 конечная (либо текущая цена, либо например максимум за период) и между этими точками я считаю угол наклона.
Если я хочу сохранить угол наклона, тогда привязываюсь во втором шаге, к номеру бара когда это произошло, и в таком случае сохраню угол.
Автор: Michael Shpin

Re: Определение угла - Wed Apr 12 2017 12:10 PM

(Цена(точка2) - Цена(точка1)) / (Индекс Бара(точка2) - Индекс Бара(точка1));
Автор: Rezident

Re: Определение угла - Wed Apr 12 2017 12:21 PM

Я слышал про применение тангенса. Не пробовали? Я пробовал определять через него. Но мне пока не понятно, что именно Вам нужно-просто значение угла или "рисовалку некоего тренда" хотите сделать.
Автор: vyudin77

Re: Определение угла - Wed Apr 12 2017 01:33 PM

(Цена(точка2) - Цена(точка1)) / (Индекс Бара(точка2) - Индекс Бара(точка1));
Вот здесь мы получим скорость за один бар между двумя точками, но не угол.
Про тангенс нужно почитать, но там же все равно нужно брать угол и его подавать в тангенс или синус или косинус.
Автор: vyudin77

Re: Определение угла - Wed Apr 12 2017 01:38 PM

Есть в C# Методы заложенные стандартно но они показывают не корректно
public static IList<double> AngleU(IList<double> maxZa, IList<double> minZa)
{
var count = Math.Max(maxZa.Count, minZa.Count);
double[] numArray = new double[count];
for (var i = 1; i < count; i++)
{
Vector vec1 = new Vector(minZa[i], maxZa[i]);
Vector vec2 = new Vector(minZa[i], minZa[i]);
var angleUp = (Vector.AngleBetween(vec1, vec2) * 100)*-1;
numArray[i] = Math.Round(angleUp, 2);
}
return (IList<double>)numArray;
}

public static IList<double> AngleD(IList<double> maxZa, IList<double> minZa)
{
var count = Math.Max(maxZa.Count, minZa.Count);
double[] numArray = new double[count];
for (var i = 1; i < count; i++)
{
Vector vec1 = new Vector(maxZa[i], minZa[i]);
Vector vec2 = new Vector(maxZa[i], maxZa[i]);
var angleUp = Vector.AngleBetween(vec1, vec2) * 100;
numArray[i] = Math.Round(angleUp, 2);
}
return (IList<double>)numArray;
}
Автор: Michael Shpin

Re: Определение угла - Wed Apr 12 2017 04:31 PM

лично у меня прекрасно получается таким кодом строить наклонную линию
Code:

//Получаем угол наклона линии 
double angle = (pointY2 - pointY1) / (pointX2 - pointX1);

//Получаем отступ по Y
double offset = pointY1 - pointX1 * angle;

//Пробегаем по барам, строим наклонную линию начиная со startBar
var angleLine = sec.Bars.Select((bar, i) => i >= startBar ? angle * i + offset : 0d).ToList();
Автор: Stan

Re: Определение угла - Mon Apr 17 2017 09:32 PM

Originally Posted By: Michael Shpin
лично у меня прекрасно получается таким кодом строить наклонную линию
Code:

//Получаем угол наклона линии 
double angle = (pointY2 - pointY1) / (pointX2 - pointX1);

//Получаем отступ по Y
double offset = pointY1 - pointX1 * angle;
//Пробегаем по барам, строим наклонную линию начиная со startBar
var angleLine = sec.Bars.Select((bar, i) => i >= startBar ? angle * i + offset : 0d).ToList();

Можете полностью выложить?
Автор: Michael Shpin

Re: Определение угла - Sat Apr 22 2017 12:55 AM

Думаю такого примера будет достаточно


Code:
using System.Linq;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Optimization;

namespace MichaelShpin.TSLab.Scripts.Tests
{
	public class AngleLineScript : IExternalScript
	{
		public readonly OptimProperty FirstPointBar = new OptimProperty(1000, 1, 2000, 1);

		public void Execute(IContext ctx, ISecurity sec)
		{
			int pointX1 = (int)FirstPointBar.Value;
			int pointX2 = sec.Bars.Count-1;

			double pointY1 = sec.ClosePrices[pointX1];
			double pointY2 = sec.ClosePrices[pointX2];

			//Получаем угол наклона линии 
			double angle = (pointY2 - pointY1) / (pointX2 - pointX1);

			int startBar = pointX1;

			//Получаем отступ по Y
			double offset = pointY1 - pointX1 * angle;
			//Пробегаем по барам, строим наклонную линию начиная со startBar
			var angleLine = sec.Bars.Select((bar, i) => i >= startBar ? angle * i + offset : 0d).ToList();

			IPane pane = ctx.CreatePane("MainPane", 100, false);
			pane.HideLegend = false;
			pane.UpdatePrecision(PaneSides.RIGHT, sec.Decimals);
			pane.AddList(sec.ToString(), sec, CandleStyles.BAR_CANDLE, true, System.Drawing.Color.DarkBlue.ToArgb(), PaneSides.RIGHT);

			IGraphList line = pane.AddList("AngleLine",angleLine, ListStyles.LINE_WO_ZERO, System.Drawing.Color.OrangeRed.ToArgb(), LineStyles.SOLID, PaneSides.RIGHT);
			line.Thickness = 2;


		}

	}

}
Автор: Stan

Re: Определение угла - Sat Apr 22 2017 06:07 PM

Спасибо большое
Автор: PavelRD

Re: Определение угла - Thu Jul 13 2017 06:10 PM

спасибо