Тимур Сергеевич Машнин - Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5 стр 6.

Книгу можно купить на ЛитРес.
Всего за 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:

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке

Скачать книгу

Если нет возможности читать онлайн, скачайте книгу файлом для электронной книжки и читайте офлайн.

fb2.zip txt txt.zip rtf.zip a4.pdf a6.pdf mobi.prc epub ios.epub fb3