Всего за 490 руб. Купить полную версию
Отличие Extern переменных от статических глобальных переменных проще всего продемонстрировать на индикаторе MACD.
Индикатор MACD имеет включаемый файл MovingAverages:
#include <MovingAverages.mqh>
расположенный в папке Include.
Если в файле MovingAverages и файле MACD одновременно объявить Extern-переменную:
extern int a=0;
то при компиляции обоих файлов все пройдет удачно, и переменную можно будет использовать.
Если же в файле MovingAverages и файле MACD одновременно объявить статическую глобальную переменную:
static int a=0;
то при компиляции обоих файлов возникнет ошибка:
Помимо команды #include полезной является также директива #define, которая позволяет делать подстановку выражения вместо идентификатора, например:
#define PI 3.14
Хэндл индикатора
Начнем с цитаты:
HANDLE идентифицирует объект, которым Вы можете манипулировать. Джеффри РИХТЕР «Windows для профессионалов».
Переменные типа handle представляют собой указатель на некоторую системную структуру или индекс в некоторой системной таблице, которая содержит адрес структуры.
Таким образом, получив хэндл некоторого индикатора, мы можем использовать его данные для построения своего индикатора.
Хэндл индикатора представляет собой переменную типа int и объявляется, как правило, после объявления массивов буферов индикатора, вместе с глобальными переменными, например в индикаторе MACD:
// - indicator buffers
double ExtMacdBuffer [];
double ExtSignalBuffer [];
double ExtFastMaBuffer [];
double ExtSlowMaBuffer [];
// - MA handles
int ExtFastMaHandle;
int ExtSlowMaHandle;
Здесь хэндлы индикаторов это указатели на индикатор скользящего среднего с разными периодами 12 и 26.
Объявив эти переменные, мы естественно реально ничего не получаем, так как объекта индикатора, данные которого мы хотим использовать, еще не существует.
Создать в глобальном кеше клиентского терминала копию соответствующего технического индикатора и получить ссылку на нее можно несколькими способами.
Если это стандартный индикатор, проще всего получить его хэндл можно с помощью стандартной функции для работы с техническими индикаторами.
Стандартная функция для индикатора скользящего среднего это:
int iMA (
string symbol, // имя символа
ENUM_TIMEFRAMES period, // период
int ma_period, // период усреднения
int ma_shift, // смещение индикатора по горизонтали
ENUM_MA_METHOD ma_method, // тип сглаживания
ENUM_APPLIED_PRICE applied_price // тип цены или handle
);
И в индикаторе MACD хэндлы индикатора скользящего среднего получаются с помощью вызова функции iMA в функции OnInit ():
// - get MA handles
ExtFastMaHandle=iMA (NULL,0,InpFastEMA,0,MODE_EMA, InpAppliedPrice);
ExtSlowMaHandle=iMA (NULL,0,InpSlowEMA,0,MODE_EMA, InpAppliedPrice);
где используются свойства индикатора:
// - input parameters
input int InpFastEMA=12; // Fast EMA period
input int InpSlowEMA=26; // Slow EMA period
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price
Предположим, что мы хотим использовать не стандартный, а пользовательский индикатор.
В папке Indicators/Examples редактора MQL5 есть нужный нам индикатор это файл Custom Moving Average.mq5.
Для вызова того индикатора воспользуемся функцией iCustom:
int iCustom (
string symbol, // имя символа
ENUM_TIMEFRAMES period, // период
string name // папка/имя_пользовательского индикатора
// список входных параметров индикатора
);
В функции OnInit () индикатора MACD изменим код:
// ExtFastMaHandle=iMA (NULL,0,InpFastEMA,0,MODE_EMA, InpAppliedPrice);
// ExtSlowMaHandle=iMA (NULL,0,InpSlowEMA,0,MODE_EMA, InpAppliedPrice);
ExtFastMaHandle=iCustom (NULL,0,«Examples\\Custom Moving Average», InpFastEMA,0,MODE_EMA, InpAppliedPrice);
ExtSlowMaHandle=iCustom (NULL,0,«Examples\\Custom Moving Average», InpSlowEMA,0,MODE_EMA, InpAppliedPrice);
После компиляции индикатора мы увидим, что его отображение никак не изменилось:
Еще один способ получить хэндл пользовательского индикатора, это использовать функцию IndicatorCreate:
int IndicatorCreate (
string symbol, // имя символа
ENUM_TIMEFRAMES period, // период
ENUM_INDICATOR indicator_type, // тип индикатора из перечисления ENUM_INDICATOR
int parameters_cnt=0, // количество параметров
const MqlParam& parameters_array [] =NULL, // массив параметров
);
В функции OnInit () индикатора MACD изменим код:
MqlParam params [];
ArrayResize (params,5);
params [0].type =TYPE_STRING;
params[0].string_value=«Examples\\Custom Moving Average»;
// - set ma_period
params [1].type =TYPE_INT;
params[1].integer_value=InpFastEMA;
// - set ma_shift
params [2].type =TYPE_INT;
params[2].integer_value=0;
// - set ma_method
params [3].type =TYPE_INT;
params[3].integer_value=MODE_EMA;
// - set applied_price
params [4].type =TYPE_INT;
params[4].integer_value=InpAppliedPrice;
// - initialization done
ExtFastMaHandle=IndicatorCreate (NULL, NULL, IND_CUSTOM,4,params);
params[1].integer_value=InpSlowEMA;
ExtSlowMaHandle=IndicatorCreate (NULL, NULL, IND_CUSTOM,4,params);
После компиляции индикатора мы опять увидим, что его отображение никак не изменилось.
После получения хэндла индикатора, если он используется в коде один раз, для экономии памяти неплохо использовать функцию IndicatorRelease: