Рисование квадрата или прямоугольника. Очень нужна помощь... - страница 6

 
evillive:

Ну и где он работает? Линии рисует на каждом баре, а не по ТЗ. Или на картинке выше ТФ=Н1?

Пересчитайте на бумажке, чему будут равны limit и i  на каждой итерации циклов.

Мой пример, показанный выше, так и не учтен, как  я понимаю.

Галочки-стрелки можно рисовать с помощью индикаторных буферов, как и линии, соединяющие тени свечей.

PERIOD_H;. Ниже периода Н4 рисуется всё хорошо.

i = 0;

Limit это внешняя переменная по умолчанию = 5;

extern int     barsToProcess = 5;        //--- Кол-во отображаемых периодов (линий) .

"Галочки-стрелки можно рисовать с помощью индикаторных буферов, как и линии, соединяющие тени свечей. "

 Я это понимаю так.

В буфер с индексом [Limit] присваивается значения хай из Массива.

double Buf_High[Limit] = mqlRates[0].high;

Как обвести на каждом баре, я понимаю. А вот, как на каждом Н4 баре нет. 

 
Alex_Profit:

PERIOD_H;. Ниже периода Н4 рисуется всё хорошо.

i = 0;

Limit это внешняя переменная по умолчанию = 5;

extern int     barsToProcess = 5;        //--- Кол-во отображаемых периодов (линий) .

"Галочки-стрелки можно рисовать с помощью индикаторных буферов, как и линии, соединяющие тени свечей. "

 Я это понимаю так.

В буфер с индексом [Limit] присваивается значения хай из Массива.

double Buf_High[Limit] = mqlRates[0].high;

Как обвести на каждом баре, я понимаю. А вот, как на каждом Н4 баре нет. 

Разберитесь как работают циклы, прежде, чем их использовать. i = 0 только первый раз, потом i++, до limit.

При первом запуске индикатора limit=Bars-counted_bars= Bars-0=Bars.

Цикл for при этом должен бы теоретически считать от 0 до кол-ва баров на графике. НО!!! Тут вмешивается второй цикл while, который пересчитывает как i, так и limit.

Зачем было так делать, кто научил, не пойму...

Пример на пальцах, задано: баров - 100,  barsToProcess = 5.

В первый запуск индикатора counted_bars=0, не считали ещё, значит  limit=100. Значит цикл for начале должен отработать 100 раз, от 0 до 99.

итерации цикла for:

1. i=0, limit=barsToProcess=5, while(i<5) - выполняется внутренний цикл с отрисовкой линий и галочек 5 раз, от 0 до 4, при этом каждый раз i++, по завершении while -  i=5, limit=5.

2. i=5=limit - цикл for завершился.

ВСЁ! Дальше индикатор ничего не делает до следующего тика. Приходит тик,  counted_bars=99,  limit=Bars-counted_bars= 100-99=1.

Цикл for выполнится  1 раз, цикл while - ни разу (так как условие if(limit>barsToProcess) не выполнено). И так до выгрузки индикатора с графика или смены ТФ, в общем до переинициализации индикатора.

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

 

Код переписал. С циклом вроде всё верно.

Остался вопрос отрисовки "буферной" линии.

#property strict 

#property indicator_chart_window


extern int     Total_bars = 5;        //--- Кол-во отображаемых Элементов в истории


    //---  Глобальные переменные    

string Name_VLine;     //--- Имя Элементов

string Name_CHECK;     //--- Имя Элементов


MqlRates    mqlRates[1]; //Структура для хранения информации 


#property indicator_buffers 1

#property indicator_type1   DRAW_LINE   // тип графического построения - линия 

#property indicator_color1  clrRed      // цвет линии 

#property indicator_style1  STYLE_SOLID // стиль линии 

#property indicator_width1  1           // толщина линии 


double Buff_High[];

 

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

int OnInit()

  {

     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[])

