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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 2 3 4 5 6 7 8 9 10

}

ObjectSetInteger (0,«Price», OBJPROP_COLOR, clrGreen);

ObjectSetInteger (0,«Price», OBJPROP_WIDTH,1);

ObjectSetString (0,«Price», OBJPROP_TOOLTIP, close [1]);

if (open [1]> close [1])

ObjectSetDouble (0,«Price», OBJPROP_PRICE, low [1]);

if (open [1] <close [1])

ObjectSetDouble (0,«Price», OBJPROP_PRICE, high [1]);

// – - return value of prev_calculated for next call

return (rates_total);

}

//+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +

void OnDeinit (const int reason) {

ObjectsDeleteAll (0, -1, -1);

}

В этом коде создается горизонтальный уровень, показывающий минимальную или максимальную цену предыдущего бара, в зависимости от того, является ли этот бар бычьим или медвежьим.

Пример использования OBJPROP_ANGLE:

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

{

// – —

ArraySetAsSeries (time, true);

ArraySetAsSeries (high, true);

ArraySetAsSeries (low, true);

ArraySetAsSeries (close, true);

ObjectDelete (0,«Line»);

ObjectDelete (0,«Price»);

if (!ObjectCreate (0,«Line», OBJ_VLINE,0,time [1],close [1]))

{

return (false);

}

ObjectSetInteger (0,«Line», OBJPROP_COLOR, clrBlue);

ObjectSetInteger (0,«Line», OBJPROP_WIDTH,1);

ObjectSetString (0,«Line», OBJPROP_TOOLTIP, close [1]);

if (!ObjectCreate (0,«Price», OBJ_TEXT,0,time [3],high [1]))

{

return (false);

}

ObjectSetString (0,«Price», OBJPROP_TEXT, close [1]);

ObjectSetInteger (0,«Price», OBJPROP_COLOR, clrBlack);

ObjectSetDouble (0,«Price», OBJPROP_ANGLE,90);

ObjectSetString (0,«Price», OBJPROP_TOOLTIP, close [1]);

// – - return value of prev_calculated for next call

return (rates_total);

}

//+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +

void OnDeinit (const int reason) {

ObjectsDeleteAll (0, -1, -1);

}

Этот код создает вертикальную линию с подписью цены закрытия предыдущего бара.

С помощью функции ObjectSetInteger устанавливаются такие свойства графического объекта, как цвет, стиль, размер и др.

С помощью функции ObjectSetString можно изменить имя объекта, при этом объект со старым именем будет удален и будет создан объект с новым именем, установить текст для таких объектов, как текст, кнопка, метка, поле ввода, событие, установить текст всплывающей подсказки для объекта, описание уровня для объектов, имеющих уровни, шрифт, имя BMP-файла для объекта «Графическая метка» и «Рисунок», символ для объекта «График».

Функция TextSetFont позволяет установить тип шрифта текста, его размер, стиль и угол наклона для объектов, содержащих текст.

Как уже было сказано, функция TextOut позволяет скомбинировать текст и изображение. Например, следующий код выводит текст в изображение, залитое одним цветом:

uint ExtImg [10000];

//+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +

//| Custom indicator initialization function |

//+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +

int OnInit ()

{

ObjectCreate (0,«Image», OBJ_BITMAP_LABEL,0,0,0);

ObjectSetString (0,«Image», OBJPROP_BMPFILE,»:: IMG»);

ArrayFill (ExtImg,0,10000,0xffffff);

TextOut («Text», 10,10,TA_LEFT|TA_TOP, ExtImg,100,100,0x000000,COLOR_FORMAT_XRGB_NOALPHA);

ResourceCreate (»:: IMG», ExtImg,100,100,0,0,0,COLOR_FORMAT_XRGB_NOALPHA);

ChartRedraw ();

// – —

return (INIT_SUCCEEDED);

}

Здесь ExtImg это пиксельный массив, представляющий изображение 100х100 пикселей.

Функция ObjectCreate создает объект «Графическая метка», а функция ObjectSetString устанавливает для этого объекта файл изображения с именем::IMG. По поводу знака «::» справочник говорит следующее:

Для использования своего ресурса в коде нужно перед именем ресурса добавлять специальный признак "::».

Функция ArrayFill заполняет пиксельный массив пикселями белого цвета.

Функция TextOut выводит в пиксельный массив слово «Text».

Функция ResourceCreate создает из пиксельного массива ресурс с именем::IMG.

В итоге на белом фоне отображается надпись «Text».

Также можно вывести текст на готовое изображение:

#resource "\Images\image.bmp»

uint ExtImg [10000];

//+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +

//| Custom indicator initialization function |

//+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +

int OnInit ()

