DRAW_COLOR_ZIGZAG в пределах одного бара. - страница 3

 
Rashid Umarov:

Так, я сейчас в примере из DRAW_COLOR_ZIGZAG поменял одну строчку и получил 8 цветов (вместо двух):

Чего вам не хватает для реализации? Сделайте массив из 4 цветов  - Красный, Синий, Красны , Синий и заполняйте как хотите. Чего я не понимаю?


Количество цветов не играет никакой роли. 
Не работает стиль DRAW_COLOR_ZIGZAG на одном баре. Сейчас набросаю код.

Логи простая: движение вверх - красим синим, движение вниз красим красным. Но если движение образуется на одном баре, то предыдущее движение перекрашивается.

На MQL4 вопрос решал рисованием линий по координатам пиков. На MQL5 Решил попробовать реализовать через DRAW_COLOR_ZIGZAG. Но не тут-то было!

 

Я правильно понял проблему: вертикальный участок перекрашивает предыдущий отрезок?


 

//+------------------------------------------------------------------+ 
//|                                            DRAW_COLOR_ZIGZAG.mq5 | 
//|                        Copyright 2011, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "Copyright 2011, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00" 

#property description "Индикатор для демонстрации DRAW_COLOR_ZIGZAG" 
#property description "Рисует ломанную линию цветными отрезками, цвет зависит от номера дня недели" 
#property description "Цвет, толщина и стиль отрезков меняется случайным" 
#property description " образом через каждые N тиков" 

#property indicator_chart_window 
#property indicator_buffers 3 
#property indicator_plots   1 
//--- plot Color_Zigzag 
#property indicator_label1  "Color_Zigzag" 
#property indicator_type1   DRAW_COLOR_ZIGZAG 
//--- зададим 2 цвета для раскраски секций (они хранятся в специальном массиве) 
#property indicator_color1  clrRed,clrBlue 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  4 
//--- буферы значений концов отрезков 
double         Color_ZigzagBuffer1[];
double         Color_ZigzagBuffer2[];
//--- буфер индексов цвета для концов отрезков 
double         Color_ZigzagColors[];
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit()
  {
//--- значение 0 (пустое значение) не будет участвовать в отрисовке 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
//--- indicator buffers mapping 
   SetIndexBuffer(0,Color_ZigzagBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Color_ZigzagBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,Color_ZigzagColors,INDICATOR_COLOR_INDEX);
//--- инициализируем генератор случайных чисел 
   MathSrand(GetTickCount());
//--- 
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+ 
//| Custom indicator iteration function                              | 
//+------------------------------------------------------------------+ 
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[])
  {
   if(prev_calculated==0)
     {
      ArrayInitialize(Color_ZigzagBuffer1,0);
      ArrayInitialize(Color_ZigzagBuffer2,0);
      ArrayInitialize(Color_ZigzagColors,1);
     }
   bool in_bars=(rates_total-1)%2;
   bool index_color=MathRand()%2;
   if(in_bars)
     {
      Color_ZigzagBuffer1[rates_total-1]=high[rates_total-1];
      Color_ZigzagBuffer2[rates_total-1]=low[rates_total-1];
      Color_ZigzagColors[rates_total-1]=index_color;
     }
   else
     {
      Color_ZigzagBuffer1[rates_total-1]=low[rates_total-1];
      Color_ZigzagBuffer2[rates_total-1]=high[rates_total-1];
      Color_ZigzagColors[rates_total-1]=index_color;
     }
//--- return value of prev_calculated for next call 
   return(rates_total);
  }
//+------------------------------------------------------------------+
Файлы:
 
Viacheslav Kuptsov:

Количество цветов не играет никакой роли. 
Не работает стиль DRAW_COLOR_ZIGZAG на одном баре. Сейчас набросаю код.

Логи простая: движение вверх - красим синим, движение вниз красим красным. Но если движение образуется на одном баре, то предыдущее движение перекрашивается.

Не работает так, как вам хочется.

Это для остальных нужно объяснить - себе то вроде объяснили

 
Vladimir Karputov:

Я правильно понял проблему: вертикальный участок перекрашивает предыдущий отрезок?

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

 
Rashid Umarov:

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

Как только поймёт мы торжественно объявим: ошибки нет, так работало всегда!

 
Vladimir Karputov:

Я правильно понял проблему: вертикальный участок перекрашивает предыдущий отрезок?


 

Да, все верно.

Rashid Umarov:

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

Где это написано в документации? Там написано обратное. Смотрите стартовый пост.

 

Дожили. Админ с модератором на пару вместо помощи занимаются буквоедством и практически откровенно троллят форумчанина.

Цитата из справки:

Стиль DRAW_COLOR_ZIGZAG рисует отрезки разного цвета по значениям двух индикаторных буферов. Этот стиль является цветной версией стиля DRAW_ZIGZAG, то есть позволяет задавать каждому отрезку свой собственный цвет из заранее предопределенного набора цветов.

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

Вот что я предлагал тута

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

DRAW_COLOR_ZIGZAG в пределах одного бара.

Alexey Viktorov, 2018.06.07 08:57

Попробуйте сделать два ZZ в одном индикаторе. И в такой ситуации основному назначить clrNone а дополнительному нужный цвет.

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_plots   2
#property indicator_type1   DRAW_COLOR_ZIGZAG
#property indicator_type2   DRAW_COLOR_ZIGZAG
#property indicator_color1  clrRed, clrNONE
#property indicator_width1  2
#property indicator_color2  clrNONE, clrDodgerBlue
#property indicator_width2  2
double zz_l1[], zz_h1[], zz_i1[];
double zz_l2[], zz_h2[], zz_i2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0, zz_l1, INDICATOR_DATA);
    SetIndexBuffer(1, zz_h1, INDICATOR_DATA);
    SetIndexBuffer(2, zz_i1, INDICATOR_COLOR_INDEX);
    SetIndexBuffer(3, zz_l2, INDICATOR_DATA);
    SetIndexBuffer(4, zz_h2, INDICATOR_DATA);
    SetIndexBuffer(5, zz_i2, INDICATOR_COLOR_INDEX);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   if(prev_calculated == 0)
    {
      ArrayInitialize(zz_l1, EMPTY_VALUE);
      ArrayInitialize(zz_h1, EMPTY_VALUE);
      ArrayInitialize(zz_l2, EMPTY_VALUE);
      ArrayInitialize(zz_h2, EMPTY_VALUE);
    for(int i = 0; i < rates_total; i+=5)
     {
      int z = (int)fmod(i, 2);
      if(z > 0)
       {
        zz_l1[i] = low[i];
        zz_i1[i] = 0;
        zz_l2[i] = low[i];
        zz_i2[i] = 0;
       }
      else
        {
         zz_h1[i] = high[i];
         zz_i1[i] = 1;
         zz_h2[i] = high[i];
         zz_i2[i] = 1;
        }
     }
    }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Если отключить один  indicator_plots то будет прерывистая линия, так сказать кусками.

 
Viacheslav Kuptsov:

Да, все верно.

Где это написано в документации? Там написано обратное. Смотрите стартовый пост.

Тут немного другое - воспроизвел. Пока объяснить поведение не могу


Файлы:
 
Alexey Viktorov:

Вот что я предлагал тута


Если отключить один  indicator_plots то будет прерывистая линия, так сказать кусками.

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

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