Нужна помощь професссионалов!

 

Во вложениии есть пользовательский индикатор. 

Индикатор использует 2 буфера которые покрашены соответственно в синий и красный цвет.  Т.е. если линия принадлежит первому буферу то синяя, если второму буферу - то красная. 

 1

 

2

На картинках видно что красная линия принадлежит как первому таки второму буферу. 

Как отследить цвет линии  индикатора? Через буферы  некорректно получается.

 

 
Dmitiry Ananiev:

Во вложениии есть пользовательский индикатор. 

Индикатор использует 2 буфера которые покрашены соответственно в синий и красный цвет.  Т.е. если линия принадлежит первому буферу то синяя, если второму буферу - то красная. 

 

 

На картинках видно что красная линия принадлежит как первому таки второму буферу. 

Как отследить цвет линии  индикатора? Через буферы  некорректно получается.

 

Чтобы Вам скорее помогли, вставляйте код индикатора прямо на форум. Нет желания лишний раз качать себе что-то.
 

Я пишу советника по этому индикатору, поэтому не спрашиваю, что нужно изменить в индикаторе. Я спросил, как отследить изменение цвета? 

 

 

//+------------------------------------------------------------------------+
//|                                      Symphonie_Trendline_Indicator.mq4 |
//|Based on basic Trendline by MetaTrader_Experts_and_Indicators           |
//+------------------------------------------------------------------------+
#property copyright "Symphonie Trader Systems"
#property link      "MetaTrader_Experts_and_Indicators"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 DodgerBlue
#property indicator_color2 Red

extern int CCIPeriod=63;
extern int ATRPeriod=18;
double TrendUp[];
double TrendDown[];
int st = 0;
//extern int SlowerEMA = 6;



//+------------------------------------------------------------------+
//| Custom indicator initialization function|
//+------------------------------------------------------------------+
int init()
 {
//---- indicators

  SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
  SetIndexBuffer(0, TrendUp);
  SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);
  SetIndexBuffer(1, TrendDown);

  /*SetIndexStyle(0, DRAW_ARROW, EMPTY);
  SetIndexArrow(0, 159);
  SetIndexBuffer(0, TrendUp);
  SetIndexStyle(1, DRAW_ARROW, EMPTY);
  SetIndexArrow(1, 159);
  SetIndexBuffer(1, TrendDown);*/

  /*for(int i = 0; i < Bars; i++) {
     TrendUp[i] = NULL;
     TrendDown[i] = NULL;
  }*/
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function|
//+------------------------------------------------------------------+
int deinit()
 {
//----
  /*for(int i = 0; i < Bars; i++) {
     TrendUp[i] = NULL;
     TrendDown[i] = NULL;
  }*/
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function|
//+------------------------------------------------------------------+
int start()
 {

  int limit, i, counter;
  double Range, AvgRange, cciTrendNow, cciTrendPrevious;

  int counted_bars = IndicatorCounted();
//---- check for possible errors
  if(counted_bars < 0) return(-1);
//---- last counted bar will be recounted
  if(counted_bars > 0) counted_bars--;

  limit=Bars-counted_bars;

  for(i = limit; i >= 0; i--) {
     cciTrendNow = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, i);
     cciTrendPrevious = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, i+1);

     //st = st * 100;


     counter = i;
     Range = 0;
     AvgRange = 0;
     for (counter = i; counter >= i-9; counter--) {
        AvgRange = AvgRange + MathAbs(High[counter]-Low[counter]);
     }
     Range = AvgRange/10;
     if (cciTrendNow >= st && cciTrendPrevious < st) {
        TrendUp[i+1] = TrendDown[i+1];
     }

     if (cciTrendNow <= st && cciTrendPrevious > st) {
        TrendDown[i+1] = TrendUp[i+1];
     }

     if (cciTrendNow >= st) {
        TrendUp[i] = Low[i] - iATR(NULL, 0, ATRPeriod, i);
        if (TrendUp[i] < TrendUp[i+1]) {
           TrendUp[i] = TrendUp[i+1];
        }
     }
     else if (cciTrendNow <= st) {
        TrendDown[i] = High[i] + iATR(NULL, 0, ATRPeriod, i);
        if (TrendDown[i] > TrendDown[i+1]) {
           TrendDown[i] = TrendDown[i+1];
        }
     }
  }

//----

//----
  return(0);
 }

//+------------------------------------------------------------------+
 
Anton Zverev:

Все просто один из буферов будет равняться нулю:

 

Ну во первых не нулю А  2147483647.0. 

Во вторых посмотрите  скрины. На первом красная линия значится под вторым буфером (Value2) А на втором скрине красная линия под первым буфером! (Value1) ! 


 
Dmitiry Ananiev:

Я пишу советника по этому индикатору, поэтому не спрашиваю, что нужно изменить в индикаторе. Я спросил, как отследить изменение цвета? 

Предлагаю Вам изменить тип построений на DRAW_COLOR_LINE. И проблем не будет.

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_COLOR_LINE
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_COLOR_LINE
  • www.mql5.com
Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_COLOR_LINE - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Dmitiry Ananiev:

Во вложениии есть пользовательский индикатор. 

Индикатор использует 2 буфера которые покрашены соответственно в синий и красный цвет.  Т.е. если линия принадлежит первому буферу то синяя, если второму буферу - то красная. 

 

 