{

ObjectCreate (0,«Image», OBJ_BITMAP_LABEL,0,0,0);

ObjectSetString (0,«Image», OBJPROP_BMPFILE,»:: IMG»);

uint width=100;

uint height=100;

ResourceReadImage("::Images\image.bmp», ExtImg, width, height);

TextOut («Text», 10,10,TA_LEFT|TA_TOP, ExtImg,100,100,0xffffff, COLOR_FORMAT_XRGB_NOALPHA);

ResourceCreate (»:: IMG», ExtImg,100,100,0,0,0,COLOR_FORMAT_XRGB_NOALPHA);

ChartRedraw ();

// – —

return (INIT_SUCCEEDED);

}

Здесь функция ResourceReadImage считывает существующее изображение из папки Images окна Navigator редактора MQL5 в пиксельный массив::IMG, связанный с объектом «Графическая метка», а функция TextOut выводит в пиксельный массив слово «Text».

То же самое можно проделать и с объектом «Рисунок»:

#resource "\Images\image.bmp»

uint ExtImg [10000];

//+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +

//| Custom indicator initialization function |

//+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +

int OnInit ()

{

// – —

return (INIT_SUCCEEDED);

}

//+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +

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

{

// – —

ArraySetAsSeries (time, true);

ArraySetAsSeries (high, true);

ArraySetAsSeries (low, true);

ArraySetAsSeries (close, true);

ObjectDelete (0,«Image»);

ObjectCreate (0,«Image», OBJ_BITMAP,0,time [1],close [1]);

ObjectSetString (0,«Image», OBJPROP_BMPFILE,»:: IMG»);

uint width=100;

uint height=100;

ResourceReadImage("::Images\image.bmp», ExtImg, width, height);

TextOut («Text», 10,10,TA_LEFT|TA_TOP, ExtImg,100,100,0xffffff, COLOR_FORMAT_XRGB_NOALPHA);

ResourceCreate (»:: IMG», ExtImg,100,100,0,0,0,COLOR_FORMAT_XRGB_NOALPHA);

ChartRedraw ();

// – - return value of prev_calculated for next call

return (rates_total);

}

//+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +

void OnDeinit (const int reason) {

ObjectsDeleteAll (0, -1, -1);

}

В качестве примера использования графических объектов, рассмотрим создание индикатора, который выводит в небольшое окно на графике символа тот же график, но с другим временным периодом.

Для этого используем графический объект OBJ_CHART.

В качестве входных параметров индикатора используем символ графика и его период:

#property indicator_chart_window

input string InpSymbol=«EURUSD»; // Символ

input ENUM_TIMEFRAMES InpPeriod=PERIOD_CURRENT; // Период

В функции OnInit () создадим графический объект График:

int OnInit ()

{

if (!ObjectCreate (0,«Chart», OBJ_CHART,0,0,0))

{

return (false);

}

По умолчанию точка привязки этого объекта – левый верхний угол графика.

Определим отступ точки привязки объекта, его размеры, символ и период графика, отображение шкалы времени, размер точки привязки, с помощью которой можно перемещать объект, отображение ценовой шкалы, режим перемещения мышкой, цвет рамки графика:

ObjectSetInteger (0,«Chart», OBJPROP_XDISTANCE,10);

ObjectSetInteger (0,«Chart», OBJPROP_YDISTANCE,20);

ObjectSetInteger (0,«Chart», OBJPROP_XSIZE,300);

ObjectSetInteger (0,«Chart», OBJPROP_YSIZE,200);

ObjectSetString (0,«Chart», OBJPROP_SYMBOL, InpSymbol);

ObjectSetInteger (0,«Chart», OBJPROP_PERIOD, InpPeriod);

ObjectSetInteger (0,«Chart», OBJPROP_DATE_SCALE, true);

ObjectSetInteger (0,«Chart», OBJPROP_WIDTH,1);

ObjectSetInteger (0,«Chart», OBJPROP_PRICE_SCALE, true);

ObjectSetInteger (0,«Chart», OBJPROP_SELECTABLE, true);

ObjectSetInteger (0,«Chart», OBJPROP_SELECTED, true);

ObjectSetInteger (0,«Chart», OBJPROP_COLOR, clrBlue);

С помощью свойства объектов OBJPROP_CHART_ID функции ObjectGetInteger получим идентификатор графика, используя который мы теперь можем применять функции работы с графиками (https://www.mql5.com/ru/docs/chart_operations) и свойства графиков (https://www.mql5.com/ru/docs/constants/chartconstants/enum_chart_property):

long chartId=ObjectGetInteger (0,«Chart», OBJPROP_CHART_ID);

Откроем наш график символа, к которому мы хотим присоединить индикатор, и нажав правой кнопкой мышки, выберем пункт в контекстном меню Шаблоны и Сохранить шаблон.

Теперь мы можем перенести на наш графический объект все настройки и индикаторы графика символа:

ChartApplyTemplate(chartId,"my.tpl»);

ChartRedraw (chartId);

// – —

return (INIT_SUCCEEDED);

}

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

Функция PlaySound

Функция PlaySound воспроизводит звуковой файл. Например, это можно делать при появлении сигнала индикатора для напоминания:

bool PlaySound (

string filename // имя WAV-файла

);

В качестве примера добавим звуковой сигнал в наш индикатор Impulse keeper при появлении первого сигнала на покупку или продажу.

Скачаем какой-нибудь WAV-сигнал из Интернета и поместим его файл в папку Sounds терминала.

Добавим код в индикатор Impulse keeper:

#property indicator_chart_window

#property indicator_buffers 4

double EMA34HBuffer [];

double EMA34LBuffer [];

double EMA125Buffer [];

double PSARBuffer [];

int EMA34HHandle;

int EMA34LHandle;

int EMA125Handle;

int PSARHandle;

int bars_calculated=0;

int countBuy=0

int countSell=0;

//+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +

//| Custom indicator initialization function |

//+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +

int OnInit ()

{

// – - indicator buffers mapping

SetIndexBuffer (0,EMA34HBuffer, INDICATOR_CALCULATIONS);

1 2 3 4 5 6 7 8 9 10
На этой странице вы можете бесплатно читать книгу Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5 - Тимур Машнин бесплатно.
Похожие на Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5 - Тимур Машнин книги

Оставить комментарий