{

  

     SetIndexBuffer(0,Buff_High);     

     SetIndexStyle(0,DRAW_LINE);     

     SetIndexStyle(0,DRAW_SECTION);

     

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

int limit;                                //--- переменная  старт кол-во баров. Линии рисуем о по всем барам

int counted_bars = IndicatorCounted();     //--- перем counted_bars = функц.  Возвращает количество баров

   

if(counted_bars > 0) counted_bars --;      //--- последний посчитанный бар будет пересчитан 

  //--- основной цикл 

  limit = Bars - counted_bars;         

  for(int i = 0; i <= limit; i ++)

   {

     if(limit > Total_bars)              //--- Если кол-во баров на графике > Кол-ву выбранных элементов 

      {

       limit = Total_bars-1;              //--- тогда кол-во баров на графике = Кол-ву выбранных элементов

      }

      

   datetime t_Line = iTime(Symbol(),PERIOD_H4,i);         //--- В ПЕРЕМ t_Line Будет Присваиваться значение времени открытия бара

   CopyRates(_Symbol, PERIOD_H4, t_Line, 1, mqlRates);    //--- Структура для хранения информации 

         

   //+------------------------ Рисуем вертикальную линии -----------------------------------------------------+                 

   ObjectCreate (Name_VLine + " VLine" + DoubleToStr(i,0),OBJ_VLINE,0,t_Line,0);         //--- Создаём обьект вертикальную линию

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_STYLE,2);              //--- Со стилем

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_COLOR,DimGray);        //--- Со цветом  

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_WIDTH,0);              //--- С  толщиной

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_BACK,0);               //--- С типом отображения. Объект на заднем плане


   //--- кубики по хай (В место галочек нужно подставить кубики)

   ObjectCreate    (0,Name_CHECK + "H_CHECK" + DoubleToStr(i,0), OBJ_ARROW_CHECK, 0, t_Line, mqlRates[0].high, t_Line,mqlRates[0].high);

   ObjectSetInteger(0,Name_CHECK + "H_CHECK" + DoubleToStr(i,0), OBJPROP_COLOR, clrGreen); 

   

   //--- кубики по лоу (В место галочек нужно подставить кубики)

   ObjectCreate    (0,Name_CHECK + "L_CHECK" + DoubleToStr(i,0), OBJ_ARROW_CHECK, 0, t_Line, mqlRates[0].low, t_Line,mqlRates[0].low);

   ObjectSetInteger(0,Name_CHECK + "L_CHECK" + DoubleToStr(i,0), OBJPROP_COLOR, clrGreen); 


  // На ТФ Н4 линии рисуются по хайям,

  // При смене ТФ линия рисуется на растоянии параметра Total_bars. 

  

   //--- Заполнение буфера

   Buff_High[i] = mqlRates[0].high ;  

  

   }

    return(rates_total);

}

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


 
evillive:

Зачем было так делать, кто научил, не пойму...

Я находил подходящий индикатор и "разбирал его", до момента, пока останется тот фрагмент, который мне нужен. Далее собирал фрагменты кодов и получал примерно то, что нужно. Как то так.

"Я мотаю на ус" . 

 
Alex_Profit:

Код переписал. С циклом вроде всё верно.

Остался вопрос отрисовки "буферной" линии.

Для вставки кода есть кнопка SRC на верхней панели окна редактирования сообщения, вставляет код красиво и без пустых строк.

 Линию наверное придётся тоже объектами рисовать (трендовая), запоминать предыдущие время/цену в отдельных переменных и использовать как координаты второй точки.

Для замены галочки на другой символ - OBJ_ARROW и ARROW_CODE.

 
evillive:

Для вставки кода есть кнопка SRC на верхней панели окна редактирования сообщения, вставляет код красиво и без пустых строк.

 Линию наверное придётся тоже объектами рисовать (трендовая), запоминать предыдущие время/цену в отдельных переменных и использовать как координаты второй точки.

Для замены галочки на другой символ - OBJ_ARROW и ARROW_CODE.

А чем не нравится

DRAW_SECTION

1

Отрезки между непустыми значениями линии

 
AlexeyVik:

А чем не нравится

DRAW_SECTION

1

Отрезки между непустыми значениями линии

 

Я не знаю как её применить.

 
AlexeyVik:

А чем не нравится

DRAW_SECTION

1

Отрезки между непустыми значениями линии

evillive:

 Линию наверное придётся тоже объектами рисовать (трендовая), запоминать предыдущие время/цену в отдельных переменных и использовать как координаты второй точки.

Идея хорошая. Я попробую если получится.

По сути чем рисовать ризницы нет. Лишь бы работало как надо. 

 

Alex_Profit:

Я не знаю как её применить.

Просто в OnInit() вместо

   SetIndexStyle(0, DRAW_LINE);

написать

   SetIndexStyle(0, DRAW_SECTION);

 

Почему-то без изменений

 

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[])
{
  
     SetIndexBuffer(0,Buff_High);     
     //SetIndexStyle(0,DRAW_LINE);     
     SetIndexStyle(0,DRAW_SECTION);
Причина обращения: