Геометрия прямоугольника - страница 2

 
Igor Makanu:

в моем примере формула тебе нужна

Py = (lasttmp-tmp)/((lasti-i)+Point/10000);

это будет приращение которое нужно будет добавлять от точки с координатами [ lasttmp , lasti ] до  [ tmp , i ] , где tmp - это цена, i - это № бара

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

Игорь нет случайно в запасе метода построения линии в советнике OBJ_TREND?

чтобы путем создания отрезков строилась линия и соответственно перерисовка происходила путем уничтожения старых обьектов и генерации новых
 
Мартин, уже пора. 
 
Martin Cheguevara:

Игорь нет случайно в запасе метода построения линии в советнике OBJ_TREND?

чтобы путем создания отрезков строилась линия и соответственно перерисовка происходила путем уничтожения старых обьектов и генерации новых

если рисовать "точками" - отрезками по барно, нет не делал, но принцип тот же

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

#include<ChartObjects\ChartObjectsLines.mqh>


 

 

вот индикатором сделал, вроде все переменные назвал по школьным формулам, может проще так будет

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Line
#property indicator_label1  "Line"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Bar_Start=50;
input int      Bar_Stop=1;
//--- indicator buffers
double         LineBuffer[];
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,LineBuffer);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static bool firstrun=true;
   if(firstrun)
     {
      double y0 = High[Bar_Start];
      double y1 = Low[Bar_Stop];
      double dy =  fabs(y0 - y1);
      dy=y0-y1>0.0 ? -dy : dy;
      double dx = Bar_Start-Bar_Stop;
      double Py = dy / ( dx +_Point*_Point);
      for(int i=Bar_Start; i>=Bar_Stop; i--)
        {
         LineBuffer[i]=y0;
         y0+=Py;
        }
      firstrun=false;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Igor Makanu:

вот индикатором сделал, вроде все переменные назвал по школьным формулам, может проще так будет

Я уже сделал=) Спасибо Игорь большое!))

 
Igor Makanu:

вот индикатором сделал, вроде все переменные назвал по школьным формулам, может проще так будет


//блок удаления обьектов

   int obj_total = ObjectsTotal(); 

   string name; 

   for(int i=0;i < obj_total;i++){ 

     name = ObjectName(i);

     if(ObjectType(name) == OBJ_TREND){

         ObjectDelete(0,name);

     }

   }

я правильно реализовал удаление обьектов?

у меня почему то как-то странно устаревшие обьекты удаляются...

хотя я проверил сам механизм он работает верно все значения верные...

 
Martin Cheguevara:

Ты прав так и сделаю)

спасибо!)

дело в том что необходимо было вычислить угол наклона линии 3. Но в силу того, что я это уже ранее делал и столкнулся с проблемой ошибочного определения из за зависимости от масштаба графика, даже если программно выставлял в свойствах графика 1 к 1. все равно была существенная погрешность даже с использованием библиотек winAPI ("user32.dll") и расчет в пикселах самого окна отрисовки окна и прочей жести. Так что задача перетекла в исполнение описанное в данной теме.

Тут сам бог велел работать с временем или номером бара по оси Х и ценой по оси Y.

 
Martin Cheguevara:


//блок удаления обьектов

   int obj_total = ObjectsTotal(); 

   string name; 

   for(int i=0;i < obj_total;i++){ 

     name = ObjectName(i);

     if(ObjectType(name) == OBJ_TREND){

         ObjectDelete(0,name);

     }

   }

я правильно реализовал удаление обьектов?

у меня почему то как-то странно устаревшие обьекты удаляются...

хотя я проверил сам механизм он работает верно все значения верные...

Типичная ошибка, надо поменять последовательность:

for(int i=obj_total-1;i >=0 ;i--){ 

     name = ObjectName(i);

     if(ObjectType(name) == OBJ_TREND){

         ObjectDelete(0,name);

     }
}
 
Alexey Volchanskiy:

Типичная ошибка, надо поменять последовательность:

Да ладно)) обалдеть...
А в чем причина не расскажете?
Разве порядок прохода что-то меняет?
 
Martin Cheguevara:
Да ладно)) обалдеть...
А в чем причина не расскажете?
Разве порядок прохода что-то меняет?


когда вы удаляете объект 0, то все объекты сдвигаются и появляется новый 0, но итератор уже ++ и удаляет 1 объект, при этом новоиспеченный 0 уже не удаляется.. итд.. большое число объектов останется из-за смены их номеров походу