Русский

Учебник по MQL4  Стандартные функции  Общие функции

Общие функции


Одной из самых простых и наиболее распространённых функций является функция Comment().

Функция Comment()

void Comment(...)

Функция выводит комментарий, определенный пользователем, в левый верхний угол окна финансового инструмента. Параметры могут иметь любой тип. Количество параметров не может превышать 64. Массивы нельзя передавать в функцию Comment(). Массивы должны печататься поэлементно. Данные типа double выводятся с 4 десятичными цифрами после точки. Для вывода чисел с большей точностью необходимо использовать функцию DoubleToStr(). Типы bool, datetime и color будут напечатаны как числа. Чтобы вывести данные типа datetime в виде строки необходимо использовать функцию TimeToStr().

Параметры:
... - любые значения, разделенные запятыми.

Примером использования этой функции может служить простой эксперт comment.mq4, отражающий информацию о количестве ордеров.

//--------------------------------------------------------------------
// comment.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start() // Спец. функция start
{
int Orders=OrdersTotal(); // Количество ордеров
if (Orders==0) // Если кол.орд равно 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), может быть, например, таким:

//--------------------------------------------------------------------
// dialogue.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
#include <WinUser32.mqh>               // Нужно для MessageBox
extern double Time_News=15.30;         // Время важных новостей
bool Question=false;                   // Флажок (вопрос ещё не задан)
//--------------------------------------------------------------- 2 --
int start()                            // Спец. функция start
  {
   PlaySound("tick.wav");              // На каждом тике
   double Time_cur=Hour()+ Minute()/100.0;// Текущее время (double)
   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); // Диалог. окно
      //--------------------------------------------------------- 3 --
      if(ret==IDYES)                   // Если получен ответ ДА
         Close_Orders();               // То закрываем все ордера
     }
   return;                             // Выход
  }
//--------------------------------------------------------------- 4 --
void Close_Orders()                    // Польз. ф-ия закрытия ордеров
  {
   Alert("Работает функция закрытия всех ордеров.");// Для иллюстрации
   return;                             // Выход
  }
//--------------------------------------------------------------- 5 --

В блоке 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.