Вертикальная линия.

 
Здравствуйте! Начал делать индикатор, который будет отрисовать линий, между двумя пунктами по времени и цене, способ отрисовки лини примерна такой:
for(int w=limit;w<rates_total;w++)
 SupportBuffer[w]=low[s1]+speeds*(w-s1);
Все хорошо, но иногда время пунктов может быть и в одной свече, получается вертикальная линия. Я так понимаю SupportBuffer[w] не получится сделать вертикальным?
 
Nauris Zukas:
Здравствуйте! Начал делать индикатор, который будет отрисовать линий, между двумя пунктами по времени и цене, способ отрисовки лини примерна такой:
Все хорошо, но иногда время пунктов может быть и в одной свече, получается вертикальная линия. Я так понимаю SupportBuffer[w] не получится сделать вертикальным?

Если вместо линии использовать зигзаг, то получится.

 
Alexey Viktorov:

Если вместо линии использовать зигзаг, то получится.

Спасибо, попробую разобрать ZigZag и понять принцип отрисовки лини.

 
Alexey Viktorov:

Если вместо линии использовать зигзаг, то получится.

Сам ZigZag оказался довольно комплицированым, так просто разобрать не получилось. Но я подготовил простой пример... Можете добавить функцию, где на 3 баре от последнего бара будет линия между High и Low по вашему совету зигзаг? Мне бы понять принцип, дальше уже сам я смогу развивать.

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Support
#property indicator_label1  "Line"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3

//--- indicator buffers
double         LineTest[];
double         HighMapBuffer[];     // highs
double         LowMapBuffer[];      // lows
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,LineTest,INDICATOR_DATA);
   SetIndexBuffer(1,HighMapBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,LowMapBuffer,INDICATOR_CALCULATIONS);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---
   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[])
  {
//---
   int limit=prev_calculated;

   for(int i2=limit;i2<rates_total;i2++) // New bar recalculate
     {
      if(limit<rates_total-1)continue; // New bar recalculate
      for(int i=0;i<rates_total;i++)
        {
         //if(i<rates_total-3 && i>rates_total-15) // H Line 3-15 bar
         //   LineTest[i]=high[rates_total-2]; // Price
         //else LineTest[i]=EMPTY_VALUE; 
         
         HighMapBuffer[i]=high[rates_total-3];
         LowMapBuffer[i]=low[rates_total-3];
         LineTest[i]=                    // ???
         

        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Nauris Zukas:

Сам ZigZag оказался довольно комплицированым, так просто разобрать не получилось. Но я подготовил простой пример... Можете добавить функцию, где на 3 баре от последнего бара будет линия между High и Low по вашему совету зигзаг? Мне бы понять принцип, дальше уже сам я смогу развивать.

https://www.mql5.com/ru/docs/customind/indicators_examples/draw_zigzag

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_ZIGZAG
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_ZIGZAG
  • www.mql5.com
//|                                                  DRAW_ZIGZAG.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Custom indicator initialization function                         |...
 


Спасибо, здесь уже какое-то описание и окозалос это стиль а не индикатор :), попробую разобраться.

 
Есть идеи почему в OnCalculate после запуска терминала rates_total: на первом тике 372158, а потом уже нормально rates_total: 10001 ?
 

Вертикальная линий получилось сделать, но я не пойму, как убрать связующую линию между вертикальным линиям. Может кто-то поправить мой пример чтобы связующая линия пропала?

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ZigZag
#property indicator_label1  "ZigZag"
#property indicator_type1   DRAW_ZIGZAG
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  10

//--- indicator buffers
double         ZigZagBuffer1[];
double         ZigZagBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA);

   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[])
  {
   int limit=prev_calculated;
   if(prev_calculated==0)limit=rates_total-1;

   for(int i2=limit;i2<rates_total;i2++) // recalculate on new bar
     {

      for(int i=0;i<rates_total;i++)
        {
         if(i==rates_total-3 || i==rates_total-15) // should be VLine on 3th and 15th bar!
           {
            ZigZagBuffer1[i]=high[i];
           }
         else
           {
            ZigZagBuffer1[i]=EMPTY_VALUE;
           }
                      
         if(i==rates_total-3 || i==rates_total-15) // should be VLine on 3th and 15th bar !
           {
            ZigZagBuffer2[i]=low[i];
           }
         else
           {
            ZigZagBuffer2[i]=EMPTY_VALUE;
           }           
           
         if(ZigZagBuffer1[i]!=EMPTY_VALUE )Print(" ZigZagBuffer1[",i,"]: ",ZigZagBuffer1[i]);
         if(ZigZagBuffer2[i]!=EMPTY_VALUE )Print(" ZigZagBuffer2[",i,"]: ",ZigZagBuffer2[i]);

        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Nauris Zukas:

Вертикальная линий получилось сделать, но я не пойму, как убрать связующую линию между вертикальным линиям. Может кто-то поправить мой пример чтобы связующая линия пропала?

Ну, тогда я был неправ. Не понял цель...

В этом случае нужно, да и проще, использовать графическое построение DRAW_HISTOGRAM2

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_HISTOGRAM2
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_HISTOGRAM2
  • www.mql5.com
//|                                              DRAW_HISTOGRAM2.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Custom indicator initialization function                         |...
 
Alexey Viktorov:

Ну, тогда я был неправ. Не понял цель...

В этом случае нужно, да и проще, использовать графическое построение DRAW_HISTOGRAM2

Спасибо, попробую!

Еще вопрос, DRAW_HISTOGRAM2 рисует только вертикально или сможет тоже наклонно (между двумя барамы)?
 
Nauris Zukas:

Спасибо, попробую!

Еще вопрос, DRAW_HISTOGRAM2 рисует только вертикально или сможет тоже наклонно (между двумя барамы)?

Вы уж определитесь как-то что вам надо...

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

Да и вообще не помешает прочесть весь раздел документации о графических построениях. Будет хоть какое-то представление что можно сделать...

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