Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5 - Страница 6
const void& array [], // массив по ссылке
bool flag // true означает обратный порядок индексации
);
При применении функции ArraySetAsSeries физическое хранение данных массива не меняется, в памяти массив, как и прежде, хранится в порядке от первого значения до последнего значения.
Функция ArraySetAsSeries меняет лишь программный доступ к элементам массива – от последнего элемента массива к первому элементу массива.
В функции OnInit () также может осуществляться проверка входных параметров на корректность, так как пользователь может ввести все, что угодно.
При этом значение входного параметра переназначается с помощью глобальной переменной, и далее в расчетах используется уже значение глобальной переменной.
Например, для индикатора ADX это выглядит так:
// – - check for input parameters
if (InpPeriodADX> =100 || InpPeriodADX <=0)
{
ExtADXPeriod=14;
printf («Incorrect value for input variable Period_ADX=%d. Indicator will use value=%d for calculations.», InpPeriodADX, ExtADXPeriod);
}
else ExtADXPeriod=InpPeriodADX;
здесь ExtADXPeriod – глобальная переменная, а InpPeriodADX – входной параметр.
При использовании хэндлов индикатора, необходимо указывать символ (финансовый инструмент) для которого индикатор будет создаваться.
При этом такой символ может определяться пользователем.
В функции OnInit () также полезно проверить этот входной параметр на корректность.
Пусть определен входной параметр:
input string symbol=" "; // символ
Объявим глобальную переменную:
string name=symbol;
В функции OnInit () произведем проверку:
// – - удалим пробелы слева и справа
StringTrimRight (name);
StringTrimLeft (name);
// – - если после этого длина строки name нулевая
if (StringLen (name) ==0)
{
// – - возьмем символ с графика, на котором запущен индикатор
name=_Symbol;
}
Программная установка свойств индикатора осуществляется с помощью функций IndicatorSetDouble, IndicatorSetInteger, IndicatorSetString, PlotIndexSetDouble, PlotIndexSetInteger, PlotIndexSetString.
Функция IndicatorSetDouble позволяет программным способом определять такие свойства индикатора как indicator_minimum, indicator_maximum и indicator_levelN, например:
IndicatorSetDouble (INDICATOR_LEVELVALUE, 0, 50)
является аналогом:
property indicator_level1 50
Функция IndicatorSetInteger позволяет программным способом определять такие свойства индикатора как indicator_height, indicator_levelcolor, indicator_levelwidth, indicator_levelstyle.
При этом для уровней необходимо определить их количество, используя функцию IndicatorSetInteger. Например, для индикатора RSI это выглядит следующим образом.
Свойства индикатора:
//#property indicator_level1 30
//#property indicator_level2 70
//#property indicator_levelcolor Red
//#property indicator_levelstyle STYLE_SOLID
//#property indicator_levelwidth 1
Заменяем на код:
IndicatorSetInteger (INDICATOR_LEVELS,2);
IndicatorSetDouble (INDICATOR_LEVELVALUE,0,30);
IndicatorSetDouble (INDICATOR_LEVELVALUE,1,70);
IndicatorSetInteger (INDICATOR_LEVELCOLOR,0,0xff0);
IndicatorSetInteger (INDICATOR_LEVELCOLOR,1,0xff0);
IndicatorSetInteger (INDICATOR_LEVELSTYLE,0,STYLE_SOLID);
IndicatorSetInteger (INDICATOR_LEVELSTYLE,1,STYLE_SOLID);
IndicatorSetInteger (INDICATOR_LEVELWIDTH,0,1);
IndicatorSetInteger (INDICATOR_LEVELWIDTH,1,1);
Функция IndicatorSetInteger также позволяет определить точность индикатора, например:
IndicatorSetInteger (INDICATOR_DIGITS,2);
В результате будут отображаться только два знака после запятой значения индикатора.
Для функции IndicatorSetString нет соответствующих ей свойств индикатора.
С помощью функции IndicatorSetString можно определить короткое наименование индикатора, например для индикатора MACD:
IndicatorSetString (INDICATOR_SHORTNAME,«MACD (»+string (InpFastEMA) +»,»+string (InpSlowEMA) +»,»+string (InpSignalSMA) +»)»);
Соответственно имя индикатора будет отображаться в окне индикатора как:
Кроме того, функция IndicatorSetString позволяет установить подписи к уровням индикатора, например для индикатора RSI:
IndicatorSetString (INDICATOR_LEVELTEXT, 0,«Oversold»);
IndicatorSetString (INDICATOR_LEVELTEXT, 1,«Overbought»)
С помощью функции PlotIndexSetDouble определяют, какое значение буфера индикатора является пустым и не участвует в отрисовке диаграммы индикатора.
Диаграмма индикатора рисуется от одного непустого значения до другого непустого значения индикаторного буфера, пустые значения пропускаются. Чтобы указать, какое значение следует считать «пустым», необходимо определить это значение в свойстве PLOT_EMPTY_VALUE. Например, если индикатор должен рисоваться по ненулевым значениям, то нужно задать нулевое значение в качестве пустого значения буфера индикатора:
PlotIndexSetDouble (индекс_построения, PLOT_EMPTY_VALUE,0);
Функция PlotIndexSetInteger позволяет программным способом, динамически, задавать такие свойства диаграммы индикатора, как код стрелки для стиля DRAW_ARROW, смещение стрелок по вертикали для стиля DRAW_ARROW, количество начальных баров без отрисовки и значений в DataWindow, тип графического построения, признак отображения значений построения в окне DataWindow, сдвиг графического построения индикатора по оси времени в барах, стиль линии отрисовки, толщина линии отрисовки, количество цветов, индекс буфера, содержащего цвет отрисовки.
Давайте разберем каждое из этих свойств по порядку на примере индикатора Custom Moving Average.
Изменим свойство indicator_type1 индикатора Custom Moving Average:
#property indicator_type1 DRAW_ARROW
В функции OnInit () добавим вызов функции PlotIndexSetInteger, определяя различный код стрелки для стиля DRAW_ARROW:
PlotIndexSetInteger (0,PLOT_ARROW,2);
PlotIndexSetInteger (0,PLOT_ARROW,3);
PlotIndexSetInteger (0,PLOT_ARROW,4);
PlotIndexSetInteger (0,PLOT_ARROW,5);
PlotIndexSetInteger (0,PLOT_ARROW,6);
PlotIndexSetInteger (0,PLOT_ARROW,7);
PlotIndexSetInteger (0,PLOT_ARROW,8);
PlotIndexSetInteger (0,PLOT_ARROW,11);