Общие функции
Одной из самых простых и наиболее распространённых функций является функция Comment().
Функция Comment()
void Comment(...)
Функция выводит комментарий, определенный пользователем, в левый верхний угол окна
финансового инструмента. Параметры могут иметь любой тип. Количество параметров
не может превышать 64. Массивы нельзя передавать в функцию Comment(). Массивы должны
печататься поэлементно. Данные типа double выводятся с 4 десятичными цифрами после
точки. Для вывода чисел с большей точностью необходимо использовать функцию DoubleToStr().
Типы bool, datetime и color будут напечатаны как числа. Чтобы вывести данные типа
datetime в виде строки необходимо использовать функцию TimeToStr().
Параметры:
... - любые значения, разделенные запятыми.
Примером использования этой функции может служить простой эксперт
comment.mq4, отражающий информацию о
количестве ордеров.
int start()
{
int Orders=OrdersTotal();
if (Orders==0)
Comment("Ордеров нет");
else
Comment("В торговле имеется ",Orders," ордеров." );
return;
}
В начале программы с помощью функции OrdersTotal() вычисляется общее количество
ордеров. В случае, если переменная Orders (количество ордеров) равна 0, то исполняется
функция Comment() с параметром "Ордеров нет". Если же в торговле присутствует
хотя бы один ордер, то выполняется функция Comment() со списком параметров, перечисленных
через запятую. В данном случае используется 3 параметра, первый из которых - строковое
значение "В торговле имеется ", второй - целое число Orders и третий
- строковое значение " ордеров.". В результате исполнения эксперта при
каждом запуске на исполнение функции start() в левом верхнем углу окна финансового
инструмента будет отображаться одна из надписей. На Рис. 132 показано окно финансового
инструмента в ситуации, когда в торговле одновременно присутствует один ордер.
Рис. 132. Отображение текста в левом верхнем углу окна финансового инструмента
в результате исполнения Comment().
Для воспроизведения звуковых файлов используется функция PlaySound().
Функция PlaySound()
void PlaySound(string filename)
Функция воспроизводит звуковой файл. Файл должен быть расположен в каталоге каталог_терминала\sounds или его подкаталоге.
Параметры:
filename - путь к звуковому файлу.
Набор рекомендуемых звуковых файлов приведен в приложении Звуковые файлы.
В некоторых случаях программа может быть составлена так, чтобы поддерживать диалог
с пользователем. Для этой цели используется Функция MessageBox().
Функция MessageBox()
int MessageBox(string text=NULL, string caption=NULL, int flags=EMPTY)
Функция MessageBox создает и отображает диалоговое окно сообщений, а также управляет
им. Диалоговое окно сообщений содержит определенные в программе сообщение и заголовок,
любую комбинацию предопределенных значков и командных кнопок. Если функция успешно
выполняется, возвращаемое значение - одно из значений кодов возврата MessageBox().
Функцию нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются
в интерфейсном потоке и не должны его тормозить.
Параметры:
text - текст, содержащий сообщение для отображения;
caption - необязательный текст для отображения в заголовке окна сообщения. Если этот параметр
пустой, в заголовке окна будет отображено название эксперта;
flags - необязательные флаги, определяющие вид и поведение диалогового окна. Флаги могут
быть комбинацией флагов из следующих групп флагов (см. Коды возврата функции MessageBox).
Рассмотрим пример использования функции MessageBox().
|
Задача 31. Представить код эксперта, который за 5 минут до выхода важных новостей
открывает диалоговое окно, содержащее вопрос о закрытии всех ордеров. Если пользователь
нажимает кнопку Yes, то закрыть все ордера, если No, то не выполнять никаких действий.
|
Эксперт, поддерживающий диалог с пользователем (dialogue.mq4), может быть, например, таким:
#include <WinUser32.mqh>
extern double Time_News=15.30;
bool Question=false;
int start()
{
PlaySound("tick.wav");
double Time_cur=Hour()+ Minute()/100.0;
if (OrdersTotal()>0 && Question==false && Time_cur>=Time_News-0.05)
{
PlaySound("news.wav");
Question=true;
int ret=MessageBox("Время важных новостей. Закрыть все ордера?",
"Вопрос", MB_YESNO|MB_ICONQUESTION|MB_TOPMOST);
if(ret==IDYES)
Close_Orders();
}
return;
}
void Close_Orders()
{
Alert("Работает функция закрытия всех ордеров.");
return;
}
В блоке 1-2 в программу включён файл WinUser32.mqh, в котором определены коды возврата
функции MessageBox(). В этом блоке также задана внешняя переменная Time_News -
время выхода важных новостей. В течение всего периода исполнения эксперта вопрос
о закрытии ордеров должен быть задан пользователю всего один раз. Для того, чтобы
учитывать в эксперте был ли задан вопрос, объявлена переменная Question.
При каждом запуске на исполнение функции start() (блок 2-3) исполняется функция
PlaySound(). Воспроизводимый при этом звук tick.wav напоминает слабый щелчок, наилучшим
образом отражающий факт нового тика. Решение об использовании звуков в программе
программист принимает по своему выбору. В ряде случаев применение звуков оказывается
полезным. Например, по звуку тиков можно судить о факте исполнения эксперта. Другие
звуки могут соответствовать иным событиям, например, срабатыванию торгового критерия,
закрытию ордера и т.д.
Значение действительной переменной Time_cur соответствует текущему серверному времени.
В эксперте анализируются условия, при которых необходимо вывести диалоговое окно.
Если в торговле имеется один или более ордеров, диалоговое окно ранее не выводилось
и при этом серверное время отличается от времени важных новостей менее, чем на
5 минут, то в программе выполняются определённые действия. Прежде всего исполняется
функция PlaySound(), воспроизводимый звук привлекает пользователя обратить внимание
на экран. Флаг Question получает значение true (в следующий раз диалог не выводить).
В следующей строке исполняется MessageBox():
int ret=MessageBox("Время важных новостей. Закрыть все ордера?",
"Вопрос", MB_YESNO|MB_ICONQUESTION|MB_TOPMOST);
В данном случае на диалоговой панели будет отображено значение строковой константы
"Время важных новостей. Закрыть все ордера?", а значение "Вопрос"
будет отображено в верхней строке панели. Флаг MB_YESNO определяет наличие кнопок
- в данном случае кнопки ДА и кнопки НЕТ (см. Коды возврата функции MessageBox). Флаг MB_ICONQUESTION определяет иконку, отображаемую в левой части диалогового
окна (каждая операционная среда имеет свой набор иконок, на Рис. 133 показана иконка
из набора Widows XP). Флаг MB_TOPMOST наделяет диалоговое окно свойством "всегда
сверху", т.е. окно всегда будет находиться в области видимости, независимо
от того, какие программы исполняются в текущий момент на компьютере пользователя.
В результате исполнения функции MessageBox() с указанными параметрами на экран
выводится диалоговое окно:
Рис. 133. Диалоговое окно, выводимое в результате исполнения функции MessageBox().
В момент, когда диалоговое окно выведено на экран, исполнение программы приостанавливается
до того момента, пока пользователь нажмёт одну из клавиш в диалоговом окне. Как
только это произойдёт, управление будет передано в строку, следующую за вызовом
функции MessageBox(), в данном случае, в блок 3-4. Это свойство диалогового окна
удерживать управление является очень важным и его обязательно необходимо учитывать
при составлении программ. Например, если пользователь отлучился от компьютера, и
в этот период было выведено диалоговое окно, то в течение всего времени отсутствия
пользователя (пока не нажата одна из кнопок на диалоговом окне) программа будет
находиться в режиме ожидания ответа, и никакой другой код в этот период исполняться
не будет.
Обратите внимание, до вывода диалогового окна исполнение программы сопровождается
звуком тиков. В момент вывода диалогового окна воспроизводится другой звук. А в
период, пока диалоговое окно открыто и ожидается ответ пользователя, звуки не воспроизводятся,
что наглядно иллюстрирует факт удержания управления при открытом диалоговом окне.
После нажатия одной из кнопок исполнение программы продолжится, и звук тиков возобновится.
Если пользователь нажал кнопку ДА, то в блоке 3-4 будет вызвана функция Close_Orders(),
предназначенная для закрытия всех ордеров. В данном примере содержание этой функции
не рассматривается, а для обозначения факта исполнения этой функции исполняется
Alert ("Работает функция закрытия всех ордеров."). Если пользователь ответил
НЕТ, то функция закрытия ордеров не вызывается. В текущем сеансе исполнения эксперта
диалоговое окно больше выводиться не будет.
Общие функции
Функция |
Краткое описание |
Alert |
Отображает диалоговое окно, содержащие пользовательские данные. Параметры могут
быть любого типа. Количество параметров не может превышать 64. |
Comment |
Функция выводит комментарий, определенный пользователем, в левый верхний угол графика.
Параметры могут иметь любой тип. Количество параметров не может превышать 64. |
GetTickCount |
Функция GetTickCount() возвращает количество миллисекунд, прошедших с момента старта
системы. Счетчик ограничен разрешающей способностью системного таймера. Так как
время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней. |
MarketInfo |
Возвращает различную информацию о финансовых инструментах, перечисленных в окне
"Обзор рынка". Часть информации о текущем финансовом инструменте хранится
в предопределенных переменных (см. Идентификаторы функции MarketInfo()). |
MessageBox |
Функция MessageBox создает и отображает окно сообщений, а также управляет им. Окно
сообщений содержит определенные приложением сообщение и заголовок, любую комбинацию
предопределенных значков и командных кнопок. Если функция успешно выполняется,
возвращаемое значение - одно из значений кодов возврата MessageBox(). Функцию нельзя вызывать из пользовательских индикаторов, так как
индикаторы выполняются в интерфейсном потоке и не должны его тормозить |
PlaySound |
Функция воспроизводит звуковой файл. Файл должен быть расположен в каталоге каталог_терминала\sounds или его подкаталоге. |
Print |
Печатает некоторое сообщение в журнал экспертов. Параметры могут иметь любой тип.
Количество параметров не может превышать 64. |
SendFTP |
Посылает файл по адресу, указанному в окне настроек на закладке "Публикация".
В случае неудачи возвращает FALSE. Функция не работает в режиме тестирования. Из
пользовательских индикаторов также нельзя вызывать эту функцию. Отсылаемый файл
должен находиться в папке каталог_терминала\experts\files или ее подпапках. Отсылка не производится, если в настройках не указан адрес FTP
и/или пароль доступа. |
SendMail |
Посылает электронное письмо по адресу, указанному в окне настроек на закладке "Почта".
Отсылка может быть запрещена в настройках, также может быть не указан адрес электронной
почты. |
Sleep |
Функция задерживает выполнение текущего эксперта или скрипта на определенный интервал.
Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы
выполняются в интерфейсном потоке и не должны его тормозить.
В функцию встроена проверка состояния флага остановки эксперта каждую 0.1 секунды. |
Для получения подробного описания этих и других функций необходимо обратиться к
справочной документации на MQL4.community, сайте MetaQuotes Ltd. или к разделу "Справка" в редакторе MetaEditor.