MQL5 для дилетантов

 

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

Вопрос 1.

Почему, если, например, цвет линии индикатора не определён в

#property indicator_color1 Red

а задан в

int OnInit()
  {

   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Red);

   return(0);

  }

то цвет линии индикатора в терминале - silver (вероятно, по умолчанию).

Вопрос 2.

Аналогичная проблема и с DRAW_LINE

int OnInit()
  {

   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);

   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_DOT);

   return(0);

  }

линия рисуется все равно сплошной (solid).

Вопрос 3.

Есть ли у кого нибудь пример кода с использованием DRAW_SECTION.

Вопрос 4. 

Кто может пояснить ПРИНЦИП работы DRAW_FILLING

Не понятно по какому принципу выбираются уровни заливки.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Линии индикаторов - Документация по MQL5
 
SHerh   :

Вопрос 3.

Есть ли у кого нибудь пример кода с использованием DRAW_SECTION.

В Codebase выложен индикатор Zigzag.
 
SHerh   :

Вопрос 4. 

Кто может пояснить ПРИНЦИП работы DRAW_FILLING

Не понятно по какому принципу выбираются уровни заливки.

Не совсем понятен вопрос. Посмотрите пример в индикаторе Price Channel.
 

Почему возник вопрос ... DRAW_FILLING

Имеем ...в Price_Channel

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   2
#property indicator_type1   DRAW_FILLING
#property indicator_type2   DRAW_LINE
#property indicator_color1  DodgerBlue,Gray

#property indicator_color2  Blue

Шаг первый - имеем три буфера, две линии индикатора

Далее ... Задаем имена индикаторных буферов

//--- indicator buffers
double    ExtHighBuffer[];
double    ExtLowBuffer[];

double    ExtMiddBuffer[];

Ставим в соответствие индексы массивов

//--- indicator buffers mapping
   SetIndexBuffer(0,ExtHighBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowBuffer,INDICATOR_DATA);

   SetIndexBuffer(2,ExtMiddBuffer,INDICATOR_DATA);

Определяем метки линий индикатора (короткие имена)

   PlotIndexSetString(0,PLOT_LABEL,"Channel("+string(InpChannelPeriod)+") upper;Channel("+string(InpChannelPeriod)+") lower");

   PlotIndexSetString(1,PLOT_LABEL,"Median("+string(InpChannelPeriod)+")");

И вот тут не понятно ... так как для меня

   PlotIndexSetString(1,..) - это  соответствует ... (1),ExtLowBuffer 

А поскольку явно не указан тип линии для соответствующего массива (буфера)

   PlotIndexSetInteger(Х,PLOT_DRAW_TYPE,DRAW_LINE);

То по старинке. как в МТ4 ... я считаю, что

#property indicator_type2   DRAW_LINE ... это соответствует  ... (1),ExtLowBuffer 

Поэтому и запутался.

 
SHerh   :

И вот тут не понятно ... так как для меня

   PlotIndexSetString(1,..) - это  соответствует ... (1),ExtLowBuffer 

А поскольку явно не указан тип линии для соответствующего массива (буфера)

   PlotIndexSetInteger(Х,PLOT_DRAW_TYPE,DRAW_LINE);

То по старинке. как в МТ4 ... я считаю, что

#property indicator_type2   DRAW_LINE ... это соответствует  ... (1),ExtLowBuffer 

Функция PlotIndexSetString() адресуется не к индикаторному буферу, а к стилю отрисовки. Некоторые стили могут содержать до четырех и даже пяти индикаторных буферов, например, DRAW_COLOR_CANDLES (4 для задания Open, High, Low, Close и пятый для указания цвета свечи).
 
SHerh   :

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


Вопрос 1.

Почему, если, например, цвет линии индикатора не определён в

#property indicator_color1 Red

а задан в

int OnInit()
  {

   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Red);

   return(0);

  }

то цвет линии индикатора в терминале - silver (вероятно, по умолчанию).

Попробуйте задать свойство #property indicator_color1  Red

 

Круто. Если и было в Справочнике, сразу не уяснил. Спасибо. Буду "думкать" дальше.

 

Лучше предварительно указать количество цветов через функцию. Вот пример индикатора, строчка с указанием количества цветов выделена желтым цветом.

//+------------------------------------------------------------------+
//|                                                    ColorLine.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot ColorLine
#property indicator_label1  "ColorLine"
#property indicator_type1   DRAW_LINE
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3
//--- indicator buffers
double ExtColorLineBuffer[];
//---
int    ExtMAHandle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtColorLineBuffer,INDICATOR_DATA);
//--- get MA handle
   ExtMAHandle=iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE);
   PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,1);
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Red);

  }

//+------------------------------------------------------------------+
//| 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;
//--- check data
   int calculated=BarsCalculated(ExtMAHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtMAHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }

   //--- copy values of MA into indicator buffer ExtColorLineBuffer
   if(CopyBuffer(ExtMAHandle,0,0,rates_total,ExtColorLineBuffer)<=0) return(0);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Класс,конечно, что на вопросы дилетанта отвечает профи такого уровня, как Вы, Rosh ... спасибо.

Цвета, соответствие уровней в DRAW_FILLING (и аналогичные) ... кажется я понял ... сработал рефлекс с мт4 ... а надо было внимательнее прочитать справочник.

Но явно ответ, в этом случае, каким образом ставится

соответствие (индекса) ИНДИКАТОРНОГО БУФЕРА (номеру) ГРАФИЧЕСКОЙ СЕРИИ

не нашёл.
 
SHerh   :

Но явно ответ, в этом случае, каким образом ставится

соответствие (индекса) ИНДИКАТОРНОГО БУФЕРА (номеру) ГРАФИЧЕСКОЙ СЕРИИ

не нашёл.

Специального механизма произвольного связывания индексов буферов и графических построений нет. Связывание фиксированное и все зависит только от количества буферов необходимых для графического построения (это количество фиксированное для каждого способа отрисовки). Рассмотрим простой пример. Есть 2 построения: отрисовка баров (4 буфера) и разноцветной линии ( 2 буфера - для значений и для цвета). В этом случае индексы буферов с 0 по 3 включительно относятся к первому построению, а с 4 по 5 - ко второму (причем именно 5-ый для цвета).

 
antt   :

Специального механизма произвольного связывания индексов буферов и графических построений нет. Связывание фиксированное и все зависит только от количества буферов необходимых для графического построения (это количество фиксированное для каждого способа отрисовки). Рассмотрим простой пример. Есть 2 построения: отрисовка баров (4 буфера) и разноцветной линии ( 2 буфера - для значений и для цвета). В этом случае индексы буферов с 0 по 3 включительно относятся к первому построению, а с 4 по 5 - ко второму (причем именно 5 для цвета).



Несколько неожиданно, если честно.

Если правильно понимаю, то логика следующая:

1. имеем Индикаторный буфер

если требуется "рисование"

2. задаем Графическую серию

3. и определяем параметры (свойства, тип, ...) Графического построения для данной Графической серии

4. Параметры Графического построения связаны с необходимым количеством ИНДИКАТОРНЫХ БУФЕРОВ - если это так, то требуется последовательный ввод (связывание с индексом в SetIndexBuffer) БУФЕРОВ 

Идея как бы эта ? ... В общем ...что то типа многовекторной структуры данных ... толково придумано, если вдуматься.

Так, а где прочитать о кол-ве необходимых Буферов для того или иного построения?