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

 
Itum:

Подскажите как можно вычислить расстояние между двумя параллельными линиями включая масштаб графика (таким образом что бы масштаб не влиял на это)

вот пример:

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

У Вас красная перпендикулярная линия будет изменяться кратно простой вертикальной линии, соединяющей обе линии.

Не партесь, Ваш ответ:

разница цен в одно и то же время в двух точках на линиях.

//PS: Плавали уже...

Однако, можете проверить моё утверждение.

Ответ также есть, но он в геометрии на тему "Прямоугольный треугольник. Длина катета."

 
Itum:

Подскажите как можно вычислить расстояние между двумя параллельными линиями включая масштаб графика (таким образом что бы масштаб не влиял на это)

вот пример:

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

Весна. 

вычисляем что-то, включая масштаб, но так, чтобы масштаб не влиял. 

Может, параллельность влиять не должна? 

 
Itum:

Подскажите как можно вычислить расстояние между двумя параллельными линиями включая масштаб графика (таким образом что бы масштаб не влиял на это)

вот пример:

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

Поставите на график МАшку,задайте уровни и вычислять ничего не надо.

 
Itum:

Подскажите как можно вычислить расстояние между двумя параллельными линиями включая масштаб графика (таким образом что бы масштаб не влиял на это)

Смотря, что вы хотите на выходе получить? Если вам нужно расстояние в пикселях, строим треугольник и вычисляем по теореме Пифагора сторону. Но на это величину будет влиять масштаб. Если вы хотите, именно движение цены - то строим проекцию на ось OX/OY и это будет движением цены(например). Если нужно в дистанция в усл.единицах, то проекции необходимо умножить. Как то так. Задача на самом деле элементарная.

 
   ObjectCreate("Line1",OBJ_TREND,0,Time[0],High[10],Time[10],Low[10]);
   ObjectSetInteger(0,"Line1",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Line1",OBJPROP_COLOR,Red);
   ObjectSetInteger(0,"Line1",OBJPROP_WIDTH,2);
   
   ObjectCreate("Line2",OBJ_TREND,0,Time[10],High[10],Time[20],Low[10]);
   ObjectSetInteger(0,"Line2",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Line2",OBJPROP_COLOR,Lime);
   ObjectSetInteger(0,"Line2",OBJPROP_WIDTH,2);
   
   Comment("Разница: ");
 
Itum:

Согласно приведенной формуле кратчайшее расстояние R между этими двумя параллельными линиями:

   double V = (High[10]-Low[10])/(Time[10]-Time[20]);
   double R = (High[10]-Low[10])/sqrt(1+V*V) ; 

Где V - скорость изменения цены с единицей измерения пункт/секунда. Также V = тангенс угла наклона линии в системе с масштабом 1 пункт = 1 секунда.

Только нужно оговориться, что эта формула работает если не существует временных дырок между барами. Например выходных дней. Иначе результат будет некорректным. В этом случае необходимо использовать функцию PeriodSeconds() и вычислять временную дельту через количество бар умноженное на количество секунд в баре. 

Т.е. в данном случае будет:

   double V = (High[10]-Low[10])/(10*PeriodSeconds());
   double R = (High[10]-Low[10])/sqrt(1+V*V) ;


Так же нужно понимать, что @Renat Akhtyamov в этом сообщении по сути был прав. Т.к. при достаточно большом временном интервале значение знаменателя (sqrt(1+V*V)) всегда будет чуть больше 1.

И тогда эту формулу можно упростить:

double R = High[10]-Low[10] ;



 

 
Itum:
   ObjectCreate("Line1",OBJ_TREND,0,Time[0],High[10],Time[10],Low[10]);
   ObjectSetInteger(0,"Line1",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Line1",OBJPROP_COLOR,Red);
   ObjectSetInteger(0,"Line1",OBJPROP_WIDTH,2);
   
   ObjectCreate("Line2",OBJ_TREND,0,Time[10],High[10],Time[20],Low[10]);
   ObjectSetInteger(0,"Line2",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Line2",OBJPROP_COLOR,Lime);
   ObjectSetInteger(0,"Line2",OBJPROP_WIDTH,2); 
   
   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);
   }
   
   Comment("Разница: " + DoubleToString(MathAbs(p1 - p2) / _Point, 0));
 
Sergey Kolemanov:

Ну наворотили....
t1 в данном случае всегда = t2

Все что Вы написали,

можно записать одной строчкой:

Comment("Разница: " + DoubleToString((High[10]-Low[10]) / _Point, 0));

результат будет тот же.

 
Nikolai Semko:

Ну наворотили....
t1 в данном случае всегда = t2

Все что Вы написали,

можно записать одной строчкой:

результат будет тот же.

Ну да , это у него в примере t1 = t2 , а как на самом деле они строятся знает только топикстартер. А если они строятся как t1 > t2 , потом перерасчёт и t1 < t2 , тогда как считать?

 
Nikolai Semko:

можно записать одной строчкой:

Comment("Разница: " + DoubleToString((High[10]-Low[10]) / _Point, 0));


Вы считаете расстояние между High и Low , а у него линии 

Причина обращения: