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

 
Itum:


Все верно ... А мне нужно длину Красной лини...   Представьте, а если эти две параллельные линии будут вертикальные, что покажет синяя линия ?

 

Действительно - лажа.

Я показал принцип автоматизации такого рода вычисления, остальное самостоятельно, ибо с мозгами у Вас всё в порядке.

Ну и здесь мы кое что задели

https://www.mql5.com/ru/forum/233174

Значения трендовых линий при оптимизации ?
Значения трендовых линий при оптимизации ?
  • 2018.03.25
  • www.mql5.com
Известна первая точка по фракталам Известна вторая точка по вершинам high-low На графике рисуются трендовые линии по точкам Как получить цены тренд...
 
Itum:


Все верно ... А мне нужно длину Красной лини...   Представьте, а если эти две параллельные линии будут вертикальные, что покажет синяя линия ?

 

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

Как вариант, вижу такую последовательность: Определяем наклон трендовой или строим трендовую по углу и исходя из этого получаем угол перпендикуляра по которому и считаем расстояние до второй линии.

Но это только теория. Её надо проверять.

 
Alexey Viktorov:

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

Как вариант, вижу такую последовательность: Определяем наклон трендовой или строим трендовую по углу и исходя из этого получаем угол перпендикуляра по которому и считаем расстояние до второй линии.

Но это только теория. Её надо проверять.

Пипец. Пора применять преобразования Фурье 

 
Renat Akhtyamov:

Действительно - лажа.

Я показал принцип автоматизации такого рода вычисления, остальное самостоятельно, ибо с мозгами у Вас всё в порядке.

Ну и здесь мы кое что задели

https://www.mql5.com/ru/forum/233174

немножко, не то ... но что то похожее есть )

Ну и головоломка же ...

 
Itum:

немножко, не то ... но что то похожее есть )

Ну и головоломка же ...

Да нет никакой головоломки

Найдите угол, найдите катет по формуле.

Вот тема:

https://www.mql5.com/ru/forum/163710
Расчёт угла наклона трендовой линии.
Расчёт угла наклона трендовой линии.
  • 2016.12.17
  • www.mql5.com
Добрый день. Нужно расcчитать угол наклона трендовой линии на графике в градусах программно (MQL5...
 
Itum:

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

Если на белом листе нарисовать две параллельные  линии на расстоянии друг от друга 10 см (Рис.7), то это лист можно крутить как угодно под любым углом и будут все те же 10 см (Рис.6). 


Я что-то запутался в Ваших целях...

Расскажите, что у Вас есть изначально, пожалуйста. Мне вот не ясно, как можно задавать вопрос о расстоянии, если у нас нет параллельных линий, а если они, есть то как строится вторая линия без этих данных?

Выше Вы привели код двух линий, но, позвольте, там параллельности нет вообще.

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

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

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

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

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

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


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

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



 

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


 

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


 

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


 

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


 

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

#property strict
#property script_show_inputs



input int X_1=100;   //X1 в барах
input double Y_1=10;  //Y1 в Пунктах от цены открытия бара
input int X_2=10;   //X2 в барах
input double Y_2=15;  //Y2 в Пунктах от цены открытия бара
input double Point_delta=30; //Зададим дельту в пунктах

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()

  {


//--- удаление всех созданных объектов 
   bool DelAllObjects=true;
   if(DelAllObjects==true)
     {
      int obj_total=ObjectsTotal();
      PrintFormat("Всего%d объектов",obj_total);
      for(int i=obj_total-1;i>=0;i--)
        {
         string name=ObjectName(i);
         PrintFormat("Объект%d:%s",i,name);
         ObjectDelete(name);
        }
     }

/*     
        Start   Stop
x  Time 10      20
y  Price        30      50

Линейная функция y=kx+b
Система уравнений
30y=10k+b
50y=20k+b
//Вычитаем
20y=10k+0
-10k=-20y
k=-20/-10
k=2

*/   

double k=(Y_2-Y_1)*(-1)/(X_2-X_1)*(-1);
double b=(X_1*k-Y_1)*(-1);

//Point_delta - можно задать/рассчитать, если в этом смысл, а если не известна, то ищем по координатам второй линии - Delta
double Y_3=X_1*k+b+Point_delta;
double  Y_4=X_2*k+b+Point_delta;

double k2=(Y_3-Y_4)*(-1)/(X_2-X_1)*(-1);
double b2=(X_1*k-Y_2)*(-1);
double Delta=(Y_3-Y_1);


   ObjectCreate("Line1",OBJ_TRENDBYANGLE,0,Time[X_1],Open[X_1]+Y_1*Point(),Time[X_2],Open[X_2]+Y_2*Point());
   ObjectSetInteger(0,"Line1",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Line1",OBJPROP_COLOR,Red);
   ObjectSetInteger(0,"Line1",OBJPROP_WIDTH,2);
   ObjectSetInteger(0,"Line1",OBJPROP_RAY_RIGHT,false);//Луч продолжается вправо 
   
   ObjectCreate("Line2",OBJ_TRENDBYANGLE,0,Time[X_1],Open[X_1]+Y_3*Point(),Time[X_2],Open[X_2]+Y_4*Point());
   ObjectSetInteger(0,"Line2",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Line2",OBJPROP_COLOR,Lime);
   ObjectSetInteger(0,"Line2",OBJPROP_WIDTH,2);
   ObjectSetInteger(0,"Line2",OBJPROP_RAY_RIGHT,false);//Луч продолжается вправо 


      Label("Delta",//Название
            0,      //Окно
            30,     //X
            10,      //Y
            "k="+DoubleToString(k,_Digits)+" b="+DoubleToString(b,_Digits)+" Delta="+DoubleToString(Delta,_Digits),
            10,//Размер шрифта
            Yellow,//Цвет шрифта
            CORNER_LEFT_UPPER,//Выбор угла: 3 - нижний правый, 1 - верхний правый. 2 - нижний левый, 4 - верхний левый                
            ANCHOR_LEFT_UPPER
            );

     return;
  }

//+------------------------------------------------------------------+
//|Функция вывода информации на экран                                |
//+------------------------------------------------------------------+
void Label(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner,int anchor)
  {
   ObjectDelete(0,_name);
   ObjectCreate(0,_name,OBJ_LABEL,_window,0,0);
   ObjectSetInteger(0,_name,OBJPROP_CORNER,corner);
   ObjectSetInteger(0,_name,OBJPROP_XDISTANCE,_x);
   ObjectSetInteger(0,_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
   ObjectSetInteger(0,_name,OBJPROP_ANCHOR,anchor);
  }

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

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

 
А если планируете строить канал, то что б объекты не бегали по экрану, лучше строить в индикаторе использую графические буферы или делать циклическую перерисовку.
 
Aleksey Vyazmikin:

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

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

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


Правильно ли я понимаю что дельта это синяя линия ... А размера красной здесь нет ?

https://c.mql5.com/3/181/lineee__2.jpg