计算两条平行线之间的距离,包括 ! - 页 7

 
Олег avtomat:

任何你喜欢的方式。

正如你所看到的,这并不复杂。你只需要想一想。

有了这样一个详细的答案,我想TC就可以自己写代码了。

这里的许多人已经忘记了学校的问题,因为他们在学校无法掌握其意义。

 

输出是。

 // ЗАДАЕМ ДВЕ ТОЧКИ ПРИВЯЗКИ ДЛЯ ГЛАВНОЙ ЛИНИИ: ТОЧКА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,这只是一个时间问题。