Парабола

 
Всем привет. Может ли кто-нибудь сделать индикатор для отрисовки параболы по двум точкам. Чтобы можно было работать как с фигурами в MT4, т.е. перетаскивать, растягивать и т.д. Готов закинуть небольшую денежку на телефон.
 
Alvograin:
Всем привет. Может ли кто-нибудь сделать индикатор для отрисовки параболы по двум точкам. Чтобы можно было работать как с фигурами в MT4, т.е. перетаскивать, растягивать и т.д. Готов закинуть небольшую денежку на телефон.

Чтоб задать параболу, необходимо три точки)) или точка и прямая. Но параметра все равно три, меньше не выйдет, как ни крути.
 
alsu:

Чтоб задать параболу, необходимо три точки)) или точка и прямая. Но параметра все равно три, меньше не выйдет, как ни крути.


Скорее всего человек имел в виду параболу, которая строится с двух точек, что образуют вектор.

Начало вектора является нулевой точкой параболы, вторая же точка не принадлежит параболе ( она внутри, в центре параболы), угол вектора указывает на наклон относительно стандартного положения.

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

 
Под двуумя точками я имел в виду: вершину параболы и одну точку на левой ветке параболы. Правая ветка должна отрисовываться автоматически - симметрично левой.
 
Alvograin:
Всем привет. Может ли кто-нибудь сделать индикатор для отрисовки параболы по двум точкам. Чтобы можно было работать как с фигурами в MT4, т.е. перетаскивать, растягивать и т.д. Готов закинуть небольшую денежку на телефон.

Это вряд ли. Камень преткновения я подчеркнул.

Можно попробовать соорудить такую фигню из индикатора (в буфер заливать саму кривую параболы + поддержка пары-тройки экранных объектов для якорных точек) но только пока что в MT5. Когда в четвёрке сделают пользовательскую обработку событий мыши, тогда и в четвёрке возможно будет сделать.

И мелкой копейкой на телефон не отделаешься - работка довольно хитроумная, кто попало и не сделает вовсе. А за квалификацированную работу и платить надо соответственно.

 
MetaDriver:

Это вряд ли. Камень преткновения я подчеркнул.

Можно попробовать соорудить такую фигню из индикатора (в буфер заливать саму кривую параболы + поддержка пары-тройки экранных объектов для якорных точек) но только пока что в MT5. Когда в четвёрке сделают пользовательскую обработку событий мыши, тогда и в четвёрке возможно будет сделать.

И мелкой копейкой на телефон не отделаешься - работка довольно хитроумная, кто попало и не сделает вовсе. А за квалификацированную работу и платить надо соответственно.


Можно в виде зацикленноо скрипта сделать. Можно и как индикатор - базовую линию пертащил, по ближайшему тику произойдет перерасчет.
 
Integer:
Можно в виде зацикленноо скрипта сделать. Можно и как индикатор - базовую линию пертащил, по ближайшему тику произойдет перерасчет.

Мышиные события как минимум нужно обрабатывать. В четвёрке без DLL никак.

О! Ес, точно, можно привязаться к парочке экранных объектов.

 
Alvograin:
Под двуумя точками я имел в виду: вершину параболы и одну точку на левой ветке параболы. Правая ветка должна отрисовываться автоматически - симметрично левой.

Третье условие все равно необходимо. Видимо, в качестве него подразумевается, что ось параболы строго вертикальна. Ну тогда нет ничего проще.


#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red

//координаты вершины
extern double x0=0;
extern double y0=0;
//координаты точки на ветви
extern double x1=-1;
extern double y1=1;

//левая и правая границы графика по оси х
extern double boundary_l=-3;
extern double boundary_h=3;

//шаг сетки по оси x
extern double grid_step_x=0.1;


double Graph[];

int init()
{
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Graph);
}

bool done=false;
int start()
{
   if (done) return(0);

   if(boundary_h<=boundary_l) return(0);
   if(grid_step_x<=0) return(0);
   if(x1==0||y1==y0) return(0);
   
   // уравнение параболы y = A*(x-x0)^2+y0, неизвестно только А, его и найдем:
   double A = (y1-y0)/((x1-x0)*(x1-x0));
   
   int i;
   double xc;
   
   int idx0=-1,idx1=-1;
   
   for(i=0, xc=boundary_h; xc>=boundary_l ; xc-=grid_step_x, i++)
   {
      Graph[i] = A * (xc-x0)*(xc-x0) + y0;
      
      if(idx0<0 && xc<=x0) idx0=i;
      if(idx1<0 && xc<=x1) idx1=i;
   }
   
   ObjectDelete("Вершина");
   ObjectCreate("Вершина",OBJ_ARROW,WindowFind(WindowExpertName()), Time[idx0], y0);
   ObjectSet("Вершина", OBJPROP_ARROWCODE,SYMBOL_LEFTPRICE);
   ObjectSet("Вершина", OBJPROP_COLOR, Gold);

   ObjectDelete("Точка");
   ObjectCreate("Точка",OBJ_ARROW,WindowFind(WindowExpertName()), Time[idx1], y1);
   ObjectSet("Точка", OBJPROP_ARROWCODE,SYMBOL_LEFTPRICE);
   ObjectSet("Точка", OBJPROP_COLOR, Lime);

   done=true;
}
 
осталось приделать реакцию на перетаскивание меток.
 
Уже кое-что, только отображение нужно на самом графике. Да ось параболы строго вертикальна, ибо как говорит дедушка Элдер: - Рынок не знает диагоналей.
 
alsu:
осталось приделать реакцию на перетаскивание меток.

:)

До фига чего осталось. Во первых реакцию. А дальше:

2. нужно определиться с реакцией при перетаскивании левой метки вправо (правее центра), в частности как реагировать если они оказались на одной вертикали.

3. буфер не должен быть ограничен по длине, по крайней мере в пределах видимости. Значит его нужно ещё и в будущее выдвигать.

4...

5.......

и т.п.

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