Как переделать в индикаторе трендовые линии в объекты

 

Сигнальный индикатор Alert не видит эти трендовые линии на графике.
Как бы эти линии переделать в объекты ?


//------------+
//--- MQL4 ---|

//------------+

#property
indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Yellow #property indicator_color2 Yellow #property indicator_color3 Yellow #property indicator_width1 2 #property indicator_width2 2 #property indicator_width3 2 #define INDICATOR_VERSION "my" extern int  barsToCount = 20; //---- variables bool UseClose=true; string ShortName; //---- buffers double LR_line[]; double Sup_line[]; double Res_line[]; //+------------------------------------------------------------------+ int init(){    IndicatorBuffers(3);          SetIndexStyle(0,DRAW_LINE);    SetIndexBuffer(0,LR_line);    SetIndexEmptyValue(0,0.0);       SetIndexStyle(1,DRAW_LINE);    SetIndexBuffer(1,Sup_line);    SetIndexEmptyValue(1,0.0);       SetIndexStyle(2,DRAW_LINE);    SetIndexBuffer(2,Res_line);    SetIndexEmptyValue(2,0.0);    ShortName = "" + INDICATOR_VERSION + " " + (string)barsToCount;        DeleteObjects();         return(0); } //+------------------------------------------------------------------+ int deinit(){      DeleteObjects();    return(0); } //+------------------------------------------------------------------+ int start(){    // variables    double a,b,c,sumy=0.0,sumx=0.0,sumxy=0.0,sumx2=0.0,h=0.0,l=0.0;      int x;       // calculate linear regression      for(int i=0; i<barsToCount; i++){       sumy+=Close[i];       sumxy+=Close[i]*i;       sumx+=i;       sumx2+=i*i;    }      c=sumx2*barsToCount-sumx*sumx;             // Line equation        b=(sumxy*barsToCount-sumx*sumy)/c;    a=(sumy-sumx*b)/barsToCount;       // Linear regression line in buffer    for(x=0;x<barsToCount;x++)       LR_line[x]=a+b*x;       // Use PRICE_CLOSE for support-resistance    if (UseClose)      for(x=0;x<barsToCount;x++){        if(Close[x]-LR_line[x] > h) h = Close[x]-LR_line[x];        if(LR_line[x] - Close[x]> l) l = LR_line[x] - Close[x];      }        // Use HIGH - LOW    else      for(x=0;x<barsToCount;x++){        if(High[x]-LR_line[x] > h) h = High[x]-LR_line[x];        if(LR_line[x] - Low[x]> l) l = LR_line[x] - Low[x];      }      // Drawing support - resistance lines      if (h>l){      for(x=0;x<barsToCount;x++){        Sup_line[x]=a-h+b*x;        Res_line[x]=a+h+b*x;      }    } else {      for(x=0;x<barsToCount;x++){        Sup_line[x]=a-l+b*x;        Res_line[x]=a+l+b*x;      }    }      LR_line[x]  = 0.0;    Sup_line[x] = 0.0;    Res_line[x] = 0.0;       return(0); } void DeleteObjects() {    string name;    for(int i=ObjectsTotal()-1; i>=0; i--) {       name=ObjectName(i);       if(StringFind(name,ShortName,0)>-1) ObjectDelete(name);         WindowRedraw();    } } // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> END >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //
 

Обычно все идут в обратную сторону - графические объекты переделывают в буферы.

Для линии надо две точки, индексы 0 и barsToCount-1, буферы Sup_line[], Res_line[] и Time[].

 
Dmitry Fedoseev:

Обычно все идут в обратную сторону - графические объекты переделывают в буферы.

Для линии надо две токи, индексы 0 и barsToCount-1, буферы Sup_line[], Res_line[] и Time[].

Я обычно стрелки переделываю в буферы, а тут понадобилось в объекты.

Две точки это понятно, но как их получить? Где они в коде то ?

      ObjectCreate(Res_line_name,OBJ_TREND,0,Time[==],price==,Time[==],price==);      
      ObjectSet(Res_line_name,OBJPROP_STYLE,STYLE_SOLID);
      ObjectSet(Res_line_name,OBJPROP_WIDTH,2);
      ObjectSet(Res_line_name,OBJPROP_COLOR,Yellow);

      ObjectCreate(LR_line_name,OBJ_TREND,0,Time[==],price==,Time[==],price==);      
      ObjectSet(LR_line_name,OBJPROP_STYLE,STYLE_SOLID);
      ObjectSet(LR_line_name,OBJPROP_WIDTH,2);
      ObjectSet(LR_line_name,OBJPROP_COLOR,Yellow);

      ObjectCreate(Sup_line_name,OBJ_TREND,0,Time[==],price==,Time[==],price==);      
      ObjectSet(Sup_line_name,OBJPROP_STYLE,STYLE_SOLID);
      ObjectSet(Sup_line_name,OBJPROP_WIDTH,2);
      ObjectSet(Sup_line_name,OBJPROP_COLOR,Yellow);
 
Natalya Dzerzhinskaya:

Я обычно стрелки переделываю в буферы, а тут понадобилось в объекты.

Две точки это понятно, но как их получить? Где они в коде то ?

вот одна линия, по моему

// Linear regression line in buffer
   for(x=0;x<barsToCount;x++)
      LR_line[x]=a+b*x;

То есть в коде почему то прорисовывают каждую точку этой линии, если я не туплю конечно

Ну а вики поможет получить две любые точки этой линии и создать объект будет уже не проблематично

Можно также взять любые два значения буфера и соединить линией. Три буфера - три линии.
 
Natalya Dzerzhinskaya:

Я обычно стрелки переделываю в буферы, а тут понадобилось в объекты.

Две точки это понятно, но как их получить? Где они в коде то ?

в индикаторных буферах

hint - прямая строиться по двум точкам. То есть по минимуму можно взять значения от двух предыдущих баров.

PS переменные a,h,b в коде явно определяют прямые и вместо заполнения буферов можно нарисовать объекты (это после комента:

// Drawing support - resistance lines
 

Если проверить эти точки комментом то все точки определены на каждой линии с начала и Time1[barsToCount], но как определить вторую точку и Time2


   // Drawing support - resistance lines   
   if (h>l){
     for(x=0;x<barsToCount;x++){
       Sup_line[x]=a-h+b*x;
       Res_line[x]=a+h+b*x;
     } 
   } else {
     for(x=0;x<barsToCount;x++){
       Sup_line[x]=a-l+b*x;
       Res_line[x]=a+l+b*x;

Comment(" ПРОВЕРКА =  ",Res_line[x]," "," == ",LR_line[x]," "," == ",Sup_line[x]," ");   
 
    }
 
Natalya Dzerzhinskaya:

Если проверить эти точки комментом то все точки определены на каждой линии с начала, но как определить Time1 и вторую точку и Time2

https://docs.mql4.com/ru/series/ibarshift
iBarShift - Доступ к таймсериям и индикаторам - Справочник MQL4
iBarShift - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
iBarShift - Доступ к таймсериям и индикаторам - Справочник MQL4
 

Ничего не получается.
Ладно, тогда по другому надо решить с оповещением.
Изначально  задача была добавить Alert в код, но встал вопрос как определить касание линии ценой Bid? Где эти точки на нулевом баре?
Вот и придумалось линии сделать объектами и применять сторонний индикатор для alert который видит любые линии на графике.
Как же теперь добавить alert в код ? Может с этим будет проще ? Поможете ?

 
Natalya Dzerzhinskaya:

Ничего не получается.
Ладно, тогда по другому надо решить с оповещением.
Изначально  задача была добавить Alert в код, но встал вопрос как определить касание линии ценой Bid? Где эти точки на нулевом баре?
Вот и придумалось линии сделать объектами и применять сторонний индикатор для alert который видит любые линии на графике.
Как же теперь добавить alert в код ? Может с этим будет проще ? Поможете ?

касание верхней линии ценой Bid, а именно
Res_line[x]=a+h+b*x;

примерно так //из эксперта

if(MathAbs(iCustom(NULL,0,"название файла индикатора",2,0)-Bid[0])<=Point()) Alert(...);

или //из индикатора

if(MathAbs(Res_line[0]-Bid[0])<=Point()) Alert(...);

Нижняя

iCustom(NULL,0,"название файла индикатора",1,0)
Sup_line[x]=a-h+b*x;

Средняя -

iCustom(NULL,0,"название файла индикатора",0,0)
LR_line[x]=a+b*x;
 
Renat Akhtyamov:
касание верхней линии ценой Bid, а именно

Ок, сейчас сделаю по этим точкам на нулевом баре.

==================================================
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
==================================================

Вот спасибо, всё работает))

 
Dmitry Fedoseev:

Обычно все идут в обратную сторону - графические объекты переделывают в буферы.

Для линии надо две точки, индексы 0 и barsToCount-1, буферы Sup_line[], Res_line[] и Time[].


Вот же написал где в коде брать:

Sup_line[0] - Time[0], Sup_line[barsToCount-1] - Time[barsToCount-1]

Res_line[0] - Time[0], Res_line[barsToCount-1] - Time[barsToCount-1]