Вычислить расстояние между двумя параллельными линиями включая ! - страница 7

 
Олег avtomat:

любым удобным способом

Как видно, ничего сложного нет. Надо только немножечко подумать.

Вот с таким развернутым ответом, думаю ТС уже справится сам с написанием кода.

Многие тут уже забыли школьные задачки, ибо не могли их осмыслить смысл в школе.

 

Выходит что:

 // ЗАДАЕМ ДВЕ ТОЧКИ ПРИВЯЗКИ ДЛЯ ГЛАВНОЙ ЛИНИИ: ТОЧКА1(ВРЕМЯ,ЦЕНА) и ТОЧКА2(ВРЕМЯ,ЦЕНА)
   // ЭТА ЛИНИИ ГЛАВНАЯ
   datetime Line1_Врем0=Time[0], Line1_Врем1=Time[10];
   double Line1_Цена0=High[10], Line1_Цена1=Low[10];

   ObjectCreate("Line1",OBJ_TRENDBYANGLE,0,Line1_Врем0,Line1_Цена0,Line1_Врем1,Line1_Цена1);
   ObjectSetInteger(0,"Line1",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Line1",OBJPROP_COLOR,Red);
   ObjectSetInteger(0,"Line1",OBJPROP_WIDTH,2);

   // СТРОИМ ПАРАЛЛЕЛЬНУЮ ЛИНИЮ ТОЛЬКО ПО ОДНОЙ ТОЧКЕ-ПРИВЯЗКЕ
   ObjectCreate("Line2",OBJ_TRENDBYANGLE,0,Time[15],Low[15],0,0);
   ObjectSetInteger(0,"Line2",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Line2",OBJPROP_COLOR,Lime);
   ObjectSetInteger(0,"Line2",OBJPROP_WIDTH,2);

  // ПРИСВАИВАЕМ ЛИНИИ Line2 ТАКОЙ ЖЕ САМЫЙ УГОЛ КАК В ЛИНИИ Line1 ЧТО БЫ ЛИНИИ БЫЛИ ПАРАЛЛЕЛЬНЫЕ 
   ObjectSetDouble(0,"Line2",OBJPROP_ANGLE,ObjectGetDouble(0,"Line1",OBJPROP_ANGLE)); 

   // РИСУЕМ ПЕРПЕНДИКУЛЯРНУЮ ЛИНИЮ К Line1 и Line2
   ObjectCreate("Value",OBJ_TRENDBYANGLE,0,Time[0],Low[15],0,0);
   ObjectSetInteger(0,"Value",OBJPROP_RAY,false);
   ObjectSetInteger(0,"Value",OBJPROP_COLOR,Gold);
   ObjectSetInteger(0,"Value",OBJPROP_WIDTH,3);
   ObjectSetDouble(0,"Value",OBJPROP_ANGLE,90+ObjectGetDouble(0,"Line1",OBJPROP_ANGLE));

   // ЗАДАЧА: ПОЛУЧИТЬ РАЗМЕР ЖЕЛТОЙ ЛИНИИ МЕЖДУ Line1 и Line2. ОПТИМАЛЬНЫМ И УНИВЕРСАЛЬНЫМ ПАРАМЕТРОМ РАЗМЕРА НАВЕРНОЕ БУДУТ - ПИКСЕЛИ.

Далее через ObjectGetValueByShift("Line1",a++) и ObjectGetValueByShift("Value",a++) и ObjectGetValueByShift("Line2",a++) ищем пересечение

Верно ли я понимаю ?
 
Олег avtomat:

Для решения поставленной задачи надо:

1. построить перпендикуляр к заданным параллельным линиям

2. определить точки пересечения перпендикуляра с заданными линиями

3. вычислить расстояние между точками пересечения


Наглядно в картинках:

(различные линии и расстояния между ними)



 

.............................................................................


 

.............................................................................


 

.............................................................................


 

.............................................................................


Не убедительно 

 
Алексей Тарабанов:

Не убедительно 

Открывай учебники и убеждайся

 
Теория вроде бы понятна и казалось бы нет ничего сложного но ... Только вот как это на практике сделать и как оно работь будет... 
 
Itum:

Да

к сожалению я не математик (
А поГуглить?


синий угол = 90 - угол линии

переводим угол в радианы

красный противолежащий катет = зеленая гипотенуза * синус (синий угол)

Гипотенузу мы уже находили в этой ветке, пересекая обе линии вертикальной

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

 
Renat Akhtyamov:
А поГуглить?


синий угол = 90 - угол линии

переводим угол в радианы

красный противолежащий катет = зеленая гипотенуза * синус (синий угол)

Гипотенузу мы уже находили в этой ветке, пересекая обе линии вертикальной

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

Хммм...

Почему то не работает

   datetime t1 = (datetime)ObjectGetInteger(0, "Line1", OBJPROP_TIME, 0);
   datetime t2 = (datetime)ObjectGetInteger(0, "Line2", OBJPROP_TIME, 0);
   double p1 = 0;
   double p2 = 0;
   
   if(t1 > t2)
   {
      p1 = ObjectGetValueByTime(0, "Line1", t2);
      p2 = ObjectGetDouble(0, "Line2", OBJPROP_PRICE, 0);
   }
   if(t1 < t2)
   {
      p1 = ObjectGetDouble(0, "Line1", OBJPROP_PRICE, 0);
      p2 = ObjectGetValueByTime(0, "Line2", t1);;
   }
   if(t1 == t2)
   {
      p1 = ObjectGetDouble(0, "Line1", OBJPROP_PRICE, 0);
      p2 = ObjectGetDouble(0, "Line2", OBJPROP_PRICE, 0);
   }
   
   double rez = NormalizeDouble(MathAbs(p1 - p2) / _Point, 0) * MathSin(ObjectGetDouble(0,"Line1",OBJPROP_ANGLE));
   Comment("Разница: ", rez /* */);
 
Вроде бы все просто ... но не выходит получить желаемый результат
 
Itum:
Вроде бы все просто ... но не выходит получить желаемый результат


Да, все просто, за исключением, что ваша задача не решаемая.. ))

Во первых, о функции ObjectGetDouble(0,"Line1",OBJPROP_ANGLEзабудьте.. она будет возвращать 0 всегда, так как для трендовой линии она не применима. Она нужна, в частности, для "угловой" трендовой линии, которая  не зависит от масштаба графика НО она не зависит  и от цен баров.. То есть при смене масштаба ее угол не поменяется, но сама линия улетит от баров..


Но это не самая большая проблема.. Вся соль в том, что вы хотите найти размер перпендикуляра между 2мя параллельными трендовыми линиями, попробуйте на графике такой перпендикуляр изобразить.. А потом измените масштаб графика.. перпендикуляр станет не перпендикулярным.. )))) То есть проблема именно в том, что вы считаете перпендикуляром (зависимость от масштаба и как ВЫ его видите) и перпендикуляром математическим. 

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

Пользуясь геометрией, такая задача в чистом виде решается на раз-два.. НО математический результат вычислений никогда не будет совпадать с видимым на графике.. А вам нужно именно совпадение, поэтому задача не решаемая. Просто упростите свои требования, ищите не перпендикуляр, а просто расстояние между 2мя линиями на одной и той же временной точке.. 

 

У меня нет слов

Это уже из серии - знаю все буквы, не могу прочитать слово

Давайте, давайте, не опускайте руки, изучайте MQL, осталось дело за малым