На картинках видно что красная линия принадлежит как первому таки второму буферу. 

Как отследить цвет линии  индикатора? Через буферы  некорректно получается.

 

Чтобы не потерять внешний вид индикатора, нужно наверное третий буфер создать. В первом будет TrendDown[i], а в двух разукрашенных присвоение значения TrendDown[i]. Дальше просто сравнить значение 1 и 3, 1 и 2. Если равно, то это какой то нужный цвет.

 
Alexey Kozitsyn:

Предлагаю Вам изменить тип построений на DRAW_COLOR_LINE. И проблем не будет.

Так он вообще ничего не рисует! 

Повторюсь для тех кто не понял.  Индикатор рисует как рисует. Как мне в советнике отследить смену цвета ? 

 
new-rena:

Чтобы не потерять внешний вид индикатора, нужно наверное третий буфер создать. В первом будет TrendDown[i], а в двух разукрашенных присвоение значения TrendDown[i]. Дальше просто сравнить значение 1 и 3, 1 и 2. Если равно, то это какой то нужный цвет.

Вот не силен я в индикаторах. 10 лет советники пишу, а индикаторы как то не приходилось. Что нужно изменить ? 
 
Dmitiry Ananiev:
Вот не силен я в индикаторах. 10 лет советники пишу, а индикаторы как то не приходилось. Что нужно изменить ? 

Вот это дает один и тот же цвет в двух буферах: TrendUp[i+1] = TrendDown[i+1];

Сейчас посмотрю.

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

//+------------------------------------------------------------------------+
//|                                      Symphonie_Trendline_Indicator.mq4 |
//|Based on basic Trendline by MetaTrader_Experts_and_Indicators           |
//+------------------------------------------------------------------------+
#property copyright "Symphonie Trader Systems"
#property link      "MetaTrader_Experts_and_Indicators"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 DodgerBlue
#property indicator_color2 Red
#property indicator_color3 Green

extern int CCIPeriod=63;
extern int ATRPeriod=18;
double TrendUp[];
double TrendDown[];
double TrendHorizont[];

int st = 0;
//extern int SlowerEMA = 6;



//+------------------------------------------------------------------+
//| Custom indicator initialization function|
//+------------------------------------------------------------------+
int init()
 {
//---- indicators

  SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
  SetIndexBuffer(0, TrendUp);
  SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);
  SetIndexBuffer(1, TrendDown);
  SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 2);
  SetIndexBuffer(2, TrendHorizont);

  /*SetIndexStyle(0, DRAW_ARROW, EMPTY);
  SetIndexArrow(0, 159);
  SetIndexBuffer(0, TrendUp);
  SetIndexStyle(1, DRAW_ARROW, EMPTY);
  SetIndexArrow(1, 159);
  SetIndexBuffer(1, TrendDown);*/

  /*for(int i = 0; i < Bars; i++) {
     TrendUp[i] = NULL;
     TrendDown[i] = NULL;
  }*/
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function|
//+------------------------------------------------------------------+
int deinit()
 {
//----
  /*for(int i = 0; i < Bars; i++) {
     TrendUp[i] = NULL;
     TrendDown[i] = NULL;
  }*/
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function|
//+------------------------------------------------------------------+
int start()
 {

  int limit, i, counter;
  double Range, AvgRange, cciTrendNow, cciTrendPrevious;

  int counted_bars = IndicatorCounted();
//---- check for possible errors
  if(counted_bars < 0) return(-1);
//---- last counted bar will be recounted
  if(counted_bars > 0) counted_bars--;

  limit=Bars-counted_bars;

  for(i = limit; i >= 0; i--) {
     cciTrendNow = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, i);
     cciTrendPrevious = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, i+1);

     //st = st * 100;


     counter = i;
     Range = 0;
     AvgRange = 0;
     for (counter = i; counter >= i-9; counter--) {
        AvgRange = AvgRange + MathAbs(High[counter]-Low[counter]);
     }
     Range = AvgRange/10;
     if (cciTrendNow >= st && cciTrendPrevious < st) {
        //TrendUp[i+1] = TrendDown[i+1];
        TrendHorizont[i+1] = TrendDown[i+1];
     }

     if (cciTrendNow <= st && cciTrendPrevious > st) {
        //TrendDown[i+1] = TrendUp[i+1];
        TrendHorizont[i+1] = TrendUp[i+1];
     }

     if (cciTrendNow >= st) {
        TrendUp[i] = Low[i] - iATR(NULL, 0, ATRPeriod, i);
        if (TrendUp[i] < TrendUp[i+1]) {
           TrendUp[i] = TrendUp[i+1];
        }
     }
     else if (cciTrendNow <= st) {
        TrendDown[i] = High[i] + iATR(NULL, 0, ATRPeriod, i);
        if (TrendDown[i] > TrendDown[i+1]) {
           TrendDown[i] = TrendDown[i+1];
        }
     }
  }

//----

//----
  return(0);
 }

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

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

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

 

И вот эти фишки - тоже не больно то нравятся, т.к. значение опять же пропишется в оба буфера:

 if (cciTrendNow >= st)

и

 else if (cciTrendNow <= st)

Из какого то одного условия знак "либо равено" желательно убрать, т.е.

либо так:

 if (cciTrendNow >= st)

и

 else if (cciTrendNow < st)

либо так:

 if (cciTrendNow > st)

и

 else if (cciTrendNow <= st)